Scippy

SCIP

Solving Constraint Integer Programs

scip_lpexact.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-2025 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 scip_lpexact.c
26 * @brief public methods for the exact LP relaxation, rows and columns
27 * @author Leon Eifler
28 *
29 * @todo check all SCIP_STAGE_* switches, and include the new stages TRANSFORMED and INITSOLVE
30 */
31
32/*---+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8----+----9----+----0----+----1----+----2*/
33
34#include <ctype.h>
35#include <stdarg.h>
36#include <assert.h>
37#include <string.h>
38#ifndef _WIN32
39#include <strings.h> /*lint --e{766}*/
40#endif
41
42#include "lpiexact/lpiexact.h"
43#include "scip/conflict.h"
44#include "scip/debug.h"
45#include "scip/lp.h"
46#include "scip/lpexact.h"
47#include "scip/prob.h"
48#include "scip/pub_lp.h"
49#include "scip/pub_message.h"
50#include "scip/pub_tree.h"
51#include "scip/scip_lpexact.h"
52#include "scip/scip_lp.h"
53#include "scip/scip_mem.h"
54#include "scip/scip_numerics.h"
55#include "scip/scip_sol.h"
57#include "scip/scip_tree.h"
58#include "scip/scip_var.h"
59#include "scip/sepastoreexact.h"
60#include "scip/set.h"
61#include "scip/solve.h"
62#include "scip/struct_lpexact.h"
63#include "scip/struct_primal.h"
64#include "scip/struct_prob.h"
65#include "scip/struct_mem.h"
66#include "scip/tree.h"
67#include "scip/var.h"
68
69
70/* In debug mode, we include the SCIP's structure in scip.c, such that no one can access
71 * this structure except the interface methods in scip.c.
72 * In optimized mode, the structure is included in scip.h, because some of the methods
73 * are implemented as defines for performance reasons (e.g. the numerical comparisons)
74 */
75#ifndef NDEBUG
76#include "scip/struct_scip.h"
77#endif
78
79/** increases usage counter of exact LP row
80 *
81 * @return \ref SCIP_OKAY is returned if everything worked. Otherwise a suitable error code is passed. See \ref
82 * SCIP_Retcode "SCIP_RETCODE" for a complete list of error codes.
83 *
84 * @pre this method can be called in one of the following stages of the SCIP solving process:
85 * - \ref SCIP_STAGE_INITSOLVE
86 * - \ref SCIP_STAGE_SOLVING
87 */
89 SCIP* scip, /**< SCIP data structure */
90 SCIP_ROWEXACT* row /**< row to capture */
91 )
92{
94
96
97 return SCIP_OKAY;
98}
99
100/** decreases usage counter of LP row, and frees memory if necessary
101 *
102 * @return \ref SCIP_OKAY is returned if everything worked. Otherwise a suitable error code is passed. See \ref
103 * SCIP_Retcode "SCIP_RETCODE" for a complete list of error codes.
104 *
105 * @pre this method can be called in one of the following stages of the SCIP solving process:
106 * - \ref SCIP_STAGE_INITSOLVE
107 * - \ref SCIP_STAGE_SOLVING
108 * - \ref SCIP_STAGE_EXITSOLVE
109 */
111 SCIP* scip, /**< SCIP data structure */
112 SCIP_ROWEXACT** row /**< pointer to LP row */
113 )
114{
115 SCIP_CALL( SCIPcheckStage(scip, "SCIPreleaseRowExact", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, TRUE, FALSE, TRUE, FALSE, FALSE) );
116
117 SCIP_CALL( SCIProwExactRelease(row, scip->mem->probmem, scip->set, scip->lpexact) );
118
119 return SCIP_OKAY;
120}
121
122/** changes left hand side of exact LP row
123 *
124 * @return \ref SCIP_OKAY is returned if everything worked. Otherwise a suitable error code is passed. See \ref
125 * SCIP_Retcode "SCIP_RETCODE" for a complete list of error codes.
126 *
127 * @pre this method can be called in one of the following stages of the SCIP solving process:
128 * - \ref SCIP_STAGE_INITSOLVE
129 * - \ref SCIP_STAGE_SOLVING
130 */
132 SCIP* scip, /**< SCIP data structure */
133 SCIP_ROWEXACT* row, /**< LP row */
134 SCIP_RATIONAL* lhs /**< new left hand side */
135 )
136{
138
139 assert(!SCIPlpExactDiving(scip->lpexact) || (row->lppos == -1));
140
141 SCIP_CALL( SCIProwExactChgLhs(row, scip->set, scip->lpexact, lhs) );
142
143 return SCIP_OKAY;
144}
145
146/** changes right hand side of exact LP row
147 *
148 * @return \ref SCIP_OKAY is returned if everything worked. Otherwise a suitable error code is passed. See \ref
149 * SCIP_Retcode "SCIP_RETCODE" for a complete list of error codes.
150 *
151 * @pre this method can be called in one of the following stages of the SCIP solving process:
152 * - \ref SCIP_STAGE_INITSOLVE
153 * - \ref SCIP_STAGE_SOLVING
154 */
156 SCIP* scip, /**< SCIP data structure */
157 SCIP_ROWEXACT* row, /**< LP row */
158 SCIP_RATIONAL* rhs /**< new right hand side */
159 )
160{
162
163 assert(!SCIPlpExactDiving(scip->lpexact) || (row->lppos == -1));
164
165 SCIP_CALL( SCIProwExactChgRhs(row, scip->set, scip->lpexact, rhs) );
166
167 return SCIP_OKAY;
168}
169
170/** resolves variables to columns and adds them with the coefficients to the row;
171 * this method caches the row extensions and flushes them afterwards to gain better performance
172 *
173 * @return \ref SCIP_OKAY is returned if everything worked. Otherwise a suitable error code is passed. See \ref
174 * SCIP_Retcode "SCIP_RETCODE" for a complete list of error codes.
175 *
176 * @attention If a coefficients absolute value is below the SCIP epsilon tolerance, the variable with its value is not added.
177 *
178 * @pre this method can be called in one of the following stages of the SCIP solving process:
179 * - \ref SCIP_STAGE_INITSOLVE
180 * - \ref SCIP_STAGE_SOLVING
181 */
183 SCIP* scip, /**< SCIP data structure */
184 SCIP_ROWEXACT* row, /**< LP row */
185 int nvars, /**< number of variables to add to the row */
186 SCIP_VAR** vars, /**< problem variables to add */
187 SCIP_RATIONAL** vals /**< values of coefficients */
188 )
189{
190 int v;
191
192 assert(nvars == 0 || vars != NULL);
193 assert(nvars == 0 || vals != NULL);
194
195 SCIP_CALL( SCIPcheckStage(scip, "SCIPaddVarsToRowExact", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, TRUE, FALSE, FALSE, FALSE, FALSE) );
196
197 /* resize the row to be able to store all variables (at least, if they are COLUMN variables) */
198 SCIP_CALL( SCIProwExactEnsureSize(row, scip->mem->probmem, scip->set, SCIProwGetNNonz(row->fprow) + nvars) );
199
200 /* delay the row sorting */
202
203 /* add the variables to the row */
204 for( v = 0; v < nvars; ++v )
205 {
206 SCIP_CALL( SCIPvarAddToRowExact(vars[v], scip->mem->probmem, scip->set, scip->stat, scip->eventqueue, scip->transprob, scip->lpexact,
207 row, vals[v]) );
208 }
211
212 /* force the row sorting */
213 SCIProwExactForceSort(row, scip->set);
214 row->fprow->rowexact = row;
215
216 return SCIP_OKAY;
217}
218
219/** creates and captures an LP row without any coefficients from a constraint handler
220 *
221 * @return \ref SCIP_OKAY is returned if everything worked. Otherwise a suitable error code is passed. See \ref
222 * SCIP_Retcode "SCIP_RETCODE" for a complete list of error codes.
223 *
224 * @pre this method can be called in one of the following stages of the SCIP solving process:
225 * - \ref SCIP_STAGE_INITSOLVE
226 * - \ref SCIP_STAGE_SOLVING
227 */
229 SCIP* scip, /**< SCIP data structure */
230 SCIP_ROWEXACT** rowexact, /**< pointer to row */
231 SCIP_ROW* fprow, /**< corresponding fp-row */
232 SCIP_ROW* fprowrhs, /**< rhs-part of fp-relaxation of this row if necessary, NULL otherwise */
233 SCIP_RATIONAL* lhs, /**< left hand side of row */
234 SCIP_RATIONAL* rhs, /**< right hand side of row */
235 SCIP_Bool isfprelaxable /**< is it possible to create an fp relaxation of this row? */
236 )
237{
238 SCIP_CALL( SCIPcheckStage(scip, "SCIPcreateEmptyRowConsExact", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, TRUE, FALSE, FALSE, FALSE, FALSE) );
239
241 assert(fprowrhs == NULL || SCIProwGetOriginCons(fprow) == SCIProwGetOriginCons(fprowrhs));
242
243 SCIP_CALL( SCIProwExactCreate(rowexact, fprow, fprowrhs, scip->mem->probmem, scip->set, scip->stat, scip->lpexact, 0, NULL, NULL, lhs, rhs, isfprelaxable) );
244
245 return SCIP_OKAY;
246}
247
248/** creates and captures an exact LP row
249 *
250 * @return \ref SCIP_OKAY is returned if everything worked. Otherwise a suitable error code is passed. See \ref
251 * SCIP_Retcode "SCIP_RETCODE" for a complete list of error codes.
252 *
253 * @pre this method can be called in one of the following stages of the SCIP solving process:
254 * - \ref SCIP_STAGE_SOLVING
255 */
257 SCIP* scip, /**< SCIP data structure */
258 SCIP_ROWEXACT** row, /**< pointer to row */
259 SCIP_ROW* fprow, /**< corresponding fp approximation/relaxation */
260 int len, /**< number of nonzeros in the row */
261 SCIP_COLEXACT** cols, /**< array with columns of row entries */
262 SCIP_RATIONAL** vals, /**< array with coefficients of row entries */
263 SCIP_RATIONAL* lhs, /**< left hand side of row */
264 SCIP_RATIONAL* rhs, /**< right hand side of row */
265 SCIP_Bool isfprelaxable /**< is it possible to make fp-relaxation of this row */
266 )
267{
268 /* Note: Rows can only be created in the solving stage, since otherwise the LP does not exist and, e.g., the norms cannot be computed correctly. */
270
271 SCIP_CALL( SCIProwExactCreate(row, fprow, NULL, scip->mem->probmem, scip->set, scip->stat, scip->lpexact, len, cols, vals, lhs, rhs, isfprelaxable) );
272
273 return SCIP_OKAY;
274}
275
276/** creates and captures an exact LP row from an existing fp row
277 *
278 * @return \ref SCIP_OKAY is returned if everything worked. Otherwise a suitable error code is passed. See \ref
279 * SCIP_Retcode "SCIP_RETCODE" for a complete list of error codes.
280 *
281 * @pre this method can be called in one of the following stages of the SCIP solving process:
282 * - \ref SCIP_STAGE_INITSOLVE
283 * - \ref SCIP_STAGE_SOLVING
284 */
286 SCIP* scip, /**< SCIP data structure */
287 SCIP_ROW* fprow /**< corresponding fp approximation/relaxation */
288 )
289{
290 assert(fprow != NULL);
291 assert(fprow->rowexact == NULL);
292
293 SCIP_CALL( SCIPcheckStage(scip, "SCIPcreateRowExactFromRow", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, TRUE, FALSE, FALSE, FALSE, FALSE) );
294
295 SCIP_CALL( SCIProwExactCreateFromRow(fprow, scip->mem->probmem, scip->set, scip->stat, scip->eventqueue, scip->transprob, scip->lpexact) );
296
297 return SCIP_OKAY;
298}
299
300/** generates two fprows that are a relaxation of the exact row wrt the lhs/rhs, respectively
301 *
302 * @return \ref SCIP_OKAY is returned if everything worked. Otherwise a suitable error code is passed. See \ref
303 * SCIP_Retcode "SCIP_RETCODE" for a complete list of error codes.
304 *
305 * @pre this method can be called in one of the following stages of the SCIP solving process:
306 * - \ref SCIP_STAGE_INITSOLVE
307 * - \ref SCIP_STAGE_SOLVING
308 */
310 SCIP* scip, /**< SCIP data structure */
311 SCIP_ROWEXACT* row, /**< SCIP exact row */
312 SCIP_ROW* rowlhs, /**< fp row-relaxation wrt lhs */
313 SCIP_ROW* rowrhs, /**< fp row-relaxation wrt rhs */
314 SCIP_Bool* onerowrelax, /**< is one row enough to represent the exact row */
315 SCIP_Bool* hasfprelax /**< is it possible to generate relaxations at all for this row? */
316 )
317{
318 assert(row != NULL);
319 assert(rowlhs != NULL);
320 assert(rowrhs != NULL);
321
322 SCIP_CALL( SCIPcheckStage(scip, "SCIPgenerateFpRowsFromRowExact", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, TRUE, FALSE, FALSE, FALSE, FALSE) );
323 SCIP_CALL( SCIProwExactGenerateFpRows(scip->mem->probmem, scip->set, scip->stat, scip->eventqueue, scip->lpexact, scip->transprob, row, rowlhs, rowrhs, onerowrelax, hasfprelax) );
324
325 return SCIP_OKAY;
326}
327
328/** returns the feasibility of a row for the given primal solution
329 *
330 * @return the feasibility of a row for the given primal solution
331 *
332 * @pre this method can be called in one of the following stages of the SCIP solving process:
333 * - \ref SCIP_STAGE_SOLVING
334 */
336 SCIP* scip, /**< SCIP data structure */
337 SCIP_ROWEXACT* row, /**< LP row */
338 SCIP_SOL* sol, /**< primal CIP solution */
339 SCIP_RATIONAL* result /**< result pointer */
340 )
341{
342 SCIP_CALL_ABORT( SCIPcheckStage(scip, "SCIPgetRowSolFeasibilityExact", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE, FALSE) );
343
344 if( sol != NULL )
345 {
346 SCIP_CALL( SCIProwExactGetSolFeasibility(row, scip->set, scip->stat, sol, result) );
347 }
348 else if( SCIPtreeHasCurrentNodeLP(scip->tree) )
349 {
350 SCIP_CALL( SCIProwExactGetLPFeasibility(row, scip->set, scip->stat, scip->lpexact, result) );
351 }
352 else
353 {
354 SCIP_CALL( SCIProwExactGetPseudoFeasibility(row, scip->set, scip->stat, result) );
355 }
356
357 return SCIP_OKAY;
358}
359
360/** returns the activity of a row for the given primal solution
361 *
362 * @return the activitiy of a row for the given primal solution
363 *
364 * @pre this method can be called in one of the following stages of the SCIP solving process:
365 * - \ref SCIP_STAGE_SOLVING
366 */
368 SCIP* scip, /**< SCIP data structure */
369 SCIP_ROWEXACT* row, /**< LP row */
370 SCIP_SOL* sol, /**< primal CIP solution */
371 SCIP_Bool useexact, /**< true if sol should be considered instead of sol */
372 SCIP_RATIONAL* result /**< result pointer */
373 )
374{
375 SCIP_CALL_ABORT( SCIPcheckStage(scip, "SCIPgetRowSolActivityExact", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, TRUE, FALSE, FALSE, FALSE) );
376
377 if( sol != NULL )
378 {
379 SCIP_CALL( SCIProwExactGetSolActivity(row, scip->set, scip->stat, sol, useexact, result) );
380 }
381 else if( SCIPtreeHasCurrentNodeLP(scip->tree) )
382 SCIPrationalSetRational(result, SCIProwExactGetLPActivity(row, scip->stat, scip->lpexact));
383 else
385
386 return SCIP_OKAY;
387}
388
389/** returns the activity of a row for the given primal solution with running error analysis
390 *
391 * @return the activitiy of a row for the given primal solution and the error bound of the activity; returns true on success
392 *
393 * @pre this method can be called in one of the following stages of the SCIP solving process:
394 * - \ref SCIP_STAGE_SOLVING
395 */
397 SCIP* scip, /**< SCIP data structure */
398 SCIP_ROWEXACT* row, /**< LP row */
399 SCIP_SOL* sol, /**< primal CIP solution */
400 SCIP_Real* activity, /**< the approximate activity */
401 SCIP_Real* errorbound /**< the error bound */
402 )
403{
404 SCIP_CALL_ABORT( SCIPcheckStage(scip, "SCIPgetRowSolActivityWithErrorboundExact", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, TRUE, FALSE, FALSE, FALSE) );
405
406 return SCIProwExactGetSolActivityWithErrorbound(row, scip->set, scip->stat, sol, activity, errorbound);
407}
408
409/** output exact row to file stream via the message handler system
410 *
411 * @return \ref SCIP_OKAY is returned if everything worked. Otherwise a suitable error code is passed. See \ref
412 * SCIP_Retcode "SCIP_RETCODE" for a complete list of error codes.
413 *
414 * @pre this method can be called in one of the following stages of the SCIP solving process:
415 * - \ref SCIP_STAGE_SOLVING
416 * - \ref SCIP_STAGE_SOLVED
417 * - \ref SCIP_STAGE_EXITSOLVE
418 */
420 SCIP* scip, /**< SCIP data structure */
421 SCIP_ROWEXACT* row, /**< LP row */
422 FILE* file /**< output file (or NULL for standard output) */
423 )
424{
425 assert(row != NULL);
426
428
429 SCIProwExactPrint(row, scip->messagehdlr, file);
430
431 return SCIP_OKAY;
432}
433
434/** gets objective value of current exact LP (which is the sum of column and loose objective value)
435 *
436 * @pre This method can be called if @p scip is in one of the following stages:
437 * - \ref SCIP_STAGE_SOLVING
438 *
439 * @note This method returns the objective value of the current exact LP solution, which might be primal or dual infeasible
440 * if a limit was hit during solving. It must not be used as a dual bound if the exact LP solution status returned by
441 * SCIPgetLPExactSolstat() is SCIP_LPSOLSTAT_ITERLIMIT or SCIP_LPSOLSTAT_TIMELIMIT.
442 *
443 * See \ref SCIP_Stage "SCIP_STAGE" for a complete list of all possible solving stages.
444 */
446 SCIP* scip, /**< SCIP data structure */
447 SCIP_RATIONAL* result /**< result pointer */
448 )
449{
451
452 SCIPlpExactGetObjval(scip->lpexact, scip->set, result);
453}
454
455/** returns whether the exact lp was solved */
457 SCIP* scip /**< SCIP data structure */
458 )
459{
460 assert(scip != NULL);
461 assert(scip->lpexact != NULL);
462
463 return scip->lpexact->solved && scip->lpexact->flushed;
464}
465
466/** gets solution status of current exact LP
467 *
468 * @return the solution status of current exact LP.
469 *
470 * @pre This method can be called if @p scip is in one of the following stages:
471 * - \ref SCIP_STAGE_SOLVING
472 *
473 * See \ref SCIP_Stage "SCIP_STAGE" for a complete list of all possible solving stages.
474 */
476 SCIP* scip /**< SCIP data structure */
477 )
478{
480
481 /* We can check the floating point flag here since the exact and floating point LP is constructed at the same
482 * time.
483 */
485 return SCIPlpExactGetSolstat(scip->lpexact);
486 else
488}
489
490/** initiates exact LP diving, making methods SCIPchgVarObjExactDive(), SCIPchgVarLbExactDive(), and SCIPchgVarUbExactDive() available
491 *
492 * @return \ref SCIP_OKAY is returned if everything worked. Otherwise a suitable error code is passed. See \ref
493 * SCIP_Retcode "SCIP_RETCODE" for a complete list of error codes.
494 *
495 * @pre This method can be called if @p scip is in one of the following stages:
496 * - \ref SCIP_STAGE_SOLVING
497 *
498 * See \ref SCIP_Stage "SCIP_STAGE" for a complete list of all possible solving stages.
499 *
500 * @note In parallel to exact LP diving, this method also starts the regular LP diving mode by calling SCIPstartDive().
501 */
503 SCIP* scip /**< SCIP data structure */
504 )
505{
506 assert(scip != NULL);
507
510
511 if( SCIPlpExactDiving(scip->lpexact) )
512 {
513 SCIPerrorMessage("already in exact diving mode\n");
514 return SCIP_INVALIDCALL;
515 }
516
517 if( SCIPlpDiving(scip->lp) )
518 {
519 SCIPerrorMessage("cannot start exact diving while being in diving mode\n");
520 return SCIP_INVALIDCALL;
521 }
522
523 if( SCIPtreeProbing(scip->tree) )
524 {
525 SCIPerrorMessage("cannot start exact diving while being in probing mode\n");
526 return SCIP_INVALIDCALL;
527 }
528
529 /* We start the exact LP dive parallel to the floating-point LP dive. This is necessary because we need to work with
530 * several flags and counters of the floating-point LP.
531 */
533
534 SCIP_CALL( SCIPlpExactStartDive(scip->lpexact, scip->mem->probmem, scip->set, scip->stat) );
535
536 return SCIP_OKAY;
537}
538
539/** checks if exact diving mode is possible at this point in time
540 *
541 * @return \ref SCIP_OKAY is returned if everything worked. Otherwise a suitable error code is passed. See \ref
542 * SCIP_Retcode "SCIP_RETCODE" for a complete list of error codes.
543 *
544 * @pre This method can be called if @p scip is in one of the following stages:
545 * - \ref SCIP_STAGE_SOLVING
546 *
547 * See \ref SCIP_Stage "SCIP_STAGE" for a complete list of all possible solving stages.
548 *
549 * @note In parallel to exact LP diving, this method also starts the regular LP diving mode by calling SCIPstartDive().
550 */
552 SCIP* scip /**< SCIP data structure */
553 )
554{
555 assert(scip != NULL);
556
559
560 if( SCIPlpExactDiving(scip->lpexact) )
561 return FALSE;
562
563 if( SCIPlpDiving(scip->lp) )
564 return FALSE;
565
566 if( SCIPtreeProbing(scip->tree) )
567 return FALSE;
568
569 if( !SCIPlpIsSolved(scip->lp) )
570 return FALSE;
571
572 return TRUE;
573}
574
575/** returns whether we are in exact diving mode
576 *
577 * @return whether we are in exact diving mode.
578 *
579 * @pre This method can be called if @p scip is in one of the following stages:
580 * - \ref SCIP_STAGE_TRANSFORMING
581 * - \ref SCIP_STAGE_TRANSFORMED
582 * - \ref SCIP_STAGE_INITPRESOLVE
583 * - \ref SCIP_STAGE_PRESOLVING
584 * - \ref SCIP_STAGE_EXITPRESOLVE
585 * - \ref SCIP_STAGE_PRESOLVED
586 * - \ref SCIP_STAGE_INITSOLVE
587 * - \ref SCIP_STAGE_SOLVING
588 * - \ref SCIP_STAGE_SOLVED
589 * - \ref SCIP_STAGE_EXITSOLVE
590 * - \ref SCIP_STAGE_FREETRANS
591 *
592 * See \ref SCIP_Stage "SCIP_STAGE" for a complete list of all possible solving stages.
593 */
595 SCIP* scip /**< SCIP data structure */
596 )
597{
598 assert(scip != NULL);
599
601
602 return SCIPlpExactDiving(scip->lpexact);
603}
604
605/** quits exact LP diving and resets bounds and objective values of columns to the current node's values
606 *
607 * @return \ref SCIP_OKAY is returned if everything worked. Otherwise a suitable error code is passed. See \ref
608 * SCIP_Retcode "SCIP_RETCODE" for a complete list of error codes.
609 *
610 * @pre This method can be called if @p scip is in one of the following stages:
611 * - \ref SCIP_STAGE_SOLVING
612 *
613 * See \ref SCIP_Stage "SCIP_STAGE" for a complete list of all possible solving stages.
614 */
616 SCIP* scip /**< SCIP data structure */
617 )
618{
619 assert(scip != NULL);
620
622
623 if( !SCIPlpExactDiving(scip->lpexact) )
624 {
625 SCIPerrorMessage("not in exact diving mode\n");
626 return SCIP_INVALIDCALL;
627 }
628
629 /* end floating-point LP dive, see comment in SCIPstartExactDive() */
631
632 /* unmark the diving flag in the exact LP and reset all variables' objective and bound values */
633 SCIP_CALL( SCIPlpExactEndDive(scip->lpexact, scip->mem->probmem, scip->set, scip->stat, scip->eventqueue,
634 scip->transprob->vars, scip->transprob->nvars) );
635
636 /* reset the probably changed LP's cutoff bound */
637 SCIP_CALL( SCIPlpSetCutoffbound(scip->lp, scip->set, scip->transprob, scip->primal->cutoffbound) );
638 assert(scip->lp->cutoffbound == scip->primal->cutoffbound); /*lint !e777*/
639
640 return SCIP_OKAY;
641}
642
643/** solves the exact LP of the current dive; no separation or pricing is applied
644 *
645 * @return \ref SCIP_OKAY is returned if everything worked. Otherwise a suitable error code is passed. See \ref
646 * SCIP_Retcode "SCIP_RETCODE" for a complete list of error codes.
647 *
648 * @pre This method can be called if @p scip is in one of the following stages:
649 * - \ref SCIP_STAGE_SOLVING
650 *
651 * See \ref SCIP_Stage "SCIP_STAGE" for a complete list of all possible solving stages.
652 */
654 SCIP* scip, /**< SCIP data structure */
655 int itlim, /**< maximal number of LP iterations to perform, or -1 for no limit */
656 SCIP_Bool* lperror, /**< pointer to store whether an unresolved LP error occurred */
657 SCIP_Bool* cutoff /**< pointer to store whether the diving LP was infeasible or the objective
658 * limit was reached (or NULL, if not needed) */
659 )
660{
661 SCIP_RATIONAL* objval;
662
663 assert(scip != NULL);
664
665 SCIP_CALL( SCIPcheckStage(scip, "SCIPsolveExactDiveLP", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE, FALSE) );
666
667 if( !SCIPlpExactDiving(scip->lpexact) )
668 {
669 SCIPerrorMessage("not in exact diving mode\n");
670 return SCIP_INVALIDCALL;
671 }
672
673 if( cutoff != NULL )
674 *cutoff = FALSE;
675
676 /* solve diving LP */
677 SCIP_CALL( SCIPlpExactSolveAndEval(scip->lpexact, scip->lp, scip->set, scip->messagehdlr, scip->mem->probmem, scip->stat,
678 scip->eventqueue, scip->transprob, (SCIP_Longint)itlim, lperror, FALSE) );
679
680 if( !(*lperror) )
681 {
682 SCIP_CALL( SCIPrationalCreateBuffer(scip->set->buffer, &objval) );
683 SCIPgetLPExactObjval(scip, objval);
684
685 /* the LP is infeasible or the objective limit was reached */
689 {
690 if( cutoff != NULL )
691 *cutoff = TRUE;
692 }
693
694 SCIPrationalFreeBuffer(scip->set->buffer, &objval);
695 }
696
697 return SCIP_OKAY;
698}
699
700/** changes variable's lower bound in current exact dive
701 *
702 * @return \ref SCIP_OKAY is returned if everything worked. Otherwise a suitable error code is passed. See \ref
703 * SCIP_Retcode "SCIP_RETCODE" for a complete list of error codes.
704 *
705 * @pre This method can be called if @p scip is in one of the following stages:
706 * - \ref SCIP_STAGE_SOLVING
707 *
708 * See \ref SCIP_Stage "SCIP_STAGE" for a complete list of all possible solving stages.
709 */
711 SCIP* scip, /**< SCIP data structure */
712 SCIP_VAR* var, /**< variable to change the bound for */
713 SCIP_RATIONAL* newbound /**< new value for bound */
714 )
715{
716 assert(scip != NULL);
717 assert(var != NULL);
718
719 SCIP_CALL( SCIPcheckStage(scip, "SCIPchgVarLbExactDive", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE, FALSE) );
720
721 if( !SCIPlpExactDiving(scip->lpexact) )
722 {
723 SCIPerrorMessage("not in exact diving mode\n");
724 return SCIP_INVALIDCALL;
725 }
726
727 SCIP_CALL( SCIPvarChgLbExactDive(var, scip->set, scip->lpexact, newbound) );
728
729 return SCIP_OKAY;
730}
731
732/** changes variable's upper bound in current exact dive
733 *
734 * @return \ref SCIP_OKAY is returned if everything worked. Otherwise a suitable error code is passed. See \ref
735 * SCIP_Retcode "SCIP_RETCODE" for a complete list of error codes.
736 *
737 * @pre This method can be called if @p scip is in one of the following stages:
738 * - \ref SCIP_STAGE_SOLVING
739 *
740 * See \ref SCIP_Stage "SCIP_STAGE" for a complete list of all possible solving stages.
741 */
743 SCIP* scip, /**< SCIP data structure */
744 SCIP_VAR* var, /**< variable to change the bound for */
745 SCIP_RATIONAL* newbound /**< new value for bound */
746 )
747{
748 assert(scip != NULL);
749 assert(var != NULL);
750
751 SCIP_CALL( SCIPcheckStage(scip, "SCIPchgVarUbExactDive", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE, FALSE) );
752
753 if( !SCIPlpExactDiving(scip->lpexact) )
754 {
755 SCIPerrorMessage("not in exact diving mode\n");
756 return SCIP_INVALIDCALL;
757 }
758
759 SCIP_CALL( SCIPvarChgUbExactDive(var, scip->set, scip->lpexact, newbound) );
760
761 return SCIP_OKAY;
762}
763
764/** writes current exact LP to a file
765 *
766 * @return \ref SCIP_OKAY is returned if everything worked. Otherwise a suitable error code is passed. See \ref
767 * SCIP_Retcode "SCIP_RETCODE" for a complete list of error codes.
768 *
769 * @pre This method can be called if @p scip is in one of the following stages:
770 * - \ref SCIP_STAGE_SOLVING
771 *
772 * See \ref SCIP_Stage "SCIP_STAGE" for a complete list of all possible solving stages.
773 */
775 SCIP* scip, /**< SCIP data structure */
776 const char* filename /**< file name */
777 )
778{
779 SCIP_Bool cutoff;
780
782
784 {
785 SCIP_CALL( SCIPconstructCurrentLP(scip->mem->probmem, scip->set, scip->stat, scip->transprob, scip->origprob,
786 scip->tree, scip->reopt, scip->lp, scip->pricestore, scip->sepastore, scip->cutpool, scip->branchcand,
787 scip->eventqueue, scip->eventfilter, scip->cliquetable, FALSE, &cutoff) );
788 }
789
790 /* we need a flushed lp to write the current lp */
791 SCIP_CALL( SCIPlpExactSyncLPs(scip->lpexact, scip->mem->probmem, scip->set) );
792 SCIP_CALL( SCIPlpExactFlush(scip->lpexact, scip->mem->probmem, scip->set, scip->eventqueue) );
793
794 SCIP_CALL( SCIPlpExactWrite(scip->lpexact, filename) );
795
796 return SCIP_OKAY;
797}
internal methods for conflict analysis
methods for debugging
#define SCIPcheckStage(scip, method, init, problem, transforming, transformed, initpresolve, presolving, exitpresolve, presolved, initsolve, solving, solved, exitsolve, freetrans, freescip)
Definition: debug.h:364
#define NULL
Definition: def.h:248
#define SCIP_Longint
Definition: def.h:141
#define SCIP_Bool
Definition: def.h:91
#define SCIP_Real
Definition: def.h:156
#define TRUE
Definition: def.h:93
#define FALSE
Definition: def.h:94
#define SCIP_CALL_ABORT(x)
Definition: def.h:334
#define SCIP_CALL(x)
Definition: def.h:355
SCIP_MESSAGEHDLR * SCIPgetMessagehdlr(SCIP *scip)
Definition: scip_message.c:88
SCIP_RETCODE SCIPstartDive(SCIP *scip)
Definition: scip_lp.c:2206
SCIP_RETCODE SCIPendDive(SCIP *scip)
Definition: scip_lp.c:2255
SCIP_RETCODE SCIPreleaseRowExact(SCIP *scip, SCIP_ROWEXACT **row)
Definition: scip_lpexact.c:110
SCIP_RETCODE SCIPsolveExactDiveLP(SCIP *scip, int itlim, SCIP_Bool *lperror, SCIP_Bool *cutoff)
Definition: scip_lpexact.c:653
SCIP_Bool SCIPisExactDivePossible(SCIP *scip)
Definition: scip_lpexact.c:551
SCIP_Bool SCIPgetRowSolActivityWithErrorboundExact(SCIP *scip, SCIP_ROWEXACT *row, SCIP_SOL *sol, SCIP_Real *activity, SCIP_Real *errorbound)
Definition: scip_lpexact.c:396
SCIP_RETCODE SCIPprintRowExact(SCIP *scip, SCIP_ROWEXACT *row, FILE *file)
Definition: scip_lpexact.c:419
SCIP_RETCODE SCIPgenerateFpRowsFromRowExact(SCIP *scip, SCIP_ROWEXACT *row, SCIP_ROW *rowlhs, SCIP_ROW *rowrhs, SCIP_Bool *onerowrelax, SCIP_Bool *hasfprelax)
Definition: scip_lpexact.c:309
SCIP_RETCODE SCIPgetRowSolActivityExact(SCIP *scip, SCIP_ROWEXACT *row, SCIP_SOL *sol, SCIP_Bool useexact, SCIP_RATIONAL *result)
Definition: scip_lpexact.c:367
SCIP_RETCODE SCIPchgVarLbExactDive(SCIP *scip, SCIP_VAR *var, SCIP_RATIONAL *newbound)
Definition: scip_lpexact.c:710
SCIP_RETCODE SCIPgetRowSolFeasibilityExact(SCIP *scip, SCIP_ROWEXACT *row, SCIP_SOL *sol, SCIP_RATIONAL *result)
Definition: scip_lpexact.c:335
SCIP_LPSOLSTAT SCIPgetLPExactSolstat(SCIP *scip)
Definition: scip_lpexact.c:475
SCIP_RETCODE SCIPcreateRowExact(SCIP *scip, SCIP_ROWEXACT **row, SCIP_ROW *fprow, int len, SCIP_COLEXACT **cols, SCIP_RATIONAL **vals, SCIP_RATIONAL *lhs, SCIP_RATIONAL *rhs, SCIP_Bool isfprelaxable)
Definition: scip_lpexact.c:256
SCIP_RETCODE SCIPchgRowExactLhs(SCIP *scip, SCIP_ROWEXACT *row, SCIP_RATIONAL *lhs)
Definition: scip_lpexact.c:131
SCIP_RETCODE SCIPcreateEmptyRowConsExact(SCIP *scip, SCIP_ROWEXACT **rowexact, SCIP_ROW *fprow, SCIP_ROW *fprowrhs, SCIP_RATIONAL *lhs, SCIP_RATIONAL *rhs, SCIP_Bool isfprelaxable)
Definition: scip_lpexact.c:228
SCIP_RETCODE SCIPstartExactDive(SCIP *scip)
Definition: scip_lpexact.c:502
SCIP_RETCODE SCIPendExactDive(SCIP *scip)
Definition: scip_lpexact.c:615
SCIP_RETCODE SCIPwriteLPexact(SCIP *scip, const char *filename)
Definition: scip_lpexact.c:774
SCIP_RETCODE SCIPchgVarUbExactDive(SCIP *scip, SCIP_VAR *var, SCIP_RATIONAL *newbound)
Definition: scip_lpexact.c:742
SCIP_RETCODE SCIPchgRowExactRhs(SCIP *scip, SCIP_ROWEXACT *row, SCIP_RATIONAL *rhs)
Definition: scip_lpexact.c:155
SCIP_RETCODE SCIPaddVarsToRowExact(SCIP *scip, SCIP_ROWEXACT *row, int nvars, SCIP_VAR **vars, SCIP_RATIONAL **vals)
Definition: scip_lpexact.c:182
SCIP_Bool SCIPlpExactIsSolved(SCIP *scip)
Definition: scip_lpexact.c:456
SCIP_RETCODE SCIPcaptureRowExact(SCIP *scip, SCIP_ROWEXACT *row)
Definition: scip_lpexact.c:88
SCIP_RETCODE SCIPcreateRowExactFromRow(SCIP *scip, SCIP_ROW *fprow)
Definition: scip_lpexact.c:285
SCIP_Bool SCIPinExactDive(SCIP *scip)
Definition: scip_lpexact.c:594
void SCIPgetLPExactObjval(SCIP *scip, SCIP_RATIONAL *result)
Definition: scip_lpexact.c:445
SCIP_NODETYPE SCIPnodeGetType(SCIP_NODE *node)
Definition: tree.c:8473
void SCIPrationalFreeBuffer(BMS_BUFMEM *bufmem, SCIP_RATIONAL **rational)
Definition: rational.cpp:473
SCIP_RETCODE SCIPrationalCreateBuffer(BMS_BUFMEM *bufmem, SCIP_RATIONAL **rational)
Definition: rational.cpp:123
void SCIPrationalSetRational(SCIP_RATIONAL *res, SCIP_RATIONAL *src)
Definition: rational.cpp:569
SCIP_Bool SCIPrationalIsGE(SCIP_RATIONAL *rat1, SCIP_RATIONAL *rat2)
Definition: rational.cpp:1512
SCIP_CONS * SCIProwGetOriginCons(SCIP_ROW *row)
Definition: lp.c:17835
int SCIProwGetNNonz(SCIP_ROW *row)
Definition: lp.c:17607
SCIP_ROWORIGINTYPE SCIProwGetOrigintype(SCIP_ROW *row)
Definition: lp.c:17825
SCIP_RATIONAL * SCIPgetCutoffboundExact(SCIP *scip)
SCIP_NODE * SCIPgetCurrentNode(SCIP *scip)
Definition: scip_tree.c:91
SCIP_Bool SCIPlpDiving(SCIP_LP *lp)
Definition: lp.c:18251
void SCIProwPrint(SCIP_ROW *row, SCIP_MESSAGEHDLR *messagehdlr, FILE *file)
Definition: lp.c:5514
SCIP_RETCODE SCIPlpSetCutoffbound(SCIP_LP *lp, SCIP_SET *set, SCIP_PROB *prob, SCIP_Real cutoffbound)
Definition: lp.c:10451
SCIP_Bool SCIPlpIsSolved(SCIP_LP *lp)
Definition: lp.c:18211
internal methods for LP management
SCIP_RETCODE SCIProwExactGetSolFeasibility(SCIP_ROWEXACT *row, SCIP_SET *set, SCIP_STAT *stat, SCIP_SOL *sol, SCIP_RATIONAL *result)
Definition: lpexact.c:5446
SCIP_RETCODE SCIPlpExactSolveAndEval(SCIP_LPEXACT *lpexact, SCIP_LP *lp, SCIP_SET *set, SCIP_MESSAGEHDLR *messagehdlr, BMS_BLKMEM *blkmem, SCIP_STAT *stat, SCIP_EVENTQUEUE *eventqueue, SCIP_PROB *prob, SCIP_Longint itlim, SCIP_Bool *lperror, SCIP_Bool usefarkas)
Definition: lpexact.c:4477
SCIP_RATIONAL * SCIProwExactGetLPActivity(SCIP_ROWEXACT *row, SCIP_STAT *stat, SCIP_LPEXACT *lpexact)
Definition: lpexact.c:5713
SCIP_RETCODE SCIProwExactGetLPFeasibility(SCIP_ROWEXACT *row, SCIP_SET *set, SCIP_STAT *stat, SCIP_LPEXACT *lpexact, SCIP_RATIONAL *result)
Definition: lpexact.c:5655
void SCIProwExactPrint(SCIP_ROWEXACT *row, SCIP_MESSAGEHDLR *messagehdlr, FILE *file)
Definition: lpexact.c:4953
SCIP_RETCODE SCIPlpExactStartDive(SCIP_LPEXACT *lpexact, BMS_BLKMEM *blkmem, SCIP_SET *set, SCIP_STAT *stat)
Definition: lpexact.c:8177
SCIP_RETCODE SCIPlpExactSyncLPs(SCIP_LPEXACT *lpexact, BMS_BLKMEM *blkmem, SCIP_SET *set)
Definition: lpexact.c:8474
SCIP_RETCODE SCIProwExactEnsureSize(SCIP_ROWEXACT *row, BMS_BLKMEM *blkmem, SCIP_SET *set, int num)
Definition: lpexact.c:6062
void SCIProwExactCapture(SCIP_ROWEXACT *row)
Definition: lpexact.c:4940
SCIP_RETCODE SCIProwExactCreate(SCIP_ROWEXACT **row, SCIP_ROW *fprow, SCIP_ROW *fprowrhs, BMS_BLKMEM *blkmem, SCIP_SET *set, SCIP_STAT *stat, SCIP_LPEXACT *lpexact, int len, SCIP_COLEXACT **cols, SCIP_RATIONAL **vals, SCIP_RATIONAL *lhs, SCIP_RATIONAL *rhs, SCIP_Bool isfprelaxable)
Definition: lpexact.c:3138
void SCIProwExactDelaySort(SCIP_ROWEXACT *rowexact)
Definition: lpexact.c:5867
SCIP_RETCODE SCIProwExactRelease(SCIP_ROWEXACT **row, BMS_BLKMEM *blkmem, SCIP_SET *set, SCIP_LPEXACT *lpexact)
Definition: lpexact.c:5583
SCIP_RETCODE SCIProwExactGetPseudoFeasibility(SCIP_ROWEXACT *row, SCIP_SET *set, SCIP_STAT *stat, SCIP_RATIONAL *result)
Definition: lpexact.c:5684
void SCIProwExactForceSort(SCIP_ROWEXACT *rowexact, SCIP_SET *set)
Definition: lpexact.c:5878
SCIP_Bool SCIProwExactGetSolActivityWithErrorbound(SCIP_ROWEXACT *rowexact, SCIP_SET *set, SCIP_STAT *stat, SCIP_SOL *sol, SCIP_Real *activity, SCIP_Real *errorbound)
Definition: lpexact.c:5475
SCIP_Bool SCIPlpExactDiving(SCIP_LPEXACT *lpexact)
Definition: lpexact.c:8423
SCIP_RETCODE SCIProwExactCreateFromRow(SCIP_ROW *fprow, BMS_BLKMEM *blkmem, SCIP_SET *set, SCIP_STAT *stat, SCIP_EVENTQUEUE *eventqueue, SCIP_PROB *prob, SCIP_LPEXACT *lpexact)
Definition: lpexact.c:3373
SCIP_RETCODE SCIPlpExactEndDive(SCIP_LPEXACT *lpexact, BMS_BLKMEM *blkmem, SCIP_SET *set, SCIP_STAT *stat, SCIP_EVENTQUEUE *eventqueue, SCIP_VAR **vars, int nvars)
Definition: lpexact.c:8280
SCIP_RETCODE SCIProwExactGetSolActivity(SCIP_ROWEXACT *rowexact, SCIP_SET *set, SCIP_STAT *stat, SCIP_SOL *sol, SCIP_Bool useexact, SCIP_RATIONAL *result)
Definition: lpexact.c:5529
SCIP_LPSOLSTAT SCIPlpExactGetSolstat(SCIP_LPEXACT *lpexact)
Definition: lpexact.c:8084
SCIP_RATIONAL * SCIProwExactGetPseudoActivity(SCIP_ROWEXACT *row, SCIP_STAT *stat)
Definition: lpexact.c:5734
SCIP_RETCODE SCIProwExactGenerateFpRows(BMS_BLKMEM *blkmem, SCIP_SET *set, SCIP_STAT *stat, SCIP_EVENTQUEUE *eventqueue, SCIP_LPEXACT *lpexact, SCIP_PROB *prob, SCIP_ROWEXACT *row, SCIP_ROW *rowlhs, SCIP_ROW *rowrhs, SCIP_Bool *onerowrelax, SCIP_Bool *hasfprelax)
Definition: lpexact.c:3454
void SCIPlpExactGetObjval(SCIP_LPEXACT *lpexact, SCIP_SET *set, SCIP_RATIONAL *res)
Definition: lpexact.c:7416
SCIP_RETCODE SCIProwExactChgRhs(SCIP_ROWEXACT *rowexact, SCIP_SET *set, SCIP_LPEXACT *lpexact, SCIP_RATIONAL *rhs)
Definition: lpexact.c:8063
SCIP_RETCODE SCIPlpExactWrite(SCIP_LPEXACT *lpexact, const char *fname)
Definition: lpexact.c:8434
SCIP_RETCODE SCIPlpExactFlush(SCIP_LPEXACT *lpexact, BMS_BLKMEM *blkmem, SCIP_SET *set, SCIP_EVENTQUEUE *eventqueue)
Definition: lpexact.c:3651
SCIP_RETCODE SCIProwExactChgLhs(SCIP_ROWEXACT *rowexact, SCIP_SET *set, SCIP_LPEXACT *lpexact, SCIP_RATIONAL *lhs)
Definition: lpexact.c:8042
internal methods for exact LP management
interface methods for specific exact LP solvers
internal methods for storing and manipulating the main problem
public methods for LP management
public methods for message output
#define SCIPerrorMessage
Definition: pub_message.h:64
#define SCIPdebug(x)
Definition: pub_message.h:93
public methods for branch and bound tree
public methods for the LP relaxation, rows and columns
public methods for the LP relaxation, rows and columns
public methods for memory management
public methods for numerical tolerances
public methods for solutions
public methods for querying solving statistics
public methods for the branch-and-bound tree
public methods for SCIP variables
internal methods for storing separated exact cuts
internal methods for global SCIP settings
SCIP_RETCODE SCIPconstructCurrentLP(BMS_BLKMEM *blkmem, SCIP_SET *set, SCIP_STAT *stat, SCIP_PROB *transprob, SCIP_PROB *origprob, SCIP_TREE *tree, SCIP_REOPT *reopt, SCIP_LP *lp, SCIP_PRICESTORE *pricestore, SCIP_SEPASTORE *sepastore, SCIP_CUTPOOL *cutpool, SCIP_BRANCHCAND *branchcand, SCIP_EVENTQUEUE *eventqueue, SCIP_EVENTFILTER *eventfilter, SCIP_CLIQUETABLE *cliquetable, SCIP_Bool newinitconss, SCIP_Bool *cutoff)
Definition: solve.c:1407
internal methods for main solving loop and node processing
SCIP_ROW * fprow
SCIP_ROWEXACT * rowexact
Definition: struct_lp.h:235
data structures for exact LP management
datastructures for block memory pools and memory buffers
datastructures for collecting primal CIP solutions and primal informations
datastructures for storing and manipulating the main problem
SCIP main data structure.
SCIP_Bool SCIPtreeIsFocusNodeLPConstructed(SCIP_TREE *tree)
Definition: tree.c:9442
SCIP_Bool SCIPtreeProbing(SCIP_TREE *tree)
Definition: tree.c:9361
SCIP_Bool SCIPtreeHasCurrentNodeLP(SCIP_TREE *tree)
Definition: tree.c:9496
internal methods for branch and bound tree
enum SCIP_LPSolStat SCIP_LPSOLSTAT
Definition: type_lp.h:52
@ SCIP_ROWORIGINTYPE_CONS
Definition: type_lp.h:75
@ SCIP_LPSOLSTAT_NOTSOLVED
Definition: type_lp.h:43
@ SCIP_LPSOLSTAT_OPTIMAL
Definition: type_lp.h:44
@ SCIP_LPSOLSTAT_INFEASIBLE
Definition: type_lp.h:45
@ SCIP_LPSOLSTAT_OBJLIMIT
Definition: type_lp.h:47
@ SCIP_OKAY
Definition: type_retcode.h:42
@ SCIP_INVALIDCALL
Definition: type_retcode.h:51
enum SCIP_Retcode SCIP_RETCODE
Definition: type_retcode.h:63
@ SCIP_NODETYPE_FOCUSNODE
Definition: type_tree.h:41
SCIP_RETCODE SCIPvarChgLbExactDive(SCIP_VAR *var, SCIP_SET *set, SCIP_LPEXACT *lpexact, SCIP_RATIONAL *newbound)
Definition: var.c:13365
SCIP_RETCODE SCIPvarChgUbExactDive(SCIP_VAR *var, SCIP_SET *set, SCIP_LPEXACT *lpexact, SCIP_RATIONAL *newbound)
Definition: var.c:13512
SCIP_RETCODE SCIPvarAddToRowExact(SCIP_VAR *var, BMS_BLKMEM *blkmem, SCIP_SET *set, SCIP_STAT *stat, SCIP_EVENTQUEUE *eventqueue, SCIP_PROB *prob, SCIP_LPEXACT *lpexact, SCIP_ROWEXACT *rowexact, SCIP_RATIONAL *val)
Definition: var.c:20135
internal methods for problem variables