SCIP Doxygen Documentation
Loading...
Searching...
No Matches
reader_cip.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-2026 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 reader_cip.c
26 * @ingroup DEFPLUGINS_READER
27 * @brief CIP file reader
28 * @author Stefan Heinz
29 * @author Marc Pfetsch
30 * @author Michael Winkler
31 *
32 */
33
34/*---+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8----+----9----+----0----+----1----+----2*/
35
37#include "scip/rational.h"
38#include "scip/cons_linear.h"
40#include "scip/pub_fileio.h"
41#include "scip/pub_message.h"
42#include "scip/pub_misc.h"
43#include "scip/pub_reader.h"
44#include "scip/pub_var.h"
45#include "scip/reader_cip.h"
46#include "scip/scip_exact.h"
47#include "scip/scip_cons.h"
48#include "scip/scip_mem.h"
49#include "scip/scip_message.h"
50#include "scip/scip_numerics.h"
51#include "scip/scip_param.h"
52#include "scip/scip_prob.h"
53#include "scip/scip_reader.h"
54#include "scip/scip_var.h"
55
56
57#define READER_NAME "cipreader"
58#define READER_DESC "file reader for CIP (Constraint Integer Program) format"
59#define READER_EXTENSION "cip"
60
61#define DEFAULT_CIP_WRITEFIXEDVARS TRUE /**< Should fixed and aggregated variables be written when writing? */
62
63
64/** CIP reading data */
65struct SCIP_ReaderData
66{
67 SCIP_Bool writefixedvars; /**< Should fixed and aggregated variables be written when writing? */
68};
69
70
71/** Section of the in CIP files */
73{
74 CIP_START, /**< start tag */
75 CIP_STATISTIC, /**< statistics section */
76 CIP_OBJECTIVE, /**< objective */
77 CIP_VARS, /**< list of (free) variables */
78 CIP_FIXEDVARS, /**< list of fixed variables */
79 CIP_CONSTRAINTS, /**< constraints */
80 CIP_END /**< end of file tag */
81};
82typedef enum CipSection CIPSECTION; /**< Section of the in CIP files */
83
84
85/*
86 * Data structures
87 */
88
89/** CIP reading data */
90struct CipInput
91{
92 SCIP_FILE* file; /**< input file */
93 char* strbuf; /**< string buffer for input lines */
94 int len; /**< length of strbuf */
95 int readingsize; /**< size of block in which len is increased if necessary */
96 int linenumber; /**< number of line in input file */
97 CIPSECTION section; /**< current section */
98 SCIP_Bool haserror; /**< some error occurred */
99 SCIP_Bool endfile; /**< we have reached the end of the file */
100 SCIP_Real objoffset; /**< real objective offset */
101 SCIP_Real objscale; /**< real objective scale */
102 SCIP_RATIONAL* objoffsetexact; /**< exact objective offset */
103 SCIP_RATIONAL* objscaleexact; /**< exact objective scale */
104};
105typedef struct CipInput CIPINPUT; /**< CIP reading data */
106
107
108/*
109 * Local methods for reading/parsing
110 */
111
112/** get next input line; this are all characters until the next semicolon */
113static
115 SCIP* scip, /**< SCIP data structure */
116 CIPINPUT* cipinput /**< CIP parsing data */
117 )
118{
119 char* endline;
120 char* endcharacter;
121 char* windowsendlinechar;
122
123 assert(cipinput != NULL);
124
125 /* read next line */
126 cipinput->endfile = (SCIPfgets(cipinput->strbuf, cipinput->len, cipinput->file) == NULL);
127
128 if( cipinput->endfile )
129 {
130 /* clear the line for safety reason */
131 BMSclearMemoryArray(cipinput->strbuf, cipinput->len);
132 return SCIP_OKAY;
133 }
134
135 cipinput->linenumber++;
136 endline = strchr(cipinput->strbuf, '\n');
137 endcharacter = strchr(cipinput->strbuf, ';');
138
139 while( endline == NULL || (endcharacter == NULL && cipinput->section == CIP_CONSTRAINTS && strncmp(cipinput->strbuf, "END", 3) != 0 ) )
140 {
141 int pos;
142
143 /* we refill the buffer from the '\n' character */
144 if( endline == NULL )
145 pos = cipinput->len - 1;
146 else
147 pos = (int) (endline - cipinput->strbuf);
148
149 /* don't erase the '\n' from all buffers for constraints */
150 if( endline != NULL && cipinput->section == CIP_CONSTRAINTS )
151 pos++;
152
153 /* if necessary reallocate memory */
154 if( pos + cipinput->readingsize >= cipinput->len )
155 {
156 cipinput->len = SCIPcalcMemGrowSize(scip, pos + cipinput->readingsize);
157 SCIP_CALL( SCIPreallocBufferArray(scip, &(cipinput->strbuf), cipinput->len) );
158 }
159
160 /* read next line */
161 cipinput->endfile = (SCIPfgets(&(cipinput->strbuf[pos]), cipinput->len - pos, cipinput->file) == NULL);
162
163 if( cipinput->endfile )
164 {
165 /* clear the line for safety reason */
166 BMSclearMemoryArray(cipinput->strbuf, cipinput->len);
167 return SCIP_OKAY;
168 }
169
170 cipinput->linenumber++;
171 endline = strrchr(&cipinput->strbuf[pos], '\n');
172 endcharacter = strchr(&cipinput->strbuf[pos], ';');
173 }
174 assert(endline != NULL);
175
176 /*SCIPdebugMsg(scip, "read line: %s\n", cipinput->strbuf);*/
177
178 /* check for windows "carriage return" endline character */
179 windowsendlinechar = strrchr(cipinput->strbuf, '\r');
180 if( windowsendlinechar != NULL && windowsendlinechar + 1 == endline )
181 --endline;
182 else
183 /* if the assert should not hold we found a windows "carriage return" which was not at the end of the line */
184 assert(windowsendlinechar == NULL);
185
186 if( cipinput->section == CIP_CONSTRAINTS && endcharacter != NULL && endline - endcharacter != 1 )
187 {
188 SCIPerrorMessage("Constraint line has to end with ';\\n' (line: %d).\n", cipinput->linenumber);
189 cipinput->haserror = TRUE;
190 return SCIP_OKAY; /* return error at hightest level */
191 }
192
193 *endline = '\0';
194
195 return SCIP_OKAY;
196}
197
198/** read the problem name out of the statistics */
199static
201 SCIP* scip, /**< SCIP data structure */
202 CIPINPUT* cipinput /**< CIP parsing data */
203 )
204{
205 char* buf;
206
207 assert(scip != NULL);
208
209 buf = cipinput->strbuf;
210
211 if( strncmp(buf, "STATISTICS", 9) == 0 )
212 {
213 cipinput->section = CIP_STATISTIC;
214 return;
215 }
216
217 if( strncmp(buf, "VARIABLES", 8) == 0 || strncmp(buf, "FIXED", 5) == 0 || strncmp(buf, "CONSTRAINTS", 11) == 0 || strncmp(buf, "OBJECTIVE", 9) == 0 )
218 {
219 SCIPerrorMessage("Syntax Error: File has to start with 'STATISTICS' section.\n");
220 cipinput->haserror = TRUE;
221 }
222}
223
224
225/** read the problem name out of the statistics */
226static
228 SCIP* scip, /**< SCIP data structure */
229 CIPINPUT* cipinput /**< CIP parsing data */
230 )
231{
232 char* buf;
233
234 buf = cipinput->strbuf;
235
236 if( strncmp(buf, "OBJECTIVE", 9) == 0 )
237 {
238 cipinput->section = CIP_OBJECTIVE;
239 return SCIP_OKAY;
240 }
241
242 SCIPdebugMsg(scip, "parse statistics\n");
243
244 if( strncmp(buf, " Problem name", 14) == 0 )
245 {
246 char* name;
247 char* s;
248
249 name = strchr(buf, ':');
250
251 if( name == NULL )
252 {
253 SCIPwarningMessage(scip, "did not find problem name (line: %d):\n%s\n", cipinput->linenumber, cipinput->strbuf);
254 return SCIP_OKAY; /* no error, might work with empty problem name */
255 }
256
257 /* skip ':' */
258 ++name;
259
260 /* make sure that we terminate the string at comments ('#') or newline ('\r', '\n')*/
261 if( NULL != (s = strpbrk(name, "#\r\n")) )
262 *s = '\0';
263
264 /* remove white space (tabs, ' ') in front of the name */
265 SCIP_CALL( SCIPskipSpace(&name) );
266
267 /* set problem name */
269
270 SCIPdebugMsg(scip, "problem name <%s>\n", name);
271 }
272
273 return SCIP_OKAY;
274}
275
276/** read objective sense, offset, and scale */
277static
279 SCIP* scip, /**< SCIP data structure */
280 CIPINPUT* cipinput /**< CIP parsing data */
281 )
282{
283 SCIP_Bool success;
284 char* buf;
285 char* name;
286
287 buf = cipinput->strbuf;
288
289 if( strncmp(buf, "VARIABLES", 8) == 0 )
290 cipinput->section = CIP_VARS;
291 else if( strncmp(buf, "FIXED", 5) == 0 )
292 cipinput->section = CIP_FIXEDVARS;
293 else if( strncmp(buf, "CONSTRAINTS", 11) == 0 )
294 cipinput->section = CIP_CONSTRAINTS;
295 else if( strncmp(buf, "END", 3) == 0 )
296 cipinput->section = CIP_END;
297
298 if( cipinput->section != CIP_OBJECTIVE )
299 return SCIP_OKAY;
300
301 SCIPdebugMsg(scip, "parse objective information\n");
302
303 /* remove white space */
304 SCIP_CALL( SCIPskipSpace(&buf) );
305
306 if( SCIPstrncasecmp(buf, "Sense", 5) == 0 )
307 {
308 SCIP_OBJSENSE objsense;
309
310 name = strchr(buf, ':');
311
312 if( name == NULL )
313 {
314 SCIPwarningMessage(scip, "did not find objective sense (line: %d):\n%s\n", cipinput->linenumber, cipinput->strbuf);
315 return SCIP_OKAY; /* no error - might work with default */
316 }
317
318 /* skip ':' */
319 ++name;
320
321 /* remove white space in front of the name */
322 SCIP_CALL( SCIPskipSpace(&name) );
323
324 if( SCIPstrncasecmp(name, "min", 3) == 0 )
325 objsense = SCIP_OBJSENSE_MINIMIZE;
326 else if( SCIPstrncasecmp(name, "max", 3) == 0 )
327 objsense = SCIP_OBJSENSE_MAXIMIZE;
328 else
329 {
330 SCIPwarningMessage(scip, "unknown objective sense '%s' (line: %d):\n%s\n", name, cipinput->linenumber, cipinput->strbuf);
331 return SCIP_OKAY; /* no error - might work with default */
332 }
333
334 /* set problem name */
335 SCIP_CALL( SCIPsetObjsense(scip, objsense) );
336 SCIPdebugMsg(scip, "objective sense <%s>\n", objsense == SCIP_OBJSENSE_MINIMIZE ? "minimize" : "maximize");
337 }
338 else if( SCIPstrncasecmp(buf, "Offset", 6) == 0 )
339 {
340 char* endptr;
341
342 name = strchr(buf, ':');
343
344 if( name == NULL )
345 {
346 SCIPwarningMessage(scip, "did not find offset (line: %d)\n", cipinput->linenumber);
347 return SCIP_OKAY;
348 }
349
350 /* skip ':' */
351 ++name;
352
353 /* read exact offset */
354 if( cipinput->objoffsetexact != NULL )
355 {
356 success = SCIPparseRational(scip, name, cipinput->objoffsetexact, &endptr);
357
358 if( success )
359 SCIPrationalDebugMessage("read exact objoffset %q\n", cipinput->objoffsetexact);
360 else
361 SCIPrationalSetReal(cipinput->objoffsetexact, 0.0);
362 }
363 /* read real offset */
364 else
365 {
366 success = SCIPparseReal(scip, name, &cipinput->objoffset, &endptr);
367
368 if( success )
369 SCIPdebugMsg(scip, "read real objoffset %g\n", cipinput->objoffset);
370 else
371 cipinput->objoffset = 0.0;
372 }
373
374 if( !success )
375 {
376 SCIPwarningMessage(scip, "could not parse offset (line: %d)\n%s\n", cipinput->linenumber, cipinput->strbuf);
377 return SCIP_OKAY;
378 }
379 }
380 else if( SCIPstrncasecmp(buf, "Scale", 5) == 0 )
381 {
382 char* endptr;
383
384 name = strchr(buf, ':');
385
386 if( name == NULL )
387 {
388 SCIPwarningMessage(scip, "did not find scale (line: %d)\n", cipinput->linenumber);
389 return SCIP_OKAY;
390 }
391
392 /* skip ':' */
393 ++name;
394
395 /* read exact scale */
396 if( cipinput->objscaleexact != NULL )
397 {
398 success = SCIPparseRational(scip, name, cipinput->objscaleexact, &endptr);
399
400 if( success )
401 SCIPrationalDebugMessage("read exact objscale %q\n", cipinput->objscaleexact);
402 else
403 SCIPrationalSetReal(cipinput->objscaleexact, 1.0);
404 }
405 /* read real scale */
406 else
407 {
408 success = SCIPparseReal(scip, name, &cipinput->objscale, &endptr);
409
410 if( success )
411 SCIPdebugMsg(scip, "read real objscale %g\n", cipinput->objscale);
412 else
413 cipinput->objscale = 1.0;
414 }
415
416 if( !success )
417 {
418 SCIPwarningMessage(scip, "could not parse objective scale (line: %d)\n%s\n", cipinput->linenumber, cipinput->strbuf);
419 return SCIP_OKAY;
420 }
421 }
422
423 return SCIP_OKAY;
424}
425
426/** read variable */
427static
429 SCIP* scip, /**< SCIP data structure */
430 CIPINPUT* cipinput, /**< CIP parsing data */
431 SCIP_Bool initial, /**< should var's column be present in the initial root LP? */
432 SCIP_Bool removable /**< is var's column removable from the LP (due to aging or cleanup)? */
433 )
434{
435 SCIP_Bool success;
436 SCIP_VAR* var;
437 char* buf;
438 char* endptr;
439
440 buf = cipinput->strbuf;
441
442 if( strncmp(buf, "FIXED", 5) == 0 )
443 cipinput->section = CIP_FIXEDVARS;
444 else if( strncmp(buf, "CONSTRAINTS", 4) == 0 )
445 cipinput->section = CIP_CONSTRAINTS;
446 else if( strncmp(buf, "END", 3) == 0 )
447 cipinput->section = CIP_END;
448
449 if( cipinput->section != CIP_VARS )
450 return SCIP_OKAY;
451
452 SCIPdebugMsg(scip, "parse variable\n");
453
454 /* parse the variable */
455 SCIP_CALL( SCIPparseVar(scip, &var, buf, initial, removable, NULL, NULL, NULL, NULL, NULL, &endptr, &success) );
456
457 if( !success )
458 {
459 SCIPerrorMessage("syntax error in variable information (line: %d):\n%s\n", cipinput->linenumber, cipinput->strbuf);
460 cipinput->haserror = TRUE;
461 return SCIP_OKAY;
462 }
463
464 /* scale exact objective */
465 if( cipinput->objscaleexact != NULL )
466 {
467 if( !SCIPrationalIsEQReal(cipinput->objscaleexact, 1.0) )
468 {
469 SCIP_RATIONAL* newobjval;
470
472
473 SCIPrationalMult(newobjval, SCIPvarGetObjExact(var), cipinput->objscaleexact);
474 SCIP_CALL( SCIPchgVarObjExact(scip, var, newobjval) );
475
477 }
478 }
479 /* scale real objective */
480 else
481 {
482 if( cipinput->objscale != 1.0 ) /*lint !e777*/
483 {
484 SCIP_CALL( SCIPchgVarObj(scip, var, SCIPvarGetObj(var) * cipinput->objscale) );
485 }
486 }
487
489
491
493
494 return SCIP_OKAY;
495}
496
497/** read fixed variable */
498static
500 SCIP* scip, /**< SCIP data structure */
501 CIPINPUT* cipinput /**< CIP parsing data */
502 )
503{
504 SCIP_Bool success;
505 SCIP_VAR* var;
506 char* buf;
507 char* endptr;
508 char name[SCIP_MAXSTRLEN];
509
510 buf = cipinput->strbuf;
511
512 if( strncmp(buf, "CONSTRAINTS", 11) == 0 )
513 cipinput->section = CIP_CONSTRAINTS;
514 else if( strncmp(buf, "END", 3) == 0 )
515 cipinput->section = CIP_END;
516
517 if( cipinput->section != CIP_FIXEDVARS )
518 return SCIP_OKAY;
519
520 SCIPdebugMsg(scip, "parse fixed variable\n");
521
522 /* parse the variable */
523 SCIP_CALL( SCIPparseVar(scip, &var, buf, TRUE, FALSE, NULL, NULL, NULL, NULL, NULL, &endptr, &success) );
524
525 if( !success )
526 {
527 SCIPerrorMessage("syntax error in variable information (line: %d):\n%s\n", cipinput->linenumber, cipinput->strbuf);
528 cipinput->haserror = TRUE;
529 return SCIP_OKAY;
530 }
531
532 /* skip intermediate stuff */
533 buf = endptr;
534
535 while( *buf != '\0' && (*buf == ' ' || *buf == ',') )
536 ++buf;
537
538 /* check whether variable is fixed */
539 if( strncmp(buf, "fixed:", 6) == 0 )
540 {
543 }
544 else if( strncmp(buf, "negated:", 8) == 0 )
545 {
546 SCIP_CONS* lincons = NULL;
547 SCIP_VAR* negvar;
548 SCIP_VAR* vars[2];
549
550 buf += 8;
551
552 /* we can just parse the next variable (ignoring all other information in between) */
553 SCIP_CALL( SCIPparseVarName(scip, buf, &negvar, &endptr) );
554
555 if( negvar == NULL )
556 {
557 SCIPerrorMessage("could not parse negated variable (line: %d):\n%s\n", cipinput->linenumber, cipinput->strbuf);
558 cipinput->haserror = TRUE;
559 return SCIP_OKAY;
560 }
561
563 assert(SCIPvarIsBinary(negvar));
564
566
567 SCIPdebugMsg(scip, "creating negated variable <%s> (of <%s>) ...\n", SCIPvarGetName(var), SCIPvarGetName(negvar) );
569
570 (void) SCIPsnprintf(name, SCIP_MAXSTRLEN, "neg_%s", SCIPvarGetName(var) );
571 vars[0] = var;
572 vars[1] = negvar;
573
574 /* add exact linear constraint for negation */
575 if( SCIPisExact(scip) )
576 {
577 SCIP_RATIONAL** vals;
578
580
581 SCIPrationalSetReal(vals[0], 1.0);
582 SCIPrationalSetReal(vals[1], 1.0);
583 SCIP_CALL( SCIPcreateConsExactLinear(scip, &lincons, name, 2, vars, vals, vals[0], vals[0], TRUE, TRUE, TRUE, TRUE, TRUE, FALSE, FALSE, FALSE, TRUE, FALSE) );
584
586 }
587 /* add real linear constraint for negation */
588 else
589 {
590 SCIP_Real vals[2];
591
592 vals[0] = 1.0;
593 vals[1] = 1.0;
594 SCIP_CALL( SCIPcreateConsLinear(scip, &lincons, name, 2, vars, vals, 1.0, 1.0, TRUE, TRUE, TRUE, TRUE, TRUE, FALSE, FALSE, FALSE, TRUE, FALSE) );
595 }
596
597 SCIPdebugMsg(scip, "coupling constraint:\n");
598 SCIPdebugPrintCons(scip, lincons, NULL);
599 SCIP_CALL( SCIPaddCons(scip, lincons) );
600 SCIP_CALL( SCIPreleaseCons(scip, &lincons) );
601 }
602 else if( strncmp(buf, "aggregated:", 11) == 0 )
603 {
604 /* handle (multi-)aggregated variables */
605 SCIP_CONS* lincons = NULL;
606 SCIP_VAR** vars;
607 const char* str;
608 int nvarssize = 20;
609 int requsize;
610 int nvars;
611
612 buf += 11;
613
614 /* special handling of variables that seem to be slack variables of indicator constraints */
615 str = SCIPvarGetName(var);
616 if( strncmp(str, "indslack", 8) == 0 )
617 {
618 (void)SCIPsnprintf(name, SCIP_MAXSTRLEN, "indlin");
619 (void)strncat(name, str+8, SCIP_MAXSTRLEN-7);
620 }
621 else if( strncmp(str, "t_indslack", 10) == 0 )
622 {
623 (void)SCIPsnprintf(name, SCIP_MAXSTRLEN, "indlin");
624 (void)strncat(name, str+10, SCIP_MAXSTRLEN-7);
625 }
626 else
627 (void)SCIPsnprintf(name, SCIP_MAXSTRLEN, "%s", SCIPvarGetName(var) );
628
629 SCIPdebugMsg(scip, "parsing aggregated variable <%s> ...\n", SCIPvarGetName(var));
630
631 /* add exact linear constraint for (multi-)aggregation */
632 if( SCIPisExact(scip) )
633 {
634 SCIP_RATIONAL** vals;
635 SCIP_RATIONAL* rhs;
636
638
639 /* parse exact constant */
640 if( !SCIPparseRational(scip, buf, rhs, &endptr) )
641 {
642 SCIPerrorMessage("expected constant when aggregated variable information (line: %d):\n%s\n", cipinput->linenumber, buf);
643 cipinput->haserror = TRUE;
645 return SCIP_OKAY;
646 }
647
648 SCIP_CALL( SCIPallocBufferArray(scip, &vars, nvarssize) );
650
651 /* check whether constant is 0.0 */
652 str = endptr;
653 SCIP_CALL( SCIPskipSpace((char**)&str) );
654
655 /* if next char is '<' we found a variable -> constant is 0 */
656 if( *str != '<' )
657 {
658 buf = endptr;
659
660 SCIPrationalDebugMessage("constant: %q\n", rhs);
661
662 SCIPrationalMultReal(rhs, rhs, -1.0);
663 }
664 /* otherwise keep buf */
665 else
666 SCIPrationalSetReal(rhs, 0.0);
667
668 vars[0] = var;
669 SCIPrationalSetReal(vals[0], -1.0);
670 --nvarssize;
671
672 /* parse exact linear sum to get variables and coefficients */
673 SCIP_CALL( SCIPparseVarsLinearsumExact(scip, buf, vars + 1, vals + 1, &nvars, nvarssize, &requsize, &endptr, &success) );
674 if( success && requsize > nvarssize )
675 {
676 SCIP_CALL( SCIPreallocBufferArray(scip, &vars, requsize + 1) );
677 SCIP_CALL( SCIPrationalReallocBufferArray(SCIPbuffer(scip), &vals, nvarssize + 1, requsize + 1) );
678 nvarssize = requsize;
679 SCIP_CALL( SCIPparseVarsLinearsumExact(scip, buf, vars + 1, vals + 1, &nvars, nvarssize, &requsize, &endptr, &success) );
680 assert(!success || requsize <= nvarssize);
681 }
682
683 if( success )
684 {
685 /* add aggregation constraint */
687 SCIP_CALL( SCIPcreateConsExactLinear(scip, &lincons, name, nvars + 1, vars, vals, rhs, rhs, TRUE, TRUE, TRUE, TRUE, TRUE, FALSE, FALSE, FALSE, TRUE, FALSE) );
688 }
689
690 SCIPrationalFreeBufferArray(SCIPbuffer(scip), &vals, nvarssize + 1);
693 }
694 /* add real linear constraint for (multi-)aggregation */
695 else
696 {
697 SCIP_Real* vals;
698 SCIP_Real rhs;
699
700 /* parse real constant */
701 if( !SCIPparseReal(scip, buf, &rhs, &endptr) )
702 {
703 SCIPerrorMessage("expected constant when aggregated variable information (line: %d):\n%s\n", cipinput->linenumber, buf);
704 cipinput->haserror = TRUE;
705 return SCIP_OKAY;
706 }
707
708 SCIP_CALL( SCIPallocBufferArray(scip, &vars, nvarssize) );
709 SCIP_CALL( SCIPallocBufferArray(scip, &vals, nvarssize) );
710
711 /* check whether constant is 0.0 */
712 str = endptr;
713 SCIP_CALL( SCIPskipSpace((char**)&str) );
714
715 /* if next char is '<' we found a variable -> constant is 0 */
716 if( *str != '<' )
717 {
718 buf = endptr;
719
720 SCIPdebugMsg(scip, "constant: %f\n", rhs);
721
722 rhs *= -1.0;
723 }
724 /* otherwise keep buf */
725 else
726 rhs = 0.0;
727
728 vars[0] = var;
729 vals[0] = -1.0;
730 --nvarssize;
731
732 /* parse linear sum to get variables and coefficients */
733 SCIP_CALL( SCIPparseVarsLinearsum(scip, buf, vars + 1, vals + 1, &nvars, nvarssize, &requsize, &endptr, &success) );
734 if( success && requsize > nvarssize )
735 {
736 SCIP_CALL( SCIPreallocBufferArray(scip, &vars, requsize + 1) );
737 SCIP_CALL( SCIPreallocBufferArray(scip, &vals, requsize + 1) );
738 nvarssize = requsize;
739 SCIP_CALL( SCIPparseVarsLinearsum(scip, buf, vars + 1, vals + 1, &nvars, nvarssize, &requsize, &endptr, &success) );
740 assert(!success || requsize <= nvarssize);
741 }
742
743 if( success )
744 {
745 /* add aggregation constraint */
747 SCIP_CALL( SCIPcreateConsLinear(scip, &lincons, name, nvars + 1, vars, vals, rhs, rhs, TRUE, TRUE, TRUE, TRUE, TRUE, FALSE, FALSE, FALSE, TRUE, FALSE) );
748 }
749
752 }
753
754 if( success )
755 {
756 SCIPdebugMsg(scip, "coupling constraint:\n");
757 SCIPdebugPrintCons(scip, lincons, NULL);
758 SCIP_CALL( SCIPaddCons(scip, lincons) );
759 SCIP_CALL( SCIPreleaseCons(scip, &lincons) );
760 }
761 else
762 {
763 SCIPwarningMessage(scip, "Could not read (multi-)aggregated variable <%s>: dependent variables unkown - consider changing the order (line: %d):\n%s\n",
764 SCIPvarGetName(var), cipinput->linenumber, buf);
765 }
766 }
767 else
768 {
769 SCIPerrorMessage("unknown section when parsing variables (line: %d):\n%s\n", cipinput->linenumber, buf);
770 cipinput->haserror = TRUE;
771 return SCIP_OKAY;
772 }
774
775 return SCIP_OKAY;
776}
777
778/** read constraint */
779static
781 SCIP* scip, /**< SCIP data structure */
782 CIPINPUT* cipinput, /**< CIP parsing data */
783 SCIP_Bool initial, /**< should the LP relaxation of constraint be in the initial LP?
784 * Usually set to TRUE. Set to FALSE for 'lazy constraints'. */
785 SCIP_Bool dynamic, /**< Is constraint subject to aging?
786 * Usually set to FALSE. Set to TRUE for own cuts which
787 * are separated as constraints. */
788 SCIP_Bool removable /**< should the relaxation be removed from the LP due to aging or cleanup?
789 * Usually set to FALSE. Set to TRUE for 'lazy constraints' and 'user cuts'. */
790 )
791{
792 SCIP_CONS* cons;
793 char* buf;
794 char* copybuf;
795 SCIP_RETCODE retcode;
797 SCIP_Bool enforce;
798 SCIP_Bool check;
800 SCIP_Bool local;
801 SCIP_Bool modifiable;
802 SCIP_Bool success;
803 int len;
804
805 buf = cipinput->strbuf;
806
807 if( strncmp(buf, "END", 3) == 0 )
808 {
809 cipinput->section = CIP_END;
810 return SCIP_OKAY;
811 }
812
813 SCIPdebugMsg(scip, "parse constraints in line %d\n", cipinput->linenumber);
814
815 separate = TRUE;
816 enforce = TRUE;
817 check = TRUE;
818 propagate = TRUE;
819 local = FALSE;
820 modifiable = FALSE;
821
822 /* get length of line and check for correct ending of constraint line */
823 len = (int)strlen(buf);
824 if( len < 1 )
825 {
826 SCIPerrorMessage("syntax error: expected constraint in line %d.\n", cipinput->linenumber);
827 cipinput->haserror = TRUE;
828 return SCIP_OKAY;
829 }
830 if ( buf[len - 1] != ';' )
831 {
832 SCIPerrorMessage("syntax error: line has to end with ';' (line: %d)\n", cipinput->linenumber);
833 cipinput->haserror = TRUE;
834 return SCIP_OKAY;
835 }
836
837 /* copy buffer for working purpose */
838 SCIP_CALL( SCIPduplicateBufferArray(scip, &copybuf, buf, len) );
839 copybuf[len - 1] = '\0';
840
841 /* parse the constraint */
842 retcode = SCIPparseCons(scip, &cons, copybuf,
843 initial, separate, enforce, check, propagate, local, modifiable, dynamic, removable, FALSE, &success);
844
845 /* free temporary buffer */
846 SCIPfreeBufferArray(scip, &copybuf);
847
848 SCIP_CALL( retcode );
849
850 if( !success )
851 {
852 SCIPerrorMessage("syntax error when reading constraint (line: %d):\n%s\n", cipinput->linenumber, cipinput->strbuf);
853 cipinput->haserror = TRUE;
854 return SCIP_OKAY;
855 }
856
857 SCIP_CALL( SCIPaddCons(scip, cons) );
859 SCIP_CALL( SCIPreleaseCons(scip, &cons) );
860
861 return SCIP_OKAY;
862}
863
864/*
865 * Callback methods of reader
866 */
867
868/** copy method for reader plugins (called when SCIP copies plugins) */
869static
871{ /*lint --e{715}*/
872 assert(scip != NULL);
873 assert(reader != NULL);
874 assert(strcmp(SCIPreaderGetName(reader), READER_NAME) == 0);
875
876 /* call inclusion method of reader */
878
879 return SCIP_OKAY;
880}
881
882/** destructor of reader to free user data (called when SCIP is exiting) */
883static
885{
886 SCIP_READERDATA* readerdata;
887
888 assert(strcmp(SCIPreaderGetName(reader), READER_NAME) == 0);
889 readerdata = SCIPreaderGetData(reader);
890 assert(readerdata != NULL);
891 SCIPfreeBlockMemory(scip, &readerdata);
892
893 return SCIP_OKAY;
894}
895
896
897/** problem reading method of reader */
898static
900{ /*lint --e{715}*/
901 CIPINPUT cipinput;
902 SCIP_Bool initialconss;
903 SCIP_Bool dynamicconss;
904 SCIP_Bool dynamiccols;
905 SCIP_Bool dynamicrows;
906 SCIP_Bool initialvar;
907 SCIP_Bool removablevar;
908 SCIP_RETCODE retcode = SCIP_OKAY;
909
910 if( NULL == (cipinput.file = SCIPfopen(filename, "r")) )
911 {
912 SCIPerrorMessage("cannot open file <%s> for reading\n", filename);
913 SCIPprintSysError(filename);
914 return SCIP_NOFILE;
915 }
916
917 cipinput.len = 131071;
918 SCIP_CALL( SCIPallocBufferArray(scip, &(cipinput.strbuf), cipinput.len) );
919
920 cipinput.linenumber = 0;
921 cipinput.section = CIP_START;
922 cipinput.haserror = FALSE;
923 cipinput.endfile = FALSE;
924 cipinput.readingsize = 65535;
925 cipinput.objoffset = 0.0;
926 cipinput.objscale = 1.0;
927 if( SCIPisExact(scip) )
928 {
929 SCIP_CALL( SCIPrationalCreateBuffer(SCIPbuffer(scip), &cipinput.objoffsetexact) );
930 SCIP_CALL( SCIPrationalCreateBuffer(SCIPbuffer(scip), &cipinput.objscaleexact) );
931
932 SCIPrationalSetReal(cipinput.objoffsetexact, 0.0);
933 SCIPrationalSetReal(cipinput.objscaleexact, 1.0);
934 }
935 else
936 {
937 cipinput.objoffsetexact = NULL;
938 cipinput.objscaleexact = NULL;
939 }
940
941 SCIP_CALL_TERMINATE( retcode, SCIPcreateProb(scip, filename, NULL, NULL, NULL, NULL, NULL, NULL, NULL), TERMINATE );
942
943 SCIP_CALL_TERMINATE( retcode, SCIPgetBoolParam(scip, "reading/initialconss", &initialconss), TERMINATE );
944 SCIP_CALL_TERMINATE( retcode, SCIPgetBoolParam(scip, "reading/dynamiccols", &dynamiccols), TERMINATE );
945 SCIP_CALL_TERMINATE( retcode, SCIPgetBoolParam(scip, "reading/dynamicconss", &dynamicconss), TERMINATE );
946 SCIP_CALL_TERMINATE( retcode, SCIPgetBoolParam(scip, "reading/dynamicrows", &dynamicrows), TERMINATE );
947
948 initialvar = !dynamiccols;
949 removablevar = dynamiccols;
950
951 while( cipinput.section != CIP_END && !cipinput.haserror )
952 {
953 /* get next input string */
954 SCIP_CALL_TERMINATE( retcode, getInputString(scip, &cipinput), TERMINATE );
955
956 if( cipinput.endfile )
957 break;
958
959 switch( cipinput.section )
960 {
961 case CIP_START:
962 getStart(scip, &cipinput);
963 break;
964 case CIP_STATISTIC:
965 SCIP_CALL_TERMINATE( retcode, getStatistics(scip, &cipinput), TERMINATE );
966 break;
967 case CIP_OBJECTIVE:
968 SCIP_CALL_TERMINATE( retcode, getObjective(scip, &cipinput), TERMINATE );
969 break;
970 case CIP_VARS:
971 SCIP_CALL_TERMINATE( retcode, getVariable(scip, &cipinput, initialvar, removablevar), TERMINATE );
972 break;
973 case CIP_FIXEDVARS:
974 SCIP_CALL_TERMINATE( retcode, getFixedVariable(scip, &cipinput), TERMINATE );
975 break;
976 case CIP_CONSTRAINTS:
977 SCIP_CALL_TERMINATE( retcode, getConstraint(scip, &cipinput, initialconss, dynamicconss, dynamicrows), TERMINATE );
978 break;
979 default:
980 SCIPerrorMessage("invalid CIP state\n");
981 SCIPABORT();
982 retcode = SCIP_INVALIDDATA; /*lint !e527*/
983 goto TERMINATE;
984 } /*lint !e788*/
985 }
986
987 if( cipinput.haserror )
988 goto TERMINATE;
989
990 /* offset exact objective */
991 if( cipinput.objoffsetexact != NULL )
992 {
993 if( !SCIPrationalIsZero(cipinput.objoffsetexact) )
994 {
995 SCIPrationalMult(cipinput.objoffsetexact, cipinput.objoffsetexact, cipinput.objscaleexact);
996 SCIP_CALL_TERMINATE( retcode, SCIPaddOrigObjoffsetExact(scip, cipinput.objoffsetexact), TERMINATE );
997 }
998 }
999 /* offset real objective */
1000 else
1001 {
1002 if( cipinput.objoffset != 0.0 ) /*lint !e777*/
1003 {
1004 cipinput.objoffset *= cipinput.objscale;
1005 SCIP_CALL_TERMINATE( retcode, SCIPaddOrigObjoffset(scip, cipinput.objoffset), TERMINATE );
1006 }
1007 }
1008
1009 if( cipinput.section != CIP_END )
1010 {
1011 SCIPerrorMessage("unexpected EOF\n");
1012 cipinput.haserror = TRUE;
1013 }
1014
1015 TERMINATE:
1016 /* close file stream */
1017 SCIPfclose(cipinput.file);
1018
1019 if( cipinput.objscaleexact != NULL )
1020 SCIPrationalFreeBuffer(SCIPbuffer(scip), &cipinput.objscaleexact);
1021 if( cipinput.objoffsetexact != NULL )
1022 SCIPrationalFreeBuffer(SCIPbuffer(scip), &cipinput.objoffsetexact);
1023 SCIPfreeBufferArray(scip, &cipinput.strbuf);
1024
1025 if( cipinput.haserror || retcode == SCIP_INVALIDDATA )
1026 return SCIP_READERROR;
1027
1028 /* successfully parsed cip format */
1029 if( retcode == SCIP_OKAY )
1031
1032 return retcode;
1033}
1034
1035/** hash key retrieval function for variables */
1036static
1038{ /*lint --e{715}*/
1039 return elem;
1040}
1041
1042/** returns TRUE iff the indices of both variables are equal */
1043static
1045{ /*lint --e{715}*/
1046 if( key1 == key2 )
1047 return TRUE;
1048 return FALSE;
1049}
1050
1051/** returns the hash value of the key */
1052static
1054{ /*lint --e{715}*/
1055 assert( SCIPvarGetIndex((SCIP_VAR*) key) >= 0 );
1056 return (unsigned int) SCIPvarGetIndex((SCIP_VAR*) key);
1057}
1058
1059/** problem writing method of reader */
1060static
1062{ /*lint --e{715}*/
1063 SCIP_HASHTABLE* varhash = NULL;
1064 SCIP_READERDATA* readerdata;
1065 int i;
1066
1067 assert(reader != NULL);
1068 assert(strcmp(SCIPreaderGetName(reader), READER_NAME) == 0);
1069
1070 SCIPinfoMessage(scip, file, "STATISTICS\n");
1071 SCIPinfoMessage(scip, file, " Problem name : %s\n", name);
1072 SCIPinfoMessage(scip, file, " Variables : %d (%d binary, %d integer, %d implicit integer, %d continuous)\n",
1073 nvars, nbinvars, nintvars, nimplvars, ncontvars);
1074 SCIPinfoMessage(scip, file, " Constraints : %d initial, %d maximal\n", startnconss, maxnconss);
1075
1076 SCIPinfoMessage(scip, file, "OBJECTIVE\n");
1077 SCIPinfoMessage(scip, file, " Sense : %s\n", objsense == SCIP_OBJSENSE_MINIMIZE ? "minimize" : "maximize");
1078 /* write exact offset */
1079 if( objoffsetexact != NULL )
1080 {
1082
1083 if( !SCIPrationalIsZero(objoffsetexact) )
1084 {
1085 SCIPinfoMessage(scip, file, " Offset : ");
1086 SCIPrationalMessage(SCIPgetMessagehdlr(scip), file, objoffsetexact);
1087 SCIPinfoMessage(scip, file, "\n");
1088 }
1089 }
1090 /* write real offset */
1091 else
1092 {
1093 if( objoffset != 0.0 ) /*lint !e777*/
1094 SCIPinfoMessage(scip, file, " Offset : %+.15g\n", objoffset);
1095 }
1096 /* write exact scale */
1097 if( objscaleexact != NULL )
1098 {
1100
1101 if( !SCIPrationalIsEQReal(objscaleexact, 1.0) )
1102 {
1103 SCIPinfoMessage(scip, file, " Scale : ");
1104 SCIPrationalMessage(SCIPgetMessagehdlr(scip), file, objscaleexact);
1105 SCIPinfoMessage(scip, file, "\n");
1106 }
1107 }
1108 /* write real scale */
1109 else
1110 {
1111 if( objscale != 1.0 ) /*lint !e777*/
1112 SCIPinfoMessage(scip, file, " Scale : %.15g\n", objscale);
1113 }
1114
1115 if ( nfixedvars > 0 )
1116 {
1117 /* set up hash table for variables that have been written property (used for writing out fixed vars in the right order) */
1118 SCIP_CALL( SCIPhashtableCreate(&varhash, SCIPblkmem(scip), nvars + nfixedvars, hashGetKeyVar, hashKeyEqVar, hashKeyValVar, NULL) );
1119 }
1120
1121 if ( nvars + nfixedvars > 0 )
1122 {
1123 SCIPinfoMessage(scip, file, "VARIABLES\n");
1124 }
1125
1126 if( nvars > 0 )
1127 {
1128 for( i = 0; i < nvars; ++i )
1129 {
1130 SCIP_VAR* var;
1131
1132 var = vars[i];
1133 assert( var != NULL );
1134 SCIP_CALL( SCIPprintVar(scip, var, file) );
1135 if ( varhash != NULL )
1136 {
1137 /* add free variable to hashtable */
1138 if ( ! SCIPhashtableExists(varhash, (void*) var) )
1139 {
1140 SCIP_CALL( SCIPhashtableInsert(varhash, (void*) var) );
1141 }
1142 }
1143 }
1144 }
1145
1146 readerdata = SCIPreaderGetData(reader);
1147 assert(readerdata != NULL);
1148
1149 if( readerdata->writefixedvars && nfixedvars > 0 )
1150 {
1151 int nwritten = 0;
1152
1153 SCIPinfoMessage(scip, file, "FIXED\n");
1154
1155 /* loop through variables until each has been written after the variables that it depends on have been written; this
1156 * requires several runs over the variables, but the depth (= number of loops) is usually small. */
1157 while ( nwritten < nfixedvars )
1158 {
1159 SCIPdebugMsg(scip, "written %d of %d fixed variables.\n", nwritten, nfixedvars);
1160 for (i = 0; i < nfixedvars; ++i)
1161 {
1162 SCIP_VAR* var;
1163 SCIP_VAR* tmpvar;
1164
1165 var = fixedvars[i];
1166 assert( var != NULL );
1167
1168 /* skip variables already written */
1169 if ( SCIPhashtableExists(varhash, (void*) var) )
1170 continue;
1171
1172 switch ( SCIPvarGetStatus(var) )
1173 {
1175
1176 /* fixed variables can simply be output and added to the hashtable */
1177 SCIP_CALL( SCIPprintVar(scip, var, file) );
1178 assert( ! SCIPhashtableExists(varhash, (void*) var) );
1179 SCIP_CALL( SCIPhashtableInsert(varhash, (void*) var) );
1180 ++nwritten;
1181
1182 break;
1183
1185
1186 tmpvar = SCIPvarGetNegationVar(var);
1187 assert( tmpvar != NULL );
1188 assert( var == SCIPvarGetNegatedVar(tmpvar) );
1189
1190 /* if the negated variable has been written, we can write the current variable */
1191 if ( SCIPhashtableExists(varhash, (void*) tmpvar) )
1192 {
1193 SCIP_CALL( SCIPprintVar(scip, var, file) );
1194 assert( ! SCIPhashtableExists(varhash, (void*) var) );
1195 SCIP_CALL( SCIPhashtableInsert(varhash, (void*) var) );
1196 ++nwritten;
1197 }
1198 break;
1199
1201
1202 tmpvar = SCIPvarGetAggrVar(var);
1203 assert( tmpvar != NULL );
1204
1205 /* if the aggregating variable has been written, we can write the current variable */
1206 if ( SCIPhashtableExists(varhash, (void*) tmpvar) )
1207 {
1208 SCIP_CALL( SCIPprintVar(scip, var, file) );
1209 assert( ! SCIPhashtableExists(varhash, (void*) var) );
1210 SCIP_CALL( SCIPhashtableInsert(varhash, (void*) var) );
1211 ++nwritten;
1212 }
1213 break;
1214
1216 {
1217 SCIP_VAR** aggrvars;
1218 int naggrvars;
1219 int j;
1220
1221 /* get the active representation */
1223
1224 naggrvars = SCIPvarGetMultaggrNVars(var);
1225 aggrvars = SCIPvarGetMultaggrVars(var);
1226 assert(aggrvars != NULL || naggrvars == 0);
1227
1228 for (j = 0; j < naggrvars; ++j)
1229 {
1230 if( !SCIPhashtableExists(varhash, (void*) aggrvars[j]) ) /*lint !e613*/
1231 break;
1232 }
1233
1234 /* if all multi-aggregating variables have been written, we can write the current variable */
1235 if ( j >= naggrvars )
1236 {
1237 SCIP_CALL( SCIPprintVar(scip, var, file) );
1238 assert( ! SCIPhashtableExists(varhash, (void*) var) );
1239 SCIP_CALL( SCIPhashtableInsert(varhash, (void*) var) );
1240 ++nwritten;
1241 }
1242 break;
1243 }
1244
1248 SCIPerrorMessage("Only fixed variables are allowed to be present in fixedvars list.\n");
1249 SCIPABORT();
1250 return SCIP_ERROR; /*lint !e527*/
1251 }
1252 }
1253 }
1254 }
1255
1256 if( nconss > 0 )
1257 {
1258 SCIPinfoMessage(scip, file, "CONSTRAINTS\n");
1259
1260 for( i = 0; i < nconss; ++i )
1261 {
1262 SCIP_CALL( SCIPprintCons(scip, conss[i], file) );
1263 SCIPinfoMessage(scip, file, ";\n");
1264 }
1265 }
1266 SCIPinfoMessage(scip, file, "END\n");
1267
1269
1270 if( nfixedvars > 0 )
1271 SCIPhashtableFree(&varhash);
1272 else
1273 assert(varhash == NULL);
1274
1275 return SCIP_OKAY;
1276}
1277
1278
1279/*
1280 * reader specific interface methods
1281 */
1282
1283/** includes the cip file reader in SCIP */
1285 SCIP* scip /**< SCIP data structure */
1286 )
1287{
1288 SCIP_READERDATA* readerdata;
1289 SCIP_READER* reader;
1290
1291 /* create cip reader data */
1292 SCIP_CALL( SCIPallocBlockMemory(scip, &readerdata) );
1293
1294 /* include reader */
1296
1297 /* reader is safe to use in exact solving mode */
1298 SCIPreaderMarkExact(reader);
1299
1300 /* set non fundamental callbacks via setter functions */
1301 SCIP_CALL( SCIPsetReaderCopy(scip, reader, readerCopyCip) );
1302 SCIP_CALL( SCIPsetReaderFree(scip, reader, readerFreeCip) );
1303 SCIP_CALL( SCIPsetReaderRead(scip, reader, readerReadCip) );
1304 SCIP_CALL( SCIPsetReaderWrite(scip, reader, readerWriteCip) );
1305
1306 /* add cip reader parameters */
1308 "reading/cipreader/writefixedvars", "should fixed and aggregated variables be printed (if not, re-parsing might fail)",
1309 &readerdata->writefixedvars, FALSE, DEFAULT_CIP_WRITEFIXEDVARS, NULL, NULL) );
1310
1311 return SCIP_OKAY;
1312}
Constraint handler for linear constraints in their most general form, .
Constraint handler for linear constraints in their most general form, .
#define NULL
Definition def.h:255
#define SCIP_MAXSTRLEN
Definition def.h:276
#define SCIP_Bool
Definition def.h:98
#define SCIP_Real
Definition def.h:163
#define TRUE
Definition def.h:100
#define FALSE
Definition def.h:101
#define SCIP_CALL_TERMINATE(retcode, x, TERM)
Definition def.h:383
#define SCIPABORT()
Definition def.h:334
#define SCIP_CALL(x)
Definition def.h:362
SCIP_FILE * SCIPfopen(const char *path, const char *mode)
Definition fileio.c:154
int SCIPfclose(SCIP_FILE *fp)
Definition fileio.c:233
char * SCIPfgets(char *s, int size, SCIP_FILE *stream)
Definition fileio.c:201
SCIP_RETCODE SCIPcreateConsExactLinear(SCIP *scip, SCIP_CONS **cons, const char *name, int nvars, SCIP_VAR **vars, SCIP_RATIONAL **vals, SCIP_RATIONAL *lhs, SCIP_RATIONAL *rhs, SCIP_Bool initial, SCIP_Bool separate, SCIP_Bool enforce, SCIP_Bool check, SCIP_Bool propagate, SCIP_Bool local, SCIP_Bool modifiable, SCIP_Bool dynamic, SCIP_Bool removable, SCIP_Bool stickingatnode)
SCIP_RETCODE SCIPcreateConsLinear(SCIP *scip, SCIP_CONS **cons, const char *name, int nvars, SCIP_VAR **vars, SCIP_Real *vals, SCIP_Real lhs, SCIP_Real rhs, SCIP_Bool initial, SCIP_Bool separate, SCIP_Bool enforce, SCIP_Bool check, SCIP_Bool propagate, SCIP_Bool local, SCIP_Bool modifiable, SCIP_Bool dynamic, SCIP_Bool removable, SCIP_Bool stickingatnode)
SCIP_RETCODE SCIPincludeReaderCip(SCIP *scip)
SCIP_RETCODE SCIPaddVar(SCIP *scip, SCIP_VAR *var)
Definition scip_prob.c:1907
SCIP_RETCODE SCIPsetProbName(SCIP *scip, const char *name)
Definition scip_prob.c:1270
SCIP_RETCODE SCIPaddCons(SCIP *scip, SCIP_CONS *cons)
Definition scip_prob.c:3274
SCIP_RETCODE SCIPsetObjsense(SCIP *scip, SCIP_OBJSENSE objsense)
Definition scip_prob.c:1417
SCIP_RETCODE SCIPaddOrigObjoffset(SCIP *scip, SCIP_Real addval)
Definition scip_prob.c:1486
SCIP_RETCODE SCIPcreateProb(SCIP *scip, const char *name, SCIP_DECL_PROBDELORIG((*probdelorig)), SCIP_DECL_PROBTRANS((*probtrans)), SCIP_DECL_PROBDELTRANS((*probdeltrans)), SCIP_DECL_PROBINITSOL((*probinitsol)), SCIP_DECL_PROBEXITSOL((*probexitsol)), SCIP_DECL_PROBCOPY((*probcopy)), SCIP_PROBDATA *probdata)
Definition scip_prob.c:119
SCIP_RETCODE SCIPaddOrigObjoffsetExact(SCIP *scip, SCIP_RATIONAL *addval)
Definition scip_prob.c:1465
void SCIPhashtableFree(SCIP_HASHTABLE **hashtable)
Definition misc.c:2348
SCIP_Bool SCIPhashtableExists(SCIP_HASHTABLE *hashtable, void *element)
Definition misc.c:2647
SCIP_RETCODE SCIPhashtableCreate(SCIP_HASHTABLE **hashtable, BMS_BLKMEM *blkmem, int tablesize, SCIP_DECL_HASHGETKEY((*hashgetkey)), SCIP_DECL_HASHKEYEQ((*hashkeyeq)), SCIP_DECL_HASHKEYVAL((*hashkeyval)), void *userptr)
Definition misc.c:2298
SCIP_RETCODE SCIPhashtableInsert(SCIP_HASHTABLE *hashtable, void *element)
Definition misc.c:2535
void SCIPinfoMessage(SCIP *scip, FILE *file, const char *formatstr,...)
SCIP_MESSAGEHDLR * SCIPgetMessagehdlr(SCIP *scip)
#define SCIPdebugMsg
void SCIPwarningMessage(SCIP *scip, const char *formatstr,...)
SCIP_RETCODE SCIPgetBoolParam(SCIP *scip, const char *name, SCIP_Bool *value)
Definition scip_param.c:250
SCIP_RETCODE SCIPaddBoolParam(SCIP *scip, const char *name, const char *desc, SCIP_Bool *valueptr, SCIP_Bool isadvanced, SCIP_Bool defaultvalue, SCIP_DECL_PARAMCHGD((*paramchgd)), SCIP_PARAMDATA *paramdata)
Definition scip_param.c:57
SCIP_RETCODE SCIPprintCons(SCIP *scip, SCIP_CONS *cons, FILE *file)
Definition scip_cons.c:2536
SCIP_RETCODE SCIPparseCons(SCIP *scip, SCIP_CONS **cons, const char *str, SCIP_Bool initial, SCIP_Bool separate, SCIP_Bool enforce, SCIP_Bool check, SCIP_Bool propagate, SCIP_Bool local, SCIP_Bool modifiable, SCIP_Bool dynamic, SCIP_Bool removable, SCIP_Bool stickingatnode, SCIP_Bool *success)
Definition scip_cons.c:1081
SCIP_RETCODE SCIPreleaseCons(SCIP *scip, SCIP_CONS **cons)
Definition scip_cons.c:1173
SCIP_Bool SCIPisExact(SCIP *scip)
Definition scip_exact.c:193
BMS_BLKMEM * SCIPblkmem(SCIP *scip)
Definition scip_mem.c:57
BMS_BUFMEM * SCIPbuffer(SCIP *scip)
Definition scip_mem.c:72
int SCIPcalcMemGrowSize(SCIP *scip, int num)
Definition scip_mem.c:139
#define SCIPallocBufferArray(scip, ptr, num)
Definition scip_mem.h:124
#define SCIPreallocBufferArray(scip, ptr, num)
Definition scip_mem.h:128
#define SCIPfreeBufferArray(scip, ptr)
Definition scip_mem.h:136
#define SCIPduplicateBufferArray(scip, ptr, source, num)
Definition scip_mem.h:132
#define SCIPfreeBlockMemory(scip, ptr)
Definition scip_mem.h:108
#define SCIPallocBlockMemory(scip, ptr)
Definition scip_mem.h:89
void SCIPrationalMult(SCIP_RATIONAL *res, SCIP_RATIONAL *op1, SCIP_RATIONAL *op2)
#define SCIPrationalDebugMessage
Definition rational.h:641
void SCIPrationalSetReal(SCIP_RATIONAL *res, SCIP_Real real)
Definition rational.cpp:604
void SCIPrationalFreeBuffer(BMS_BUFMEM *bufmem, SCIP_RATIONAL **rational)
Definition rational.cpp:474
SCIP_RETCODE SCIPrationalCreateBuffer(BMS_BUFMEM *bufmem, SCIP_RATIONAL **rational)
Definition rational.cpp:124
SCIP_Bool SCIPrationalIsZero(SCIP_RATIONAL *rational)
void SCIPrationalMessage(SCIP_MESSAGEHDLR *msg, FILE *file, SCIP_RATIONAL *rational)
SCIP_Bool SCIPrationalIsEQReal(SCIP_RATIONAL *rat, SCIP_Real real)
SCIP_RETCODE SCIPrationalCreateBufferArray(BMS_BUFMEM *mem, SCIP_RATIONAL ***rational, int size)
Definition rational.cpp:215
SCIP_RETCODE SCIPrationalReallocBufferArray(BMS_BUFMEM *mem, SCIP_RATIONAL ***result, int oldlen, int newlen)
Definition rational.cpp:315
void SCIPrationalMultReal(SCIP_RATIONAL *res, SCIP_RATIONAL *op1, SCIP_Real op2)
void SCIPrationalFreeBufferArray(BMS_BUFMEM *mem, SCIP_RATIONAL ***ratbufarray, int size)
Definition rational.cpp:519
SCIP_RETCODE SCIPsetReaderCopy(SCIP *scip, SCIP_READER *reader,)
SCIP_RETCODE SCIPincludeReaderBasic(SCIP *scip, SCIP_READER **readerptr, const char *name, const char *desc, const char *extension, SCIP_READERDATA *readerdata)
SCIP_READERDATA * SCIPreaderGetData(SCIP_READER *reader)
Definition reader.c:605
SCIP_RETCODE SCIPsetReaderWrite(SCIP *scip, SCIP_READER *reader,)
SCIP_RETCODE SCIPsetReaderRead(SCIP *scip, SCIP_READER *reader,)
const char * SCIPreaderGetName(SCIP_READER *reader)
Definition reader.c:680
SCIP_RETCODE SCIPsetReaderFree(SCIP *scip, SCIP_READER *reader,)
void SCIPreaderMarkExact(SCIP_READER *reader)
Definition reader.c:670
SCIP_Bool SCIPparseRational(SCIP *scip, const char *str, SCIP_RATIONAL *value, char **endptr)
SCIP_Bool SCIPparseReal(SCIP *scip, const char *str, SCIP_Real *value, char **endptr)
SCIP_VAR * SCIPvarGetNegatedVar(SCIP_VAR *var)
Definition var.c:23868
SCIP_Bool SCIPvarIsBinary(SCIP_VAR *var)
Definition var.c:23478
SCIP_VARSTATUS SCIPvarGetStatus(SCIP_VAR *var)
Definition var.c:23386
SCIP_Real SCIPvarGetObj(SCIP_VAR *var)
Definition var.c:23900
SCIP_RETCODE SCIPparseVarName(SCIP *scip, const char *str, SCIP_VAR **var, char **endptr)
Definition scip_var.c:728
SCIP_RETCODE SCIPparseVar(SCIP *scip, SCIP_VAR **var, const char *str, SCIP_Bool initial, SCIP_Bool removable, SCIP_DECL_VARCOPY((*varcopy)), SCIP_DECL_VARDELORIG((*vardelorig)), SCIP_DECL_VARTRANS((*vartrans)), SCIP_DECL_VARDELTRANS((*vardeltrans)), SCIP_VARDATA *vardata, char **endptr, SCIP_Bool *success)
Definition scip_var.c:669
int SCIPvarGetIndex(SCIP_VAR *var)
Definition var.c:23652
const char * SCIPvarGetName(SCIP_VAR *var)
Definition var.c:23267
SCIP_RETCODE SCIPreleaseVar(SCIP *scip, SCIP_VAR **var)
Definition scip_var.c:1887
SCIP_RETCODE SCIPparseVarsLinearsum(SCIP *scip, const char *str, SCIP_VAR **vars, SCIP_Real *vals, int *nvars, int varssize, int *requiredsize, char **endptr, SCIP_Bool *success)
Definition scip_var.c:899
SCIP_RETCODE SCIPparseVarsLinearsumExact(SCIP *scip, char *str, SCIP_VAR **vars, SCIP_RATIONAL **vals, int *nvars, int varssize, int *requiredsize, char **endptr, SCIP_Bool *success)
Definition scip_var.c:1007
SCIP_RETCODE SCIPflattenVarAggregationGraph(SCIP *scip, SCIP_VAR *var)
Definition scip_var.c:2332
SCIP_VAR ** SCIPvarGetMultaggrVars(SCIP_VAR *var)
Definition var.c:23806
int SCIPvarGetMultaggrNVars(SCIP_VAR *var)
Definition var.c:23794
SCIP_VAR * SCIPvarGetNegationVar(SCIP_VAR *var)
Definition var.c:23878
SCIP_RETCODE SCIPprintVar(SCIP *scip, SCIP_VAR *var, FILE *file)
Definition scip_var.c:12465
SCIP_RETCODE SCIPchgVarObjExact(SCIP *scip, SCIP_VAR *var, SCIP_RATIONAL *newobj)
Definition scip_var.c:5420
SCIP_RETCODE SCIPchgVarObj(SCIP *scip, SCIP_VAR *var, SCIP_Real newobj)
Definition scip_var.c:5372
SCIP_RATIONAL * SCIPvarGetObjExact(SCIP_VAR *var)
Definition var.c:23910
SCIP_VAR * SCIPvarGetAggrVar(SCIP_VAR *var)
Definition var.c:23736
int SCIPsnprintf(char *t, int len, const char *s,...)
Definition misc.c:10827
void SCIPprintSysError(const char *message)
Definition misc.c:10719
SCIP_RETCODE SCIPskipSpace(char **s)
Definition misc.c:10816
int SCIPstrncasecmp(const char *s1, const char *s2, int length)
Definition misc.c:10876
return SCIP_OKAY
assert(minobj< SCIPgetCutoffbound(scip))
int nvars
SCIP_VAR * var
SCIP_Real objscale
static SCIP_Bool propagate
static SCIP_VAR ** vars
memory allocation routines
#define BMSclearMemoryArray(ptr, num)
Definition memory.h:130
wrapper functions to map file i/o to standard or zlib file i/o
struct SCIP_File SCIP_FILE
Definition pub_fileio.h:43
public methods for message output
#define SCIPerrorMessage
Definition pub_message.h:64
#define SCIPdebug(x)
Definition pub_message.h:93
#define SCIPdebugPrintCons(x, y, z)
public data structures and miscellaneous methods
public methods for input file readers
public methods for problem variables
wrapper for rational number arithmetic
#define READER_DESC
Definition reader_bnd.c:62
#define READER_EXTENSION
Definition reader_bnd.c:63
#define READER_NAME
Definition reader_bnd.c:61
static SCIP_RETCODE getObjective(SCIP *scip, CIPINPUT *cipinput)
Definition reader_cip.c:278
static SCIP_RETCODE getConstraint(SCIP *scip, CIPINPUT *cipinput, SCIP_Bool initial, SCIP_Bool dynamic, SCIP_Bool removable)
Definition reader_cip.c:780
enum CipSection CIPSECTION
Definition reader_cip.c:82
static SCIP_RETCODE getInputString(SCIP *scip, CIPINPUT *cipinput)
Definition reader_cip.c:114
static SCIP_RETCODE getVariable(SCIP *scip, CIPINPUT *cipinput, SCIP_Bool initial, SCIP_Bool removable)
Definition reader_cip.c:428
static void getStart(SCIP *scip, CIPINPUT *cipinput)
Definition reader_cip.c:200
CipSection
Definition reader_cip.c:73
@ CIP_CONSTRAINTS
Definition reader_cip.c:79
@ CIP_VARS
Definition reader_cip.c:77
@ CIP_START
Definition reader_cip.c:74
@ CIP_OBJECTIVE
Definition reader_cip.c:76
@ CIP_FIXEDVARS
Definition reader_cip.c:78
@ CIP_STATISTIC
Definition reader_cip.c:75
@ CIP_END
Definition reader_cip.c:80
static SCIP_RETCODE getStatistics(SCIP *scip, CIPINPUT *cipinput)
Definition reader_cip.c:227
#define DEFAULT_CIP_WRITEFIXEDVARS
Definition reader_cip.c:61
struct CipInput CIPINPUT
Definition reader_cip.c:105
static SCIP_RETCODE getFixedVariable(SCIP *scip, CIPINPUT *cipinput)
Definition reader_cip.c:499
CIP file reader.
public methods for constraint handler plugins and constraints
public methods for exact solving
public methods for memory management
public methods for message handling
public methods for numerical tolerances
public methods for SCIP parameter handling
public methods for global and local (sub)problems
public methods for reader plugins
public methods for SCIP variables
static SCIP_RETCODE separate(SCIP *scip, SCIP_SEPA *sepa, SCIP_SOL *sol, SCIP_RESULT *result)
Main separation function.
struct SCIP_Cons SCIP_CONS
Definition type_cons.h:63
#define SCIP_DECL_HASHKEYEQ(x)
Definition type_misc.h:195
#define SCIP_DECL_HASHGETKEY(x)
Definition type_misc.h:192
#define SCIP_DECL_HASHKEYVAL(x)
Definition type_misc.h:198
struct SCIP_HashTable SCIP_HASHTABLE
Definition type_misc.h:88
@ SCIP_OBJSENSE_MAXIMIZE
Definition type_prob.h:47
@ SCIP_OBJSENSE_MINIMIZE
Definition type_prob.h:48
enum SCIP_Objsense SCIP_OBJSENSE
Definition type_prob.h:50
struct SCIP_Rational SCIP_RATIONAL
#define SCIP_DECL_READERWRITE(x)
struct SCIP_ReaderData SCIP_READERDATA
Definition type_reader.h:54
struct SCIP_Reader SCIP_READER
Definition type_reader.h:53
#define SCIP_DECL_READERREAD(x)
Definition type_reader.h:88
#define SCIP_DECL_READERCOPY(x)
Definition type_reader.h:63
#define SCIP_DECL_READERFREE(x)
Definition type_reader.h:72
@ SCIP_SUCCESS
Definition type_result.h:58
@ SCIP_NOFILE
@ SCIP_READERROR
@ SCIP_INVALIDDATA
@ SCIP_ERROR
enum SCIP_Retcode SCIP_RETCODE
struct Scip SCIP
Definition type_scip.h:39
struct SCIP_Var SCIP_VAR
Definition type_var.h:166
@ SCIP_VARSTATUS_ORIGINAL
Definition type_var.h:51
@ SCIP_VARSTATUS_FIXED
Definition type_var.h:54
@ SCIP_VARSTATUS_COLUMN
Definition type_var.h:53
@ SCIP_VARSTATUS_MULTAGGR
Definition type_var.h:56
@ SCIP_VARSTATUS_NEGATED
Definition type_var.h:57
@ SCIP_VARSTATUS_AGGREGATED
Definition type_var.h:55
@ SCIP_VARSTATUS_LOOSE
Definition type_var.h:52