Scippy

SCIP

Solving Constraint Integer Programs

scip_solvingstats.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_solvingstats.c
26 * @ingroup OTHER_CFILES
27 * @brief public methods for querying solving statistics
28 * @author Tobias Achterberg
29 * @author Timo Berthold
30 * @author Gerald Gamrath
31 * @author Leona Gottwald
32 * @author Stefan Heinz
33 * @author Gregor Hendel
34 * @author Thorsten Koch
35 * @author Alexander Martin
36 * @author Marc Pfetsch
37 * @author Michael Winkler
38 * @author Kati Wolter
39 *
40 * @todo check all SCIP_STAGE_* switches, and include the new stages TRANSFORMED and INITSOLVE
41 */
42
43/*---+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8----+----9----+----0----+----1----+----2*/
44
46#include "scip/branch.h"
47#include "scip/clock.h"
48#include "scip/concsolver.h"
49#include "scip/concurrent.h"
50#include "scip/conflict.h"
51#include "scip/conflictstore.h"
52#include "scip/debug.h"
53#include "scip/disp.h"
54#include "scip/history.h"
55#include "scip/implics.h"
56#include "scip/pricestore.h"
57#include "scip/primal.h"
58#include "scip/prob.h"
59#include "scip/pub_benderscut.h"
60#include "scip/pub_benders.h"
61#include "scip/pub_branch.h"
62#include "scip/pub_compr.h"
63#include "scip/pub_cons.h"
64#include "scip/pub_cutpool.h"
65#include "scip/pub_cutsel.h"
66#include "scip/pub_expr.h"
67#include "scip/pub_heur.h"
68#include "scip/pub_history.h"
69#include "scip/pub_message.h"
70#include "scip/pub_misc.h"
71#include "scip/pub_misc_sort.h"
72#include "scip/pub_nlpi.h"
73#include "scip/pub_presol.h"
74#include "scip/pub_pricer.h"
75#include "scip/pub_prop.h"
76#include "scip/pub_reader.h"
77#include "scip/pub_relax.h"
78#include "scip/pub_reopt.h"
79#include "scip/pub_sepa.h"
80#include "scip/pub_sol.h"
81#include "scip/pub_table.h"
82#include "scip/pub_var.h"
83#include "scip/reader.h"
84#include "scip/reopt.h"
85#include "scip/scip_benders.h"
86#include "scip/scip_general.h"
87#include "scip/scip_mem.h"
88#include "scip/scip_message.h"
89#include "scip/scip_nlp.h"
90#include "scip/scip_numerics.h"
91#include "scip/scip_sol.h"
93#include "scip/scip_table.h"
94#include "scip/scip_timing.h"
95#include "scip/scip_var.h"
96#include "scip/sepastore.h"
97#include "scip/set.h"
98#include "scip/sol.h"
99#include "scip/stat.h"
100#include "scip/struct_mem.h"
101#include "scip/struct_primal.h"
102#include "scip/struct_prob.h"
103#include "scip/struct_scip.h"
104#include "scip/struct_set.h"
105#include "scip/struct_stat.h"
106#include "scip/syncstore.h"
107#include "scip/table.h"
108#include "scip/tree.h"
109#include "scip/var.h"
110#include <string.h>
111
112/** gets number of branch and bound runs performed, including the current run
113 *
114 * @return the number of branch and bound runs performed, including the current run
115 *
116 * @pre This method can be called if SCIP is in one of the following stages:
117 * - \ref SCIP_STAGE_PROBLEM
118 * - \ref SCIP_STAGE_TRANSFORMING
119 * - \ref SCIP_STAGE_TRANSFORMED
120 * - \ref SCIP_STAGE_INITPRESOLVE
121 * - \ref SCIP_STAGE_PRESOLVING
122 * - \ref SCIP_STAGE_EXITPRESOLVE
123 * - \ref SCIP_STAGE_PRESOLVED
124 * - \ref SCIP_STAGE_INITSOLVE
125 * - \ref SCIP_STAGE_SOLVING
126 * - \ref SCIP_STAGE_SOLVED
127 * - \ref SCIP_STAGE_EXITSOLVE
128 * - \ref SCIP_STAGE_FREETRANS
129 */
131 SCIP* scip /**< SCIP data structure */
132 )
133{
135
136 return scip->stat->nruns;
137}
138
139/** gets number of reoptimization runs performed, including the current run
140 *
141 * @return the number of reoptimization runs performed, including the current run
142 *
143 * @pre This method can be called if SCIP is in one of the following stages:
144 * - \ref SCIP_STAGE_PROBLEM
145 * - \ref SCIP_STAGE_TRANSFORMING
146 * - \ref SCIP_STAGE_TRANSFORMED
147 * - \ref SCIP_STAGE_INITPRESOLVE
148 * - \ref SCIP_STAGE_PRESOLVING
149 * - \ref SCIP_STAGE_EXITPRESOLVE
150 * - \ref SCIP_STAGE_PRESOLVED
151 * - \ref SCIP_STAGE_INITSOLVE
152 * - \ref SCIP_STAGE_SOLVING
153 * - \ref SCIP_STAGE_SOLVED
154 * - \ref SCIP_STAGE_EXITSOLVE
155 * - \ref SCIP_STAGE_FREETRANS
156 */
158 SCIP* scip /**< SCIP data structure */
159 )
160{
161 SCIP_CALL_ABORT( SCIPcheckStage(scip, "SCIPgetNReoptRuns", FALSE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, FALSE) );
162
163 return scip->stat->nreoptruns;
164}
165
166/** add given number to the number of processed nodes in current run and in all runs, including the focus node
167 *
168 * @pre This method can be called if SCIP is in one of the following stages:
169 * - \ref SCIP_STAGE_PROBLEM
170 * - \ref SCIP_STAGE_TRANSFORMING
171 * - \ref SCIP_STAGE_TRANSFORMED
172 * - \ref SCIP_STAGE_INITPRESOLVE
173 * - \ref SCIP_STAGE_PRESOLVING
174 * - \ref SCIP_STAGE_EXITPRESOLVE
175 * - \ref SCIP_STAGE_PRESOLVED
176 * - \ref SCIP_STAGE_INITSOLVE
177 * - \ref SCIP_STAGE_SOLVING
178 * - \ref SCIP_STAGE_SOLVED
179 * - \ref SCIP_STAGE_EXITSOLVE
180 * - \ref SCIP_STAGE_FREETRANS
181 */
183 SCIP* scip, /**< SCIP data structure */
184 SCIP_Longint nnodes /**< number of processed nodes to add to the statistics */
185 )
186{
188
189 scip->stat->nnodes += nnodes;
190 scip->stat->ntotalnodes += nnodes;
191}
192
193/** gets number of processed nodes in current run, including the focus node
194 *
195 * @return the number of processed nodes in current run, including the focus node
196 *
197 * @pre This method can be called if SCIP is in one of the following stages:
198 * - \ref SCIP_STAGE_PROBLEM
199 * - \ref SCIP_STAGE_TRANSFORMING
200 * - \ref SCIP_STAGE_TRANSFORMED
201 * - \ref SCIP_STAGE_INITPRESOLVE
202 * - \ref SCIP_STAGE_PRESOLVING
203 * - \ref SCIP_STAGE_EXITPRESOLVE
204 * - \ref SCIP_STAGE_PRESOLVED
205 * - \ref SCIP_STAGE_INITSOLVE
206 * - \ref SCIP_STAGE_SOLVING
207 * - \ref SCIP_STAGE_SOLVED
208 * - \ref SCIP_STAGE_EXITSOLVE
209 * - \ref SCIP_STAGE_FREETRANS
210 */
212 SCIP* scip /**< SCIP data structure */
213 )
214{
216
217 return scip->stat->nnodes;
218}
219
220/** gets total number of processed nodes in all runs, including the focus node
221 *
222 * @return the total number of processed nodes in all runs, including the focus node
223 *
224 * @pre This method can be called if SCIP is in one of the following stages:
225 * - \ref SCIP_STAGE_PROBLEM
226 * - \ref SCIP_STAGE_TRANSFORMING
227 * - \ref SCIP_STAGE_TRANSFORMED
228 * - \ref SCIP_STAGE_INITPRESOLVE
229 * - \ref SCIP_STAGE_PRESOLVING
230 * - \ref SCIP_STAGE_EXITPRESOLVE
231 * - \ref SCIP_STAGE_PRESOLVED
232 * - \ref SCIP_STAGE_INITSOLVE
233 * - \ref SCIP_STAGE_SOLVING
234 * - \ref SCIP_STAGE_SOLVED
235 * - \ref SCIP_STAGE_EXITSOLVE
236 * - \ref SCIP_STAGE_FREETRANS
237 */
239 SCIP* scip /**< SCIP data structure */
240 )
241{
242 SCIP_CALL_ABORT( SCIPcheckStage(scip, "SCIPgetNTotalNodes", FALSE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, FALSE) );
243
244 return scip->stat->ntotalnodes;
245}
246
247/** gets number of leaf nodes processed with feasible relaxation solution
248 *
249 * @return number of leaf nodes processed with feasible relaxation solution
250 *
251 * @pre This method can be called if SCIP is in one of the following stages:
252 * - \ref SCIP_STAGE_PROBLEM
253 * - \ref SCIP_STAGE_TRANSFORMING
254 * - \ref SCIP_STAGE_TRANSFORMED
255 * - \ref SCIP_STAGE_INITPRESOLVE
256 * - \ref SCIP_STAGE_PRESOLVING
257 * - \ref SCIP_STAGE_EXITPRESOLVE
258 * - \ref SCIP_STAGE_PRESOLVED
259 * - \ref SCIP_STAGE_INITSOLVE
260 * - \ref SCIP_STAGE_SOLVING
261 * - \ref SCIP_STAGE_SOLVED
262 * - \ref SCIP_STAGE_EXITSOLVE
263 * - \ref SCIP_STAGE_FREETRANS
264 */
266 SCIP* scip /**< SCIP data structure */
267 )
268{
269 SCIP_CALL_ABORT( SCIPcheckStage(scip, "SCIPgetNFeasibleLeaves", FALSE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, FALSE) );
270
271 return scip->stat->nfeasleaves;
272}
273
274/** gets number of infeasible leaf nodes processed
275 *
276 * @return number of infeasible leaf nodes processed
277 *
278 * @pre This method can be called if SCIP is in one of the following stages:
279 * - \ref SCIP_STAGE_PROBLEM
280 * - \ref SCIP_STAGE_TRANSFORMING
281 * - \ref SCIP_STAGE_TRANSFORMED
282 * - \ref SCIP_STAGE_INITPRESOLVE
283 * - \ref SCIP_STAGE_PRESOLVING
284 * - \ref SCIP_STAGE_EXITPRESOLVE
285 * - \ref SCIP_STAGE_PRESOLVED
286 * - \ref SCIP_STAGE_INITSOLVE
287 * - \ref SCIP_STAGE_SOLVING
288 * - \ref SCIP_STAGE_SOLVED
289 * - \ref SCIP_STAGE_EXITSOLVE
290 * - \ref SCIP_STAGE_FREETRANS
291 */
293 SCIP* scip /**< SCIP data structure */
294 )
295{
296 SCIP_CALL_ABORT( SCIPcheckStage(scip, "SCIPgetNInfeasibleLeaves", FALSE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, FALSE) );
297
298 return scip->stat->ninfeasleaves;
299}
300
301/** gets number of processed leaf nodes that hit LP objective limit
302 *
303 * @return number of processed leaf nodes that hit LP objective limit
304 *
305 * @pre This method can be called if SCIP is in one of the following stages:
306 * - \ref SCIP_STAGE_PROBLEM
307 * - \ref SCIP_STAGE_TRANSFORMING
308 * - \ref SCIP_STAGE_TRANSFORMED
309 * - \ref SCIP_STAGE_INITPRESOLVE
310 * - \ref SCIP_STAGE_PRESOLVING
311 * - \ref SCIP_STAGE_EXITPRESOLVE
312 * - \ref SCIP_STAGE_PRESOLVED
313 * - \ref SCIP_STAGE_INITSOLVE
314 * - \ref SCIP_STAGE_SOLVING
315 * - \ref SCIP_STAGE_SOLVED
316 * - \ref SCIP_STAGE_EXITSOLVE
317 * - \ref SCIP_STAGE_FREETRANS
318 */
320 SCIP* scip /**< Scip data structure */
321 )
322{
323 SCIP_CALL_ABORT( SCIPcheckStage(scip, "SCIPgetNObjlimLeaves", FALSE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, FALSE) );
324
325 return scip->stat->nobjleaves;
326}
327
328/** gets number of global bound changes
329 *
330 * @return number of global bound changes
331 *
332 * @pre This method can be called if SCIP is in one of the following stages:
333 * - \ref SCIP_STAGE_PROBLEM
334 * - \ref SCIP_STAGE_TRANSFORMING
335 * - \ref SCIP_STAGE_TRANSFORMED
336 * - \ref SCIP_STAGE_INITPRESOLVE
337 * - \ref SCIP_STAGE_PRESOLVING
338 * - \ref SCIP_STAGE_EXITPRESOLVE
339 * - \ref SCIP_STAGE_PRESOLVED
340 * - \ref SCIP_STAGE_INITSOLVE
341 * - \ref SCIP_STAGE_SOLVING
342 * - \ref SCIP_STAGE_SOLVED
343 * - \ref SCIP_STAGE_EXITSOLVE
344 * - \ref SCIP_STAGE_FREETRANS
345 */
347 SCIP* scip /**< Scip data structure */
348 )
349{
350 SCIP_CALL_ABORT( SCIPcheckStage(scip, "SCIPgetNRootboundChgs", FALSE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, FALSE) );
351
352 return scip->stat->nrootboundchgs;
353}
354
355/** gets number of global bound changes applied in the current run
356 *
357 * @return number of global bound changes
358 *
359 * @pre This method can be called if SCIP is in one of the following stages:
360 * - \ref SCIP_STAGE_PROBLEM
361 * - \ref SCIP_STAGE_TRANSFORMING
362 * - \ref SCIP_STAGE_TRANSFORMED
363 * - \ref SCIP_STAGE_INITPRESOLVE
364 * - \ref SCIP_STAGE_PRESOLVING
365 * - \ref SCIP_STAGE_EXITPRESOLVE
366 * - \ref SCIP_STAGE_PRESOLVED
367 * - \ref SCIP_STAGE_INITSOLVE
368 * - \ref SCIP_STAGE_SOLVING
369 * - \ref SCIP_STAGE_SOLVED
370 * - \ref SCIP_STAGE_EXITSOLVE
371 * - \ref SCIP_STAGE_FREETRANS
372 */
374 SCIP* scip /**< Scip data structure */
375 )
376{
377 SCIP_CALL_ABORT( SCIPcheckStage(scip, "SCIPgetNRootboundChgsRun", FALSE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, FALSE) );
378
379 return scip->stat->nrootboundchgsrun;
380}
381
382/** gets number of times a selected node was from a cut off subtree
383 *
384 * @return number of times a selected node was from a cut off subtree
385 *
386 * @pre This method can be called if SCIP is in one of the following stages:
387 * - \ref SCIP_STAGE_PROBLEM
388 * - \ref SCIP_STAGE_TRANSFORMING
389 * - \ref SCIP_STAGE_TRANSFORMED
390 * - \ref SCIP_STAGE_INITPRESOLVE
391 * - \ref SCIP_STAGE_PRESOLVING
392 * - \ref SCIP_STAGE_EXITPRESOLVE
393 * - \ref SCIP_STAGE_PRESOLVED
394 * - \ref SCIP_STAGE_INITSOLVE
395 * - \ref SCIP_STAGE_SOLVING
396 * - \ref SCIP_STAGE_SOLVED
397 * - \ref SCIP_STAGE_EXITSOLVE
398 * - \ref SCIP_STAGE_FREETRANS
399 */
401 SCIP* scip /**< SCIP data structure */
402 )
403{
404 SCIP_CALL_ABORT( SCIPcheckStage(scip, "SCIPgetNDelayedCutoffs", FALSE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, FALSE) );
405
406 return scip->stat->ndelayedcutoffs;
407}
408
409/** gets total number of LPs solved so far
410 *
411 * @return the total number of LPs solved so far
412 *
413 * @pre This method can be called if SCIP is in one of the following stages:
414 * - \ref SCIP_STAGE_PROBLEM
415 * - \ref SCIP_STAGE_TRANSFORMING
416 * - \ref SCIP_STAGE_TRANSFORMED
417 * - \ref SCIP_STAGE_INITPRESOLVE
418 * - \ref SCIP_STAGE_PRESOLVING
419 * - \ref SCIP_STAGE_EXITPRESOLVE
420 * - \ref SCIP_STAGE_PRESOLVED
421 * - \ref SCIP_STAGE_INITSOLVE
422 * - \ref SCIP_STAGE_SOLVING
423 * - \ref SCIP_STAGE_SOLVED
424 * - \ref SCIP_STAGE_EXITSOLVE
425 * - \ref SCIP_STAGE_FREETRANS
426 */
428 SCIP* scip /**< SCIP data structure */
429 )
430{
432
433 return scip->stat->nlps;
434}
435
436/** gets total number of iterations used so far in primal and dual simplex and barrier algorithm
437 *
438 * @return the total number of iterations used so far in primal and dual simplex and barrier algorithm
439 *
440 * @pre This method can be called if SCIP is in one of the following stages:
441 * - \ref SCIP_STAGE_PRESOLVING
442 * - \ref SCIP_STAGE_PRESOLVED
443 * - \ref SCIP_STAGE_SOLVING
444 * - \ref SCIP_STAGE_SOLVED
445 */
447 SCIP* scip /**< SCIP data structure */
448 )
449{
451
452 return scip->stat->nlpiterations;
453}
454
455/** gets number of active non-zeros in the current transformed problem
456 *
457 * @return the number of active non-zeros in the current transformed problem
458 *
459 * @pre This method can be called if SCIP is in one of the following stages:
460 * - \ref SCIP_STAGE_PROBLEM
461 * - \ref SCIP_STAGE_TRANSFORMING
462 * - \ref SCIP_STAGE_TRANSFORMED
463 * - \ref SCIP_STAGE_INITPRESOLVE
464 * - \ref SCIP_STAGE_PRESOLVING
465 * - \ref SCIP_STAGE_EXITPRESOLVE
466 * - \ref SCIP_STAGE_PRESOLVED
467 * - \ref SCIP_STAGE_INITSOLVE
468 * - \ref SCIP_STAGE_SOLVING
469 * - \ref SCIP_STAGE_SOLVED
470 * - \ref SCIP_STAGE_EXITSOLVE
471 */
473 SCIP* scip /**< SCIP data structure */
474 )
475{
477
478 return scip->stat->nnz;
479}
480
481/** gets total number of iterations used so far in primal and dual simplex and barrier algorithm for the root node
482 *
483 * @return the total number of iterations used so far in primal and dual simplex and barrier algorithm for the root node
484 *
485 * @pre This method can be called if SCIP is in one of the following stages:
486 * - \ref SCIP_STAGE_PRESOLVED
487 * - \ref SCIP_STAGE_SOLVING
488 * - \ref SCIP_STAGE_SOLVED
489 */
491 SCIP* scip /**< SCIP data structure */
492 )
493{
494 SCIP_CALL_ABORT( SCIPcheckStage(scip, "SCIPgetNRootLPIterations", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, FALSE, TRUE, TRUE, FALSE, FALSE, FALSE) );
495
496 return scip->stat->nrootlpiterations;
497}
498
499/** gets total number of iterations used in primal and dual simplex and barrier algorithm for the first LP at the root
500 * node
501 *
502 * @return the total number of iterations used in primal and dual simplex and barrier algorithm for the first root LP
503 *
504 * @pre This method can be called if SCIP is in one of the following stages:
505 * - \ref SCIP_STAGE_PRESOLVED
506 * - \ref SCIP_STAGE_SOLVING
507 * - \ref SCIP_STAGE_SOLVED
508 */
510 SCIP* scip /**< SCIP data structure */
511 )
512{
513 SCIP_CALL_ABORT( SCIPcheckStage(scip, "SCIPgetNRootFirstLPIterations", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, FALSE, TRUE, TRUE, FALSE, FALSE, FALSE) );
514
515 return scip->stat->nrootfirstlpiterations;
516}
517
518/** gets total number of primal LPs solved so far
519 *
520 * @return the total number of primal LPs solved so far
521 *
522 * @pre This method can be called if SCIP is in one of the following stages:
523 * - \ref SCIP_STAGE_PRESOLVED
524 * - \ref SCIP_STAGE_SOLVING
525 * - \ref SCIP_STAGE_SOLVED
526 */
528 SCIP* scip /**< SCIP data structure */
529 )
530{
532
533 return scip->stat->nprimallps;
534}
535
536/** gets total number of iterations used so far in primal simplex
537 *
538 * @return total number of iterations used so far in primal simplex
539 *
540 * @pre This method can be called if SCIP is in one of the following stages:
541 * - \ref SCIP_STAGE_PRESOLVED
542 * - \ref SCIP_STAGE_SOLVING
543 * - \ref SCIP_STAGE_SOLVED
544 */
546 SCIP* scip /**< SCIP data structure */
547 )
548{
549 SCIP_CALL_ABORT( SCIPcheckStage(scip, "SCIPgetNPrimalLPIterations", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, FALSE, TRUE, TRUE, FALSE, FALSE, FALSE) );
550
551 return scip->stat->nprimallpiterations;
552}
553
554/** gets total number of dual LPs solved so far
555 *
556 * @return the total number of dual LPs solved so far
557 *
558 * @pre This method can be called if SCIP is in one of the following stages:
559 * - \ref SCIP_STAGE_PRESOLVED
560 * - \ref SCIP_STAGE_SOLVING
561 * - \ref SCIP_STAGE_SOLVED
562 */
564 SCIP* scip /**< SCIP data structure */
565 )
566{
568
569 return scip->stat->nduallps;
570}
571
572/** gets total number of iterations used so far in dual simplex
573 *
574 * @return the total number of iterations used so far in dual simplex
575 *
576 * @pre This method can be called if SCIP is in one of the following stages:
577 * - \ref SCIP_STAGE_PRESOLVED
578 * - \ref SCIP_STAGE_SOLVING
579 * - \ref SCIP_STAGE_SOLVED
580 */
582 SCIP* scip /**< SCIP data structure */
583 )
584{
585 SCIP_CALL_ABORT( SCIPcheckStage(scip, "SCIPgetNDualLPIterations", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, FALSE, TRUE, TRUE, FALSE, FALSE, FALSE) );
586
587 return scip->stat->nduallpiterations;
588}
589
590/** gets total number of barrier LPs solved so far
591 *
592 * @return the total number of barrier LPs solved so far
593 *
594 * @pre This method can be called if SCIP is in one of the following stages:
595 * - \ref SCIP_STAGE_PRESOLVED
596 * - \ref SCIP_STAGE_SOLVING
597 * - \ref SCIP_STAGE_SOLVED
598 */
600 SCIP* scip /**< SCIP data structure */
601 )
602{
604
605 return scip->stat->nbarrierlps;
606}
607
608/** gets total number of iterations used so far in barrier algorithm
609 *
610 * @return the total number of iterations used so far in barrier algorithm
611 *
612 * @pre This method can be called if SCIP is in one of the following stages:
613 * - \ref SCIP_STAGE_PRESOLVED
614 * - \ref SCIP_STAGE_SOLVING
615 * - \ref SCIP_STAGE_SOLVED
616 */
618 SCIP* scip /**< SCIP data structure */
619 )
620{
621 SCIP_CALL_ABORT( SCIPcheckStage(scip, "SCIPgetNBarrierLPIterations", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, FALSE, TRUE, TRUE, FALSE, FALSE, FALSE) );
622
623 return scip->stat->nbarrierlpiterations;
624}
625
626/** gets total number of LPs solved so far that were resolved from an advanced start basis
627 *
628 * @return the total number of LPs solved so far that were resolved from an advanced start basis
629 *
630 * @pre This method can be called if SCIP is in one of the following stages:
631 * - \ref SCIP_STAGE_PRESOLVED
632 * - \ref SCIP_STAGE_SOLVING
633 * - \ref SCIP_STAGE_SOLVED
634 */
636 SCIP* scip /**< SCIP data structure */
637 )
638{
640
641 return scip->stat->nprimalresolvelps + scip->stat->ndualresolvelps;
642}
643
644/** gets total number of simplex iterations used so far in primal and dual simplex calls where an advanced start basis
645 * was available
646 *
647 * @return the total number of simplex iterations used so far in primal and dual simplex calls where an advanced start
648 * basis was available
649 *
650 * @pre This method can be called if SCIP is in one of the following stages:
651 * - \ref SCIP_STAGE_PRESOLVED
652 * - \ref SCIP_STAGE_SOLVING
653 * - \ref SCIP_STAGE_SOLVED
654 */
656 SCIP* scip /**< SCIP data structure */
657 )
658{
659 SCIP_CALL_ABORT( SCIPcheckStage(scip, "SCIPgetNResolveLPIterations", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, FALSE, TRUE, TRUE, FALSE, FALSE, FALSE) );
660
661 return scip->stat->nprimalresolvelpiterations + scip->stat->ndualresolvelpiterations;
662}
663
664/** gets total number of primal LPs solved so far that were resolved from an advanced start basis
665 *
666 * @return the total number of primal LPs solved so far that were resolved from an advanced start basis
667 *
668 * @pre This method can be called if SCIP is in one of the following stages:
669 * - \ref SCIP_STAGE_PRESOLVED
670 * - \ref SCIP_STAGE_SOLVING
671 * - \ref SCIP_STAGE_SOLVED
672 */
674 SCIP* scip /**< SCIP data structure */
675 )
676{
677 SCIP_CALL_ABORT( SCIPcheckStage(scip, "SCIPgetNPrimalResolveLPs", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, FALSE, TRUE, TRUE, FALSE, FALSE, FALSE) );
678
679 return scip->stat->nprimalresolvelps;
680}
681
682/** gets total number of simplex iterations used so far in primal simplex calls where an advanced start basis
683 * was available
684 *
685 * @return the total number of simplex iterations used so far in primal simplex calls where an advanced start
686 * basis was available
687 *
688 * @pre This method can be called if SCIP is in one of the following stages:
689 * - \ref SCIP_STAGE_PRESOLVED
690 * - \ref SCIP_STAGE_SOLVING
691 * - \ref SCIP_STAGE_SOLVED
692 */
694 SCIP* scip /**< SCIP data structure */
695 )
696{
697 SCIP_CALL_ABORT( SCIPcheckStage(scip, "SCIPgetNPrimalResolveLPIterations", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, FALSE, TRUE, TRUE, FALSE, FALSE, FALSE) );
698
699 return scip->stat->nprimalresolvelpiterations;
700}
701
702/** gets total number of dual LPs solved so far that were resolved from an advanced start basis
703 *
704 * @return the total number of dual LPs solved so far that were resolved from an advanced start basis
705 *
706 * @pre This method can be called if SCIP is in one of the following stages:
707 * - \ref SCIP_STAGE_PRESOLVED
708 * - \ref SCIP_STAGE_SOLVING
709 * - \ref SCIP_STAGE_SOLVED
710 */
712 SCIP* scip /**< SCIP data structure */
713 )
714{
716
717 return scip->stat->ndualresolvelps;
718}
719
720/** gets total number of simplex iterations used so far in dual simplex calls where an advanced start basis
721 * was available
722 *
723 * @return the total number of simplex iterations used so far in dual simplex calls where an advanced start
724 * basis was available
725 *
726 * @pre This method can be called if SCIP is in one of the following stages:
727 * - \ref SCIP_STAGE_PRESOLVED
728 * - \ref SCIP_STAGE_SOLVING
729 * - \ref SCIP_STAGE_SOLVED
730 */
732 SCIP* scip /**< SCIP data structure */
733 )
734{
735 SCIP_CALL_ABORT( SCIPcheckStage(scip, "SCIPgetNDualResolveLPIterations", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, FALSE, TRUE, TRUE, FALSE, FALSE, FALSE) );
736
737 return scip->stat->ndualresolvelpiterations;
738}
739
740/** gets total number of LPs solved so far for node relaxations
741 *
742 * @return the total number of LPs solved so far for node relaxations
743 *
744 * @pre This method can be called if SCIP is in one of the following stages:
745 * - \ref SCIP_STAGE_PRESOLVED
746 * - \ref SCIP_STAGE_SOLVING
747 * - \ref SCIP_STAGE_SOLVED
748 */
750 SCIP* scip /**< SCIP data structure */
751 )
752{
754
755 return scip->stat->nnodelps;
756}
757
758/** gets total number of LPs solved in 0 iterations for node relaxations
759 *
760 * @return the total number of LPs solved with 0 iteratins for node relaxations
761 *
762 * @pre This method can be called if SCIP is in one of the following stages:
763 * - \ref SCIP_STAGE_PRESOLVED
764 * - \ref SCIP_STAGE_SOLVING
765 * - \ref SCIP_STAGE_SOLVED
766 */
768 SCIP* scip /**< SCIP data structure */
769 )
770{
771 SCIP_CALL_ABORT( SCIPcheckStage(scip, "SCIPgetNNodeZeroIterationLPs", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, FALSE, TRUE, TRUE, FALSE, FALSE, FALSE) );
772
773 return scip->stat->nnodezeroitlps;
774}
775
776/** gets total number of simplex iterations used so far for node relaxations
777 *
778 * @return the total number of simplex iterations used so far for node relaxations
779 *
780 * @pre This method can be called if SCIP is in one of the following stages:
781 * - \ref SCIP_STAGE_PRESOLVED
782 * - \ref SCIP_STAGE_SOLVING
783 * - \ref SCIP_STAGE_SOLVED
784 */
786 SCIP* scip /**< SCIP data structure */
787 )
788{
789 SCIP_CALL_ABORT( SCIPcheckStage(scip, "SCIPgetNNodeLPIterations", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, FALSE, TRUE, TRUE, FALSE, FALSE, FALSE) );
790
791 return scip->stat->nnodelpiterations;
792}
793
794/** gets total number of LPs solved so far for initial LP in node relaxations
795 *
796 * @return the total number of LPs solved so far for initial LP in node relaxations
797 *
798 * @pre This method can be called if SCIP is in one of the following stages:
799 * - \ref SCIP_STAGE_PRESOLVED
800 * - \ref SCIP_STAGE_SOLVING
801 * - \ref SCIP_STAGE_SOLVED
802 */
804 SCIP* scip /**< SCIP data structure */
805 )
806{
808
809 return scip->stat->ninitlps;
810}
811
812/** gets total number of simplex iterations used so far for initial LP in node relaxations
813 *
814 * @return the total number of simplex iterations used so far for initial LP in node relaxations
815 *
816 * @pre This method can be called if SCIP is in one of the following stages:
817 * - \ref SCIP_STAGE_PRESOLVED
818 * - \ref SCIP_STAGE_SOLVING
819 * - \ref SCIP_STAGE_SOLVED
820 */
822 SCIP* scip /**< SCIP data structure */
823 )
824{
825 SCIP_CALL_ABORT( SCIPcheckStage(scip, "SCIPgetNNodeInitLPIterations", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, FALSE, TRUE, TRUE, FALSE, FALSE, FALSE) );
826
827 return scip->stat->ninitlpiterations;
828}
829
830/** gets total number of LPs solved so far during diving and probing
831 *
832 * @return total number of LPs solved so far during diving and probing
833 *
834 * @pre This method can be called if SCIP is in one of the following stages:
835 * - \ref SCIP_STAGE_PRESOLVED
836 * - \ref SCIP_STAGE_SOLVING
837 * - \ref SCIP_STAGE_SOLVED
838 */
840 SCIP* scip /**< SCIP data structure */
841 )
842{
844
845 return scip->stat->ndivinglps;
846}
847
848/** gets total number of simplex iterations used so far during diving and probing
849 *
850 * @return the total number of simplex iterations used so far during diving and probing
851 *
852 * @pre This method can be called if SCIP is in one of the following stages:
853 * - \ref SCIP_STAGE_PRESOLVED
854 * - \ref SCIP_STAGE_SOLVING
855 * - \ref SCIP_STAGE_SOLVED
856 */
858 SCIP* scip /**< SCIP data structure */
859 )
860{
861 SCIP_CALL_ABORT( SCIPcheckStage(scip, "SCIPgetNDivingLPIterations", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, FALSE, TRUE, TRUE, FALSE, FALSE, FALSE) );
862
863 return scip->stat->ndivinglpiterations;
864}
865
866/** gets total number of times, strong branching was called (each call represents solving two LPs)
867 *
868 * @return the total number of times, strong branching was called (each call represents solving two LPs)
869 *
870 * @pre This method can be called if SCIP is in one of the following stages:
871 * - \ref SCIP_STAGE_PRESOLVED
872 * - \ref SCIP_STAGE_SOLVING
873 * - \ref SCIP_STAGE_SOLVED
874 */
876 SCIP* scip /**< SCIP data structure */
877 )
878{
880
881 return scip->stat->nstrongbranchs;
882}
883
884/** gets total number of simplex iterations used so far in strong branching
885 *
886 * @return the total number of simplex iterations used so far in strong branching
887 *
888 * @pre This method can be called if SCIP is in one of the following stages:
889 * - \ref SCIP_STAGE_PRESOLVED
890 * - \ref SCIP_STAGE_SOLVING
891 * - \ref SCIP_STAGE_SOLVED
892 */
894 SCIP* scip /**< SCIP data structure */
895 )
896{
897 SCIP_CALL_ABORT( SCIPcheckStage(scip, "SCIPgetNStrongbranchLPIterations", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, FALSE, TRUE, TRUE, FALSE, FALSE, FALSE) );
898
899 return scip->stat->nsblpiterations;
900}
901
902/** gets total number of times, strong branching was called at the root node (each call represents solving two LPs)
903 *
904 * @return the total number of times, strong branching was called at the root node (each call represents solving two LPs)
905 *
906 * @pre This method can be called if SCIP is in one of the following stages:
907 * - \ref SCIP_STAGE_PRESOLVED
908 * - \ref SCIP_STAGE_SOLVING
909 * - \ref SCIP_STAGE_SOLVED
910 */
912 SCIP* scip /**< SCIP data structure */
913 )
914{
915 SCIP_CALL_ABORT( SCIPcheckStage(scip, "SCIPgetNRootStrongbranchs", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, FALSE, TRUE, TRUE, FALSE, FALSE, FALSE) );
916
917 return scip->stat->nrootstrongbranchs;
918}
919
920/** gets total number of simplex iterations used so far in strong branching at the root node
921 *
922 * @return the total number of simplex iterations used so far in strong branching at the root node
923 *
924 * @pre This method can be called if SCIP is in one of the following stages:
925 * - \ref SCIP_STAGE_PRESOLVED
926 * - \ref SCIP_STAGE_SOLVING
927 * - \ref SCIP_STAGE_SOLVED
928 */
930 SCIP* scip /**< SCIP data structure */
931 )
932{
933 SCIP_CALL_ABORT( SCIPcheckStage(scip, "SCIPgetNRootStrongbranchLPIterations", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, FALSE, TRUE, TRUE, FALSE, FALSE, FALSE) );
934
935 return scip->stat->nrootsblpiterations;
936}
937
938/** gets number of pricing rounds performed so far at the current node
939 *
940 * @return the number of pricing rounds performed so far at the current node
941 *
942 * @pre This method can be called if SCIP is in one of the following stages:
943 * - \ref SCIP_STAGE_SOLVING
944 */
946 SCIP* scip /**< SCIP data structure */
947 )
948{
950
951 return scip->stat->npricerounds;
952}
953
954/** get current number of variables in the pricing store
955 *
956 * @return the current number of variables in the pricing store
957 *
958 * @pre This method can be called if SCIP is in one of the following stages:
959 * - \ref SCIP_STAGE_PRESOLVED
960 * - \ref SCIP_STAGE_SOLVING
961 * - \ref SCIP_STAGE_SOLVED
962 */
964 SCIP* scip /**< SCIP data structure */
965 )
966{
968
969 return scip->pricestore == NULL ? 0 : SCIPpricestoreGetNVars(scip->pricestore);
970}
971
972/** get total number of pricing variables found so far
973 *
974 * @return the total number of pricing variables found so far
975 *
976 * @pre This method can be called if SCIP is in one of the following stages:
977 * - \ref SCIP_STAGE_PRESOLVED
978 * - \ref SCIP_STAGE_SOLVING
979 * - \ref SCIP_STAGE_SOLVED
980 */
982 SCIP* scip /**< SCIP data structure */
983 )
984{
986
987 return scip->pricestore == NULL ? 0 : SCIPpricestoreGetNVarsFound(scip->pricestore);
988}
989
990/** get total number of pricing variables applied to the LPs
991 *
992 * @return the total number of pricing variables applied to the LPs
993 *
994 * @pre This method can be called if SCIP is in one of the following stages:
995 * - \ref SCIP_STAGE_PRESOLVED
996 * - \ref SCIP_STAGE_SOLVING
997 * - \ref SCIP_STAGE_SOLVED
998 */
1000 SCIP* scip /**< SCIP data structure */
1001 )
1002{
1003 SCIP_CALL_ABORT( SCIPcheckStage(scip, "SCIPgetNPricevarsApplied", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, FALSE, TRUE, TRUE, FALSE, FALSE, FALSE) );
1004
1005 return scip->pricestore == NULL ? 0 : SCIPpricestoreGetNVarsApplied(scip->pricestore);
1006}
1007
1008/** gets number of separation rounds performed so far at the current node
1009 *
1010 * @return the number of separation rounds performed so far at the current node
1011 *
1012 * @pre This method can be called if SCIP is in one of the following stages:
1013 * - \ref SCIP_STAGE_SOLVING
1014 */
1016 SCIP* scip /**< SCIP data structure */
1017 )
1018{
1020
1021 return scip->stat->nseparounds;
1022}
1023
1024/** get total number of cuts added to the sepastore so far; this includes global cuts from the cut pool as often as they are separated
1025 *
1026 * @return the total number of cuts added to the sepastore so far
1027 *
1028 * @pre This method can be called if SCIP is in one of the following stages:
1029 * - \ref SCIP_STAGE_PRESOLVED
1030 * - \ref SCIP_STAGE_SOLVING
1031 * - \ref SCIP_STAGE_SOLVED
1032 */
1034 SCIP* scip /**< SCIP data structure */
1035 )
1036{
1038
1039 return scip->sepastore == NULL ? 0 : SCIPsepastoreGetNCutsAdded(scip->sepastore);
1040}
1041
1042/** get number of cuts found so far in current separation round
1043 *
1044 * @return the number of cuts found so far in current separation round
1045 *
1046 * @pre This method can be called if SCIP is in one of the following stages:
1047 * - \ref SCIP_STAGE_PRESOLVED
1048 * - \ref SCIP_STAGE_SOLVING
1049 * - \ref SCIP_STAGE_SOLVED
1050 */
1052 SCIP* scip /**< SCIP data structure */
1053 )
1054{
1055 SCIP_CALL_ABORT( SCIPcheckStage(scip, "SCIPgetNCutsFoundRound", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, FALSE, TRUE, TRUE, FALSE, FALSE, FALSE) );
1056
1057 return scip->sepastore == NULL ? 0 : SCIPsepastoreGetNCutsFoundRound(scip->sepastore);
1058}
1059
1060/** get total number of cuts applied to the LPs
1061 *
1062 * @return the total number of cuts applied to the LPs
1063 *
1064 * @pre This method can be called if SCIP is in one of the following stages:
1065 * - \ref SCIP_STAGE_PRESOLVED
1066 * - \ref SCIP_STAGE_SOLVING
1067 * - \ref SCIP_STAGE_SOLVED
1068 */
1070 SCIP* scip /**< SCIP data structure */
1071 )
1072{
1074
1075 return scip->sepastore == NULL ? 0 : SCIPsepastoreGetNCutsApplied(scip->sepastore);
1076}
1077
1078/** get total number of constraints found in conflict analysis (conflict, reconvergence constraints, and dual proofs)
1079 *
1080 * @return the total number of constraints found in conflict analysis (conflict, reconvergence constraints, and dual proofs)
1081 *
1082 * @pre This method can be called if SCIP is in one of the following stages:
1083 * - \ref SCIP_STAGE_TRANSFORMED
1084 * - \ref SCIP_STAGE_INITPRESOLVE
1085 * - \ref SCIP_STAGE_PRESOLVING
1086 * - \ref SCIP_STAGE_EXITPRESOLVE
1087 * - \ref SCIP_STAGE_PRESOLVED
1088 * - \ref SCIP_STAGE_INITSOLVE
1089 * - \ref SCIP_STAGE_SOLVING
1090 * - \ref SCIP_STAGE_SOLVED
1091 * - \ref SCIP_STAGE_EXITSOLVE
1092 */
1094 SCIP* scip /**< SCIP data structure */
1095 )
1096{
1097 SCIP_CALL_ABORT( SCIPcheckStage(scip, "SCIPgetNConflictConssFound", FALSE, FALSE, FALSE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, FALSE, FALSE) );
1098
1099 return scip->conflict == NULL ? 0 : (SCIPconflictGetNPropConflictConss(scip->conflict)
1111}
1112
1113/** get number of conflict constraints found so far at the current node
1114 *
1115 * @return the number of conflict constraints found so far at the current node
1116 *
1117 * @pre This method can be called if SCIP is in one of the following stages:
1118 * - \ref SCIP_STAGE_TRANSFORMED
1119 * - \ref SCIP_STAGE_INITPRESOLVE
1120 * - \ref SCIP_STAGE_PRESOLVING
1121 * - \ref SCIP_STAGE_EXITPRESOLVE
1122 * - \ref SCIP_STAGE_PRESOLVED
1123 * - \ref SCIP_STAGE_INITSOLVE
1124 * - \ref SCIP_STAGE_SOLVING
1125 * - \ref SCIP_STAGE_SOLVED
1126 * - \ref SCIP_STAGE_EXITSOLVE
1127 */
1129 SCIP* scip /**< SCIP data structure */
1130 )
1131{
1132 SCIP_CALL_ABORT( SCIPcheckStage(scip, "SCIPgetNConflictConssFoundNode", FALSE, FALSE, FALSE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, FALSE, FALSE) );
1133
1134 return scip->conflict == NULL ? 0 : SCIPconflictGetNConflicts(scip->conflict);
1135}
1136
1137/** get total number of conflict constraints added to the problem
1138 *
1139 * @return the total number of conflict constraints added to the problem
1140 *
1141 * @pre This method can be called if SCIP is in one of the following stages:
1142 * - \ref SCIP_STAGE_TRANSFORMED
1143 * - \ref SCIP_STAGE_INITPRESOLVE
1144 * - \ref SCIP_STAGE_PRESOLVING
1145 * - \ref SCIP_STAGE_EXITPRESOLVE
1146 * - \ref SCIP_STAGE_PRESOLVED
1147 * - \ref SCIP_STAGE_INITSOLVE
1148 * - \ref SCIP_STAGE_SOLVING
1149 * - \ref SCIP_STAGE_SOLVED
1150 * - \ref SCIP_STAGE_EXITSOLVE
1151 */
1153 SCIP* scip /**< SCIP data structure */
1154 )
1155{
1156 SCIP_CALL_ABORT( SCIPcheckStage(scip, "SCIPgetNConflictConssApplied", FALSE, FALSE, FALSE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, FALSE, FALSE) );
1157
1158 return scip->conflict == NULL ? 0 : SCIPconflictGetNAppliedConss(scip->conflict);
1159}
1160
1161/** get total number of dual proof constraints added to the problem
1162 *
1163 * @return the total number of dual proof constraints added to the problem
1164 *
1165 * @pre This method can be called if SCIP is in one of the following stages:
1166 * - \ref SCIP_STAGE_TRANSFORMED
1167 * - \ref SCIP_STAGE_INITPRESOLVE
1168 * - \ref SCIP_STAGE_PRESOLVING
1169 * - \ref SCIP_STAGE_EXITPRESOLVE
1170 * - \ref SCIP_STAGE_PRESOLVED
1171 * - \ref SCIP_STAGE_INITSOLVE
1172 * - \ref SCIP_STAGE_SOLVING
1173 * - \ref SCIP_STAGE_SOLVED
1174 * - \ref SCIP_STAGE_EXITSOLVE
1175 */
1177 SCIP* scip /**< SCIP data structure */
1178 )
1179{
1180 SCIP_CALL_ABORT( SCIPcheckStage(scip, "SCIPgetNConflictDualproofsApplied", FALSE, FALSE, FALSE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, FALSE, FALSE) );
1181
1182 return scip->conflict == NULL ? 0 : (SCIPconflictGetNDualproofsInfSuccess(scip->conflict) +
1184}
1185
1186/** gets maximal depth of all processed nodes in current branch and bound run (excluding probing nodes)
1187 *
1188 * @return the maximal depth of all processed nodes in current branch and bound run (excluding probing nodes)
1189 *
1190 * @pre This method can be called if SCIP is in one of the following stages:
1191 * - \ref SCIP_STAGE_TRANSFORMED
1192 * - \ref SCIP_STAGE_INITPRESOLVE
1193 * - \ref SCIP_STAGE_PRESOLVING
1194 * - \ref SCIP_STAGE_EXITPRESOLVE
1195 * - \ref SCIP_STAGE_PRESOLVED
1196 * - \ref SCIP_STAGE_INITSOLVE
1197 * - \ref SCIP_STAGE_SOLVING
1198 * - \ref SCIP_STAGE_SOLVED
1199 * - \ref SCIP_STAGE_EXITSOLVE
1200 */
1202 SCIP* scip /**< SCIP data structure */
1203 )
1204{
1206
1207 return scip->stat->maxdepth;
1208}
1209
1210/** gets maximal depth of all processed nodes over all branch and bound runs
1211 *
1212 * @return the maximal depth of all processed nodes over all branch and bound runs
1213 *
1214 * @pre This method can be called if SCIP is in one of the following stages:
1215 * - \ref SCIP_STAGE_TRANSFORMED
1216 * - \ref SCIP_STAGE_INITPRESOLVE
1217 * - \ref SCIP_STAGE_PRESOLVING
1218 * - \ref SCIP_STAGE_EXITPRESOLVE
1219 * - \ref SCIP_STAGE_PRESOLVED
1220 * - \ref SCIP_STAGE_INITSOLVE
1221 * - \ref SCIP_STAGE_SOLVING
1222 * - \ref SCIP_STAGE_SOLVED
1223 * - \ref SCIP_STAGE_EXITSOLVE
1224 */
1226 SCIP* scip /**< SCIP data structure */
1227 )
1228{
1229 SCIP_CALL_ABORT( SCIPcheckStage(scip, "SCIPgetMaxTotalDepth", FALSE, FALSE, FALSE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, FALSE, FALSE) );
1230
1231 return scip->stat->maxtotaldepth;
1232}
1233
1234/** gets total number of backtracks, i.e. number of times, the new node was selected from the leaves queue
1235 *
1236 * @return the total number of backtracks, i.e. number of times, the new node was selected from the leaves queue
1237 *
1238 * @pre This method can be called if SCIP is in one of the following stages:
1239 * - \ref SCIP_STAGE_TRANSFORMED
1240 * - \ref SCIP_STAGE_INITPRESOLVE
1241 * - \ref SCIP_STAGE_PRESOLVING
1242 * - \ref SCIP_STAGE_EXITPRESOLVE
1243 * - \ref SCIP_STAGE_PRESOLVED
1244 * - \ref SCIP_STAGE_INITSOLVE
1245 * - \ref SCIP_STAGE_SOLVING
1246 * - \ref SCIP_STAGE_SOLVED
1247 * - \ref SCIP_STAGE_EXITSOLVE
1248 */
1250 SCIP* scip /**< SCIP data structure */
1251 )
1252{
1253 SCIP_CALL_ABORT( SCIPcheckStage(scip, "SCIPgetNBacktracks", FALSE, FALSE, FALSE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, FALSE, FALSE) );
1254
1255 return scip->stat->nbacktracks;
1256}
1257
1258/** gets total number of active constraints at the current node
1259 *
1260 * @return the total number of active constraints at the current node
1261 *
1262 * @pre This method can be called if SCIP is in one of the following stages:
1263 * - \ref SCIP_STAGE_INITPRESOLVE
1264 * - \ref SCIP_STAGE_PRESOLVING
1265 * - \ref SCIP_STAGE_EXITPRESOLVE
1266 * - \ref SCIP_STAGE_PRESOLVED
1267 * - \ref SCIP_STAGE_SOLVING
1268 */
1270 SCIP* scip /**< SCIP data structure */
1271 )
1272{
1274
1275 return scip->stat->nactiveconss;
1276}
1277
1278/** gets total number of enabled constraints at the current node
1279 *
1280 * @return the total number of enabled constraints at the current node
1281 *
1282 * @pre This method can be called if SCIP is in one of the following stages:
1283 * - \ref SCIP_STAGE_PRESOLVED
1284 * - \ref SCIP_STAGE_SOLVING
1285 */
1287 SCIP* scip /**< SCIP data structure */
1288 )
1289{
1291
1292 return scip->stat->nenabledconss;
1293}
1294
1295/** gets average dual bound of all unprocessed nodes for original problem
1296 *
1297 * @return the average dual bound of all unprocessed nodes for original problem
1298 *
1299 * @pre This method can be called if SCIP is in one of the following stages:
1300 * - \ref SCIP_STAGE_PRESOLVED
1301 * - \ref SCIP_STAGE_SOLVING
1302 * - \ref SCIP_STAGE_SOLVED
1303 */
1305 SCIP* scip /**< SCIP data structure */
1306 )
1307{
1309
1310 return SCIPprobExternObjval(scip->transprob, scip->origprob, scip->set,
1311 SCIPtreeGetAvgLowerbound(scip->tree, scip->primal->cutoffbound));
1312}
1313
1314/** gets average lower (dual) bound of all unprocessed nodes in transformed problem
1315 *
1316 * @return the average lower (dual) bound of all unprocessed nodes in transformed problem
1317 *
1318 * @pre This method can be called if SCIP is in one of the following stages:
1319 * - \ref SCIP_STAGE_PRESOLVED
1320 * - \ref SCIP_STAGE_SOLVING
1321 * - \ref SCIP_STAGE_SOLVED
1322 */
1324 SCIP* scip /**< SCIP data structure */
1325 )
1326{
1328
1329 return SCIPtreeGetAvgLowerbound(scip->tree, scip->primal->cutoffbound);
1330}
1331
1332/** gets global dual bound
1333 *
1334 * @return the global dual bound
1335 *
1336 * @pre This method can be called if SCIP is in one of the following stages:
1337 * - \ref SCIP_STAGE_TRANSFORMED
1338 * - \ref SCIP_STAGE_INITPRESOLVE
1339 * - \ref SCIP_STAGE_PRESOLVING
1340 * - \ref SCIP_STAGE_EXITPRESOLVE
1341 * - \ref SCIP_STAGE_PRESOLVED
1342 * - \ref SCIP_STAGE_INITSOLVE
1343 * - \ref SCIP_STAGE_SOLVING
1344 * - \ref SCIP_STAGE_SOLVED
1345 * - \ref SCIP_STAGE_EXITSOLVE
1346 */
1348 SCIP* scip /**< SCIP data structure */
1349 )
1350{
1352
1353 /* in case we are in presolving we use the stored dual bound if it exits */
1354 if( scip->set->stage <= SCIP_STAGE_INITSOLVE && scip->transprob->dualbound < SCIP_INVALID )
1355 return scip->transprob->dualbound;
1356
1357 return SCIPprobExternObjval(scip->transprob, scip->origprob, scip->set, SCIPgetLowerbound(scip));
1358}
1359
1360/** gets global lower (dual) bound in transformed problem
1361 *
1362 * @return the global lower (dual) bound in transformed problem
1363 *
1364 * @pre This method can be called if SCIP is in one of the following stages:
1365 * - \ref SCIP_STAGE_TRANSFORMED
1366 * - \ref SCIP_STAGE_INITPRESOLVE
1367 * - \ref SCIP_STAGE_PRESOLVING
1368 * - \ref SCIP_STAGE_EXITPRESOLVE
1369 * - \ref SCIP_STAGE_PRESOLVED
1370 * - \ref SCIP_STAGE_INITSOLVE
1371 * - \ref SCIP_STAGE_SOLVING
1372 * - \ref SCIP_STAGE_SOLVED
1373 */
1375 SCIP* scip /**< SCIP data structure */
1376 )
1377{
1379
1380 if( scip->set->stage <= SCIP_STAGE_INITSOLVE )
1381 return -SCIPinfinity(scip);
1383 {
1384 /* in case we could not prove whether the problem is unbounded or infeasible, we want to terminate with lower
1385 * bound = -inf instead of lower bound = upper bound = +inf also in case we prove that the problem is unbounded,
1386 * it seems to make sense to return with lower bound = -inf, since -infinity is the only valid lower bound
1387 */
1388 return -SCIPinfinity(scip);
1389 }
1391 {
1392 /* SCIPtreeGetLowerbound() should return +inf in the case of infeasibility, but when infeasibility is detected
1393 * during presolving this does not seem to be the case; hence, we treat this case explicitly
1394 */
1395 return SCIPinfinity(scip);
1396 }
1397 else
1398 {
1399 SCIP_Real treelowerbound;
1400
1401 /* it may happen that the remaining tree is empty or all open nodes have a lower bound above the cutoff bound, but
1402 * have not yet been cut off, e.g., when the user calls SCIPgetDualbound() in some event handler; in this case,
1403 * the global lower bound is given by the upper bound value
1404 */
1405 treelowerbound = SCIPtreeGetLowerbound(scip->tree, scip->set);
1406
1407 if( treelowerbound < scip->primal->upperbound)
1408 return treelowerbound;
1409 else
1410 return scip->primal->upperbound;
1411 }
1412}
1413
1414/** gets dual bound of the root node for the original problem
1415 *
1416 * @return the dual bound of the root node for the original problem
1417 *
1418 * @pre This method can be called if SCIP is in one of the following stages:
1419 * - \ref SCIP_STAGE_PRESOLVING
1420 * - \ref SCIP_STAGE_EXITPRESOLVE
1421 * - \ref SCIP_STAGE_PRESOLVED
1422 * - \ref SCIP_STAGE_INITSOLVE
1423 * - \ref SCIP_STAGE_SOLVING
1424 * - \ref SCIP_STAGE_SOLVED
1425 */
1427 SCIP* scip /**< SCIP data structure */
1428 )
1429{
1430 SCIP_CALL_ABORT( SCIPcheckStage(scip, "SCIPgetDualboundRoot", FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, FALSE, FALSE, FALSE) );
1431
1432 return SCIPprobExternObjval(scip->transprob, scip->origprob, scip->set, SCIPgetLowerboundRoot(scip));
1433}
1434
1435/** gets lower (dual) bound in transformed problem of the root node
1436 *
1437 * @return the lower (dual) bound in transformed problem of the root node
1438 *
1439 * @pre This method can be called if SCIP is in one of the following stages:
1440 * - \ref SCIP_STAGE_PRESOLVING
1441 * - \ref SCIP_STAGE_EXITPRESOLVE
1442 * - \ref SCIP_STAGE_PRESOLVED
1443 * - \ref SCIP_STAGE_INITSOLVE
1444 * - \ref SCIP_STAGE_SOLVING
1445 * - \ref SCIP_STAGE_SOLVED
1446 */
1448 SCIP* scip /**< SCIP data structure */
1449 )
1450{
1451 SCIP_CALL_ABORT( SCIPcheckStage(scip, "SCIPgetLowerboundRoot", FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, FALSE, FALSE, FALSE) );
1452
1453 return scip->stat->rootlowerbound;
1454}
1455
1456/** gets dual bound for the original problem obtained by the first LP solve at the root node
1457 *
1458 * @return the dual bound for the original problem of the first LP solve at the root node
1459 *
1460 * @pre This method can be called if SCIP is in one of the following stages:
1461 * - \ref SCIP_STAGE_PRESOLVING
1462 * - \ref SCIP_STAGE_EXITPRESOLVE
1463 * - \ref SCIP_STAGE_PRESOLVED
1464 * - \ref SCIP_STAGE_INITSOLVE
1465 * - \ref SCIP_STAGE_SOLVING
1466 * - \ref SCIP_STAGE_SOLVED
1467 */
1469 SCIP* scip /**< SCIP data structure */
1470 )
1471{
1472 SCIP_CALL_ABORT( SCIPcheckStage(scip, "SCIPgetFirstLPDualboundRoot", FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, FALSE, FALSE, FALSE) );
1473
1474 return scip->stat->firstlpdualbound;
1475}
1476
1477/** gets lower (dual) bound in transformed problem obtained by the first LP solve at the root node
1478 *
1479 * @return the lower (dual) bound in transformed problem obtained by first LP solve at the root node
1480 *
1481 * @pre This method can be called if SCIP is in one of the following stages:
1482 * - \ref SCIP_STAGE_PRESOLVING
1483 * - \ref SCIP_STAGE_EXITPRESOLVE
1484 * - \ref SCIP_STAGE_PRESOLVED
1485 * - \ref SCIP_STAGE_INITSOLVE
1486 * - \ref SCIP_STAGE_SOLVING
1487 * - \ref SCIP_STAGE_SOLVED
1488 */
1490 SCIP* scip /**< SCIP data structure */
1491 )
1492{
1493 SCIP_CALL_ABORT( SCIPcheckStage(scip, "SCIPgetFirstLPLowerboundRoot", FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, FALSE, FALSE, FALSE) );
1494
1495 if( scip->stat->firstlpdualbound == SCIP_INVALID ) /*lint !e777*/
1496 return -SCIPinfinity(scip);
1497 else
1498 return SCIPprobInternObjval(scip->transprob, scip->origprob, scip->set, scip->stat->firstlpdualbound);
1499}
1500
1501/** gets the primal bound of the very first solution
1502 *
1503 * @return the primal bound of the very first solution
1504 */
1506 SCIP* scip /**< SCIP data structure */
1507 )
1508{
1509 return scip->stat->firstprimalbound;
1510}
1511
1512/** gets global primal bound (objective value of best solution or user objective limit) for the original problem
1513 *
1514 * @return the global primal bound (objective value of best solution or user objective limit) for the original problem
1515 *
1516 * @pre This method can be called if SCIP is in one of the following stages:
1517 * - \ref SCIP_STAGE_TRANSFORMED
1518 * - \ref SCIP_STAGE_INITPRESOLVE
1519 * - \ref SCIP_STAGE_PRESOLVING
1520 * - \ref SCIP_STAGE_EXITPRESOLVE
1521 * - \ref SCIP_STAGE_PRESOLVED
1522 * - \ref SCIP_STAGE_INITSOLVE
1523 * - \ref SCIP_STAGE_SOLVING
1524 * - \ref SCIP_STAGE_SOLVED
1525 * - \ref SCIP_STAGE_EXITSOLVE
1526 */
1528 SCIP* scip /**< SCIP data structure */
1529 )
1530{
1531 SCIP_CALL_ABORT( SCIPcheckStage(scip, "SCIPgetPrimalbound", FALSE, FALSE, FALSE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, FALSE, FALSE) );
1532
1533 return SCIPprobExternObjval(scip->transprob, scip->origprob, scip->set, SCIPgetUpperbound(scip));
1534}
1535
1536/** gets global upper (primal) bound in transformed problem (objective value of best solution or user objective limit)
1537 *
1538 * @return the global upper (primal) bound in transformed problem (objective value of best solution or user objective limit)
1539 *
1540 * @pre This method can be called if SCIP is in one of the following stages:
1541 * - \ref SCIP_STAGE_TRANSFORMED
1542 * - \ref SCIP_STAGE_INITPRESOLVE
1543 * - \ref SCIP_STAGE_PRESOLVING
1544 * - \ref SCIP_STAGE_EXITPRESOLVE
1545 * - \ref SCIP_STAGE_PRESOLVED
1546 * - \ref SCIP_STAGE_INITSOLVE
1547 * - \ref SCIP_STAGE_SOLVING
1548 * - \ref SCIP_STAGE_SOLVED
1549 * - \ref SCIP_STAGE_EXITSOLVE
1550 */
1552 SCIP* scip /**< SCIP data structure */
1553 )
1554{
1556
1558 return -SCIPinfinity(scip);
1559 else
1560 return scip->primal->upperbound;
1561}
1562
1563/** gets global cutoff bound in transformed problem: a sub problem with lower bound larger than the cutoff
1564 * cannot contain a better feasible solution; usually, this bound is equal to the upper bound, but if the
1565 * objective value is always integral, the cutoff bound is (nearly) one less than the upper bound;
1566 * additionally, due to objective function domain propagation, the cutoff bound can be further reduced
1567 *
1568 * @return global cutoff bound in transformed problem
1569 *
1570 * @pre This method can be called if SCIP is in one of the following stages:
1571 * - \ref SCIP_STAGE_TRANSFORMED
1572 * - \ref SCIP_STAGE_INITPRESOLVE
1573 * - \ref SCIP_STAGE_PRESOLVING
1574 * - \ref SCIP_STAGE_EXITPRESOLVE
1575 * - \ref SCIP_STAGE_PRESOLVED
1576 * - \ref SCIP_STAGE_INITSOLVE
1577 * - \ref SCIP_STAGE_SOLVING
1578 * - \ref SCIP_STAGE_SOLVED
1579 * - \ref SCIP_STAGE_EXITSOLVE
1580 */
1582 SCIP* scip /**< SCIP data structure */
1583 )
1584{
1585 SCIP_CALL_ABORT( SCIPcheckStage(scip, "SCIPgetCutoffbound", FALSE, FALSE, FALSE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, FALSE, FALSE) );
1586
1587 return scip->primal->cutoffbound;
1588}
1589
1590/** updates the cutoff bound
1591 *
1592 * @return \ref SCIP_OKAY is returned if everything worked. Otherwise a suitable error code is passed. See \ref
1593 * SCIP_Retcode "SCIP_RETCODE" for a complete list of error codes.
1594 *
1595 * @note using this method in the solving stage can lead to an erroneous SCIP solving status; in particular,
1596 * if a solution not respecting the cutoff bound was found before installing a cutoff bound which
1597 * renders the remaining problem infeasible, this solution may be reported as optimal
1598 *
1599 * @pre This method can be called if SCIP is in one of the following stages:
1600 * - \ref SCIP_STAGE_TRANSFORMED
1601 * - \ref SCIP_STAGE_PRESOLVING
1602 * - \ref SCIP_STAGE_PRESOLVED
1603 * - \ref SCIP_STAGE_INITSOLVE
1604 * - \ref SCIP_STAGE_SOLVING
1605 *
1606 * @note the given cutoff bound has to better or equal to known one (SCIPgetCutoffbound())
1607 * @note a given cutoff bound is also used for updating the objective limit, if possible
1608 */
1610 SCIP* scip, /**< SCIP data structure */
1611 SCIP_Real cutoffbound /**< new cutoff bound */
1612 )
1613{
1614 SCIP_CALL( SCIPcheckStage(scip, "SCIPupdateCutoffbound", FALSE, FALSE, FALSE, TRUE, FALSE, TRUE, FALSE, TRUE, TRUE, TRUE, FALSE, FALSE, FALSE, FALSE) );
1615
1616 assert(cutoffbound <= SCIPgetCutoffbound(scip));
1617
1618 SCIP_CALL( SCIPprimalSetCutoffbound(scip->primal, scip->mem->probmem, scip->set, scip->stat, scip->eventfilter,
1619 scip->eventqueue, scip->transprob, scip->origprob, scip->tree, scip->reopt, scip->lp, cutoffbound, FALSE) );
1620
1621 return SCIP_OKAY;
1622}
1623
1624
1625/** returns whether the current primal bound is justified with a feasible primal solution; if not, the primal bound
1626 * was set from the user as objective limit
1627 *
1628 * @return TRUE if the current primal bound is justified with a feasible primal solution, otherwise FALSE
1629 *
1630 * @pre This method can be called if SCIP is in one of the following stages:
1631 * - \ref SCIP_STAGE_TRANSFORMED
1632 * - \ref SCIP_STAGE_INITPRESOLVE
1633 * - \ref SCIP_STAGE_PRESOLVING
1634 * - \ref SCIP_STAGE_EXITPRESOLVE
1635 * - \ref SCIP_STAGE_PRESOLVED
1636 * - \ref SCIP_STAGE_INITSOLVE
1637 * - \ref SCIP_STAGE_SOLVING
1638 * - \ref SCIP_STAGE_SOLVED
1639 * - \ref SCIP_STAGE_EXITSOLVE
1640 */
1642 SCIP* scip /**< SCIP data structure */
1643 )
1644{
1645 SCIP_CALL_ABORT( SCIPcheckStage(scip, "SCIPisPrimalboundSol", FALSE, FALSE, FALSE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, FALSE, FALSE) );
1646
1647 return SCIPprimalUpperboundIsSol(scip->primal, scip->set, scip->transprob, scip->origprob);
1648}
1649
1650/** gets current gap |(primalbound - dualbound)/min(|primalbound|,|dualbound|)| if both bounds have same sign,
1651 * or infinity, if they have opposite sign
1652 *
1653 * @return the current gap |(primalbound - dualbound)/min(|primalbound|,|dualbound|)| if both bounds have same sign,
1654 * or infinity, if they have opposite sign
1655 *
1656 * @pre This method can be called if SCIP is in one of the following stages:
1657 * - \ref SCIP_STAGE_PRESOLVING
1658 * - \ref SCIP_STAGE_EXITPRESOLVE
1659 * - \ref SCIP_STAGE_PRESOLVED
1660 * - \ref SCIP_STAGE_INITSOLVE
1661 * - \ref SCIP_STAGE_SOLVING
1662 * - \ref SCIP_STAGE_SOLVED
1663 */
1665 SCIP* scip /**< SCIP data structure */
1666 )
1667{
1669
1670 /* in case we could not prove whether the problem is unbounded or infeasible, we want to terminate with gap = +inf;
1671 * if the problem was proven to be unbounded or proven to be infeasible we return gap = 0
1672 */
1674 return SCIPsetInfinity(scip->set);
1676 return 0.0;
1677
1678 /* the lowerbound is infinity, but SCIP may not have updated the status; in this case, the problem was already solved
1679 * so we return gap = 0
1680 */
1682 return 0.0;
1683
1685}
1686
1687/** gets current gap |(upperbound - lowerbound)/min(|upperbound|,|lowerbound|)| in transformed problem if both bounds
1688 * have same sign, or infinity, if they have opposite sign
1689 *
1690 * @return current gap |(upperbound - lowerbound)/min(|upperbound|,|lowerbound|)| in transformed problem if both bounds
1691 * have same sign, or infinity, if they have opposite sign
1692 *
1693 * @pre This method can be called if SCIP is in one of the following stages:
1694 * - \ref SCIP_STAGE_PRESOLVED
1695 * - \ref SCIP_STAGE_SOLVING
1696 * - \ref SCIP_STAGE_SOLVED
1697 */
1699 SCIP* scip /**< SCIP data structure */
1700 )
1701{
1703
1704 /* in case we could not prove whether the problem is unbounded or infeasible, we want to terminate with gap = +inf;
1705 * if the problem was proven to be unbounded or proven to be infeasible we return gap = 0
1706 */
1708 return SCIPsetInfinity(scip->set);
1710 return 0.0;
1711
1712 /* the lowerbound is infinity, but SCIP may not have updated the status; in this case, the problem was already solved
1713 * so we return gap = 0
1714 */
1716 return 0.0;
1717
1719}
1720
1721/** gets number of feasible primal solutions found so far
1722 *
1723 * @return the number of feasible primal solutions found so far
1724 *
1725 * @pre This method can be called if SCIP is in one of the following stages:
1726 * - \ref SCIP_STAGE_TRANSFORMED
1727 * - \ref SCIP_STAGE_INITPRESOLVE
1728 * - \ref SCIP_STAGE_PRESOLVING
1729 * - \ref SCIP_STAGE_EXITPRESOLVE
1730 * - \ref SCIP_STAGE_PRESOLVED
1731 * - \ref SCIP_STAGE_INITSOLVE
1732 * - \ref SCIP_STAGE_SOLVING
1733 * - \ref SCIP_STAGE_SOLVED
1734 * - \ref SCIP_STAGE_EXITSOLVE
1735 */
1737 SCIP* scip /**< SCIP data structure */
1738 )
1739{
1741
1742 return scip->primal->nsolsfound;
1743}
1744
1745/** gets number of feasible primal solutions respecting the objective limit found so far
1746 *
1747 * @return the number of feasible primal solutions respecting the objective limit found so far
1748 *
1749 * @pre This method can be called if SCIP is in one of the following stages:
1750 * - \ref SCIP_STAGE_INIT
1751 * - \ref SCIP_STAGE_PROBLEM
1752 * - \ref SCIP_STAGE_TRANSFORMING
1753 * - \ref SCIP_STAGE_TRANSFORMED
1754 * - \ref SCIP_STAGE_INITPRESOLVE
1755 * - \ref SCIP_STAGE_PRESOLVING
1756 * - \ref SCIP_STAGE_EXITPRESOLVE
1757 * - \ref SCIP_STAGE_PRESOLVED
1758 * - \ref SCIP_STAGE_INITSOLVE
1759 * - \ref SCIP_STAGE_SOLVING
1760 * - \ref SCIP_STAGE_SOLVED
1761 * - \ref SCIP_STAGE_EXITSOLVE
1762 */
1764 SCIP* scip /**< SCIP data structure */
1765 )
1766{
1768 return 0;
1769
1770 SCIP_CALL_ABORT( SCIPcheckStage(scip, "SCIPgetNLimSolsFound", FALSE, FALSE, FALSE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, FALSE, FALSE) );
1771
1772 return scip->primal->nlimsolsfound;
1773}
1774
1775/** gets number of feasible primal solutions found so far, that improved the primal bound at the time they were found
1776 *
1777 * @return the number of feasible primal solutions found so far, that improved the primal bound at the time they were found
1778 *
1779 * @pre This method can be called if SCIP is in one of the following stages:
1780 * - \ref SCIP_STAGE_TRANSFORMED
1781 * - \ref SCIP_STAGE_INITPRESOLVE
1782 * - \ref SCIP_STAGE_PRESOLVING
1783 * - \ref SCIP_STAGE_EXITPRESOLVE
1784 * - \ref SCIP_STAGE_PRESOLVED
1785 * - \ref SCIP_STAGE_INITSOLVE
1786 * - \ref SCIP_STAGE_SOLVING
1787 * - \ref SCIP_STAGE_SOLVED
1788 * - \ref SCIP_STAGE_EXITSOLVE
1789 */
1791 SCIP* scip /**< SCIP data structure */
1792 )
1793{
1794 SCIP_CALL_ABORT( SCIPcheckStage(scip, "SCIPgetNBestSolsFound", FALSE, FALSE, FALSE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, FALSE, FALSE) );
1795
1796 return scip->primal->nbestsolsfound;
1797}
1798
1799/** gets the average pseudo cost value for the given direction over all variables
1800 *
1801 * @return the average pseudo cost value for the given direction over all variables
1802 *
1803 * @pre This method can be called if SCIP is in one of the following stages:
1804 * - \ref SCIP_STAGE_SOLVING
1805 * - \ref SCIP_STAGE_SOLVED
1806 */
1808 SCIP* scip, /**< SCIP data structure */
1809 SCIP_Real solvaldelta /**< difference of variable's new LP value - old LP value */
1810 )
1811{
1813
1814 return SCIPhistoryGetPseudocost(scip->stat->glbhistory, solvaldelta);
1815}
1816
1817/** gets the average pseudo cost value for the given direction over all variables,
1818 * only using the pseudo cost information of the current run
1819 *
1820 * @return the average pseudo cost value for the given direction over all variables,
1821 * only using the pseudo cost information of the current run
1822 *
1823 * @pre This method can be called if SCIP is in one of the following stages:
1824 * - \ref SCIP_STAGE_SOLVING
1825 * - \ref SCIP_STAGE_SOLVED
1826 */
1828 SCIP* scip, /**< SCIP data structure */
1829 SCIP_Real solvaldelta /**< difference of variable's new LP value - old LP value */
1830 )
1831{
1832 SCIP_CALL_ABORT( SCIPcheckStage(scip, "SCIPgetAvgPseudocostCurrentRun", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, TRUE, FALSE, FALSE, FALSE) );
1833
1834 return SCIPhistoryGetPseudocost(scip->stat->glbhistorycrun, solvaldelta);
1835}
1836
1837/** gets the average number of pseudo cost updates for the given direction over all variables
1838 *
1839 * @return the average number of pseudo cost updates for the given direction over all variables
1840 *
1841 * @pre This method can be called if SCIP is in one of the following stages:
1842 * - \ref SCIP_STAGE_SOLVING
1843 * - \ref SCIP_STAGE_SOLVED
1844 */
1846 SCIP* scip, /**< SCIP data structure */
1847 SCIP_BRANCHDIR dir /**< branching direction (downwards, or upwards) */
1848 )
1849{
1850 SCIP_CALL_ABORT( SCIPcheckStage(scip, "SCIPgetAvgPseudocostCount", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, TRUE, FALSE, FALSE, FALSE) );
1851
1852 return SCIPhistoryGetPseudocostCount(scip->stat->glbhistory, dir)
1853 / MAX(scip->transprob->nbinvars + scip->transprob->nintvars, 1);
1854}
1855
1856/** gets the average number of pseudo cost updates for the given direction over all variables,
1857 * only using the pseudo cost information of the current run
1858 *
1859 * @return the average number of pseudo cost updates for the given direction over all variables,
1860 * only using the pseudo cost information of the current run
1861 *
1862 * @pre This method can be called if SCIP is in one of the following stages:
1863 * - \ref SCIP_STAGE_SOLVING
1864 * - \ref SCIP_STAGE_SOLVED
1865 */
1867 SCIP* scip, /**< SCIP data structure */
1868 SCIP_BRANCHDIR dir /**< branching direction (downwards, or upwards) */
1869 )
1870{
1871 SCIP_CALL_ABORT( SCIPcheckStage(scip, "SCIPgetAvgPseudocostCountCurrentRun", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, TRUE, FALSE, FALSE, FALSE) );
1872
1873 return SCIPhistoryGetPseudocostCount(scip->stat->glbhistorycrun, dir)
1874 / MAX(scip->transprob->nbinvars + scip->transprob->nintvars, 1);
1875}
1876
1877/** gets the average pseudo cost score value over all variables, assuming a fractionality of 0.5
1878 *
1879 * @return the average pseudo cost score value over all variables, assuming a fractionality of 0.5
1880 *
1881 * @pre This method can be called if SCIP is in one of the following stages:
1882 * - \ref SCIP_STAGE_SOLVING
1883 * - \ref SCIP_STAGE_SOLVED
1884 */
1886 SCIP* scip /**< SCIP data structure */
1887 )
1888{
1889 SCIP_Real pscostdown;
1890 SCIP_Real pscostup;
1891
1892 SCIP_CALL_ABORT( SCIPcheckStage(scip, "SCIPgetAvgPseudocostScore", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, TRUE, FALSE, FALSE, FALSE) );
1893
1894 pscostdown = SCIPhistoryGetPseudocost(scip->stat->glbhistory, -0.5);
1895 pscostup = SCIPhistoryGetPseudocost(scip->stat->glbhistory, +0.5);
1896
1897 return SCIPbranchGetScore(scip->set, NULL, pscostdown, pscostup);
1898}
1899
1900/** returns the variance of pseudo costs for all variables in the requested direction
1901 *
1902 * @return the variance of pseudo costs for all variables in the requested direction
1903 *
1904 * @pre This method can be called if SCIP is in one of the following stages:
1905 * - \ref SCIP_STAGE_SOLVING
1906 * - \ref SCIP_STAGE_SOLVED
1907 */
1909 SCIP* scip, /**< SCIP data structure */
1910 SCIP_BRANCHDIR branchdir, /**< the branching direction, up or down */
1911 SCIP_Bool onlycurrentrun /**< use only history of current run? */
1912 )
1913{
1914 SCIP_HISTORY* history;
1915
1916 assert(scip != NULL);
1917 SCIP_CALL_ABORT( SCIPcheckStage(scip, "SCIPgetPseudocostVariance", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, TRUE, FALSE, FALSE, FALSE) );
1918
1919 history = (onlycurrentrun ? scip->stat->glbhistorycrun : scip->stat->glbhistory);
1920 assert(history != NULL);
1921
1922 return SCIPhistoryGetPseudocostVariance(history, branchdir);
1923}
1924
1925/** gets the number of pseudo cost updates for the given direction over all variables
1926 *
1927 * @return the number of pseudo cost updates for the given direction over all variables
1928 *
1929 * @pre This method can be called if SCIP is in one of the following stages:
1930 * - \ref SCIP_STAGE_SOLVING
1931 * - \ref SCIP_STAGE_SOLVED
1932 */
1934 SCIP* scip, /**< SCIP data structure */
1935 SCIP_BRANCHDIR dir, /**< branching direction (downwards, or upwards) */
1936 SCIP_Bool onlycurrentrun /**< use only history of current run? */
1937 )
1938{
1939 SCIP_HISTORY* history;
1940
1941 assert(scip != NULL);
1943
1944 history = (onlycurrentrun ? scip->stat->glbhistorycrun : scip->stat->glbhistory);
1945
1946 return SCIPhistoryGetPseudocostCount(history, dir);
1947}
1948
1949/** gets the average pseudo cost score value over all variables, assuming a fractionality of 0.5,
1950 * only using the pseudo cost information of the current run
1951 *
1952 * @return the average pseudo cost score value over all variables, assuming a fractionality of 0.5,
1953 * only using the pseudo cost information of the current run
1954 *
1955 * @pre This method can be called if SCIP is in one of the following stages:
1956 * - \ref SCIP_STAGE_SOLVING
1957 * - \ref SCIP_STAGE_SOLVED
1958 */
1960 SCIP* scip /**< SCIP data structure */
1961 )
1962{
1963 SCIP_Real pscostdown;
1964 SCIP_Real pscostup;
1965
1966 SCIP_CALL_ABORT( SCIPcheckStage(scip, "SCIPgetAvgPseudocostScoreCurrentRun", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, TRUE, FALSE, FALSE, FALSE) );
1967
1968 pscostdown = SCIPhistoryGetPseudocost(scip->stat->glbhistorycrun, -0.5);
1969 pscostup = SCIPhistoryGetPseudocost(scip->stat->glbhistorycrun, +0.5);
1970
1971 return SCIPbranchGetScore(scip->set, NULL, pscostdown, pscostup);
1972}
1973
1974/** gets the average conflict score value over all variables
1975 *
1976 * @return the average conflict score value over all variables
1977 *
1978 * @pre This method can be called if SCIP is in one of the following stages:
1979 * - \ref SCIP_STAGE_SOLVING
1980 * - \ref SCIP_STAGE_SOLVED
1981 */
1983 SCIP* scip /**< SCIP data structure */
1984 )
1985{
1986 SCIP_Real conflictscoredown;
1987 SCIP_Real conflictscoreup;
1988 SCIP_Real scale;
1989
1990 SCIP_CALL_ABORT( SCIPcheckStage(scip, "SCIPgetAvgConflictScore", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, TRUE, FALSE, FALSE, FALSE) );
1991
1992 scale = scip->transprob->nvars * scip->stat->vsidsweight;
1993 conflictscoredown = SCIPhistoryGetVSIDS(scip->stat->glbhistory, SCIP_BRANCHDIR_DOWNWARDS) / scale;
1994 conflictscoreup = SCIPhistoryGetVSIDS(scip->stat->glbhistory, SCIP_BRANCHDIR_UPWARDS) / scale;
1995
1996 return SCIPbranchGetScore(scip->set, NULL, conflictscoredown, conflictscoreup);
1997}
1998
1999/** gets the average conflict score value over all variables, only using the conflict score information of the current run
2000 *
2001 * @return the average conflict score value over all variables, only using the conflict score information of the current run
2002 *
2003 * @pre This method can be called if SCIP is in one of the following stages:
2004 * - \ref SCIP_STAGE_SOLVING
2005 * - \ref SCIP_STAGE_SOLVED
2006 */
2008 SCIP* scip /**< SCIP data structure */
2009 )
2010{
2011 SCIP_Real conflictscoredown;
2012 SCIP_Real conflictscoreup;
2013 SCIP_Real scale;
2014
2015 SCIP_CALL_ABORT( SCIPcheckStage(scip, "SCIPgetAvgConflictScoreCurrentRun", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, TRUE, FALSE, FALSE, FALSE) );
2016
2017 scale = scip->transprob->nvars * scip->stat->vsidsweight;
2018 conflictscoredown = SCIPhistoryGetVSIDS(scip->stat->glbhistorycrun, SCIP_BRANCHDIR_DOWNWARDS) / scale;
2019 conflictscoreup = SCIPhistoryGetVSIDS(scip->stat->glbhistorycrun, SCIP_BRANCHDIR_UPWARDS) / scale;
2020
2021 return SCIPbranchGetScore(scip->set, NULL, conflictscoredown, conflictscoreup);
2022}
2023
2024/** gets the average inference score value over all variables
2025 *
2026 * @return the average inference score value over all variables
2027 *
2028 * @pre This method can be called if SCIP is in one of the following stages:
2029 * - \ref SCIP_STAGE_SOLVING
2030 * - \ref SCIP_STAGE_SOLVED
2031 */
2033 SCIP* scip /**< SCIP data structure */
2034 )
2035{
2036 SCIP_Real conflictlengthdown;
2037 SCIP_Real conflictlengthup;
2038
2039 SCIP_CALL_ABORT( SCIPcheckStage(scip, "SCIPgetAvgConflictlengthScore", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, TRUE, FALSE, FALSE, FALSE) );
2040
2041 conflictlengthdown = SCIPhistoryGetAvgConflictlength(scip->stat->glbhistory, SCIP_BRANCHDIR_DOWNWARDS);
2042 conflictlengthup = SCIPhistoryGetAvgConflictlength(scip->stat->glbhistory, SCIP_BRANCHDIR_UPWARDS);
2043
2044 return SCIPbranchGetScore(scip->set, NULL, conflictlengthdown, conflictlengthup);
2045}
2046
2047/** gets the average conflictlength score value over all variables, only using the conflictlength information of the
2048 * current run
2049 *
2050 * @return the average conflictlength score value over all variables, only using the conflictlength information of the
2051 * current run
2052 *
2053 * @pre This method can be called if SCIP is in one of the following stages:
2054 * - \ref SCIP_STAGE_SOLVING
2055 * - \ref SCIP_STAGE_SOLVED
2056 */
2058 SCIP* scip /**< SCIP data structure */
2059 )
2060{
2061 SCIP_Real conflictlengthdown;
2062 SCIP_Real conflictlengthup;
2063
2064 SCIP_CALL_ABORT( SCIPcheckStage(scip, "SCIPgetAvgConflictlengthScoreCurrentRun", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, TRUE, FALSE, FALSE, FALSE) );
2065
2066 conflictlengthdown = SCIPhistoryGetAvgConflictlength(scip->stat->glbhistorycrun, SCIP_BRANCHDIR_DOWNWARDS);
2067 conflictlengthup = SCIPhistoryGetAvgConflictlength(scip->stat->glbhistorycrun, SCIP_BRANCHDIR_UPWARDS);
2068
2069 return SCIPbranchGetScore(scip->set, NULL, conflictlengthdown, conflictlengthup);
2070}
2071
2072/** returns the average number of inferences found after branching in given direction over all variables
2073 *
2074 * @return the average number of inferences found after branching in given direction over all variables
2075 *
2076 * @pre This method can be called if SCIP is in one of the following stages:
2077 * - \ref SCIP_STAGE_SOLVING
2078 * - \ref SCIP_STAGE_SOLVED
2079 */
2081 SCIP* scip, /**< SCIP data structure */
2082 SCIP_BRANCHDIR dir /**< branching direction (downwards, or upwards) */
2083 )
2084{
2086
2087 return SCIPhistoryGetAvgInferences(scip->stat->glbhistory, dir);
2088}
2089
2090/** returns the average number of inferences found after branching in given direction over all variables,
2091 * only using the inference information of the current run
2092 *
2093 * @return the average number of inferences found after branching in given direction over all variables,
2094 * only using the inference information of the current run
2095 *
2096 * @pre This method can be called if SCIP is in one of the following stages:
2097 * - \ref SCIP_STAGE_SOLVING
2098 * - \ref SCIP_STAGE_SOLVED
2099 */
2101 SCIP* scip, /**< SCIP data structure */
2102 SCIP_BRANCHDIR dir /**< branching direction (downwards, or upwards) */
2103 )
2104{
2105 SCIP_CALL_ABORT( SCIPcheckStage(scip, "SCIPgetAvgInferencesCurrentRun", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, TRUE, FALSE, FALSE, FALSE) );
2106
2107 return SCIPhistoryGetAvgInferences(scip->stat->glbhistorycrun, dir);
2108}
2109
2110/** gets the average inference score value over all variables
2111 *
2112 * @return the average inference score value over all variables
2113 *
2114 * @pre This method can be called if SCIP is in one of the following stages:
2115 * - \ref SCIP_STAGE_SOLVING
2116 * - \ref SCIP_STAGE_SOLVED
2117 */
2119 SCIP* scip /**< SCIP data structure */
2120 )
2121{
2122 SCIP_Real inferencesdown;
2123 SCIP_Real inferencesup;
2124
2125 SCIP_CALL_ABORT( SCIPcheckStage(scip, "SCIPgetAvgInferenceScore", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, TRUE, FALSE, FALSE, FALSE) );
2126
2127 inferencesdown = SCIPhistoryGetAvgInferences(scip->stat->glbhistory, SCIP_BRANCHDIR_DOWNWARDS);
2128 inferencesup = SCIPhistoryGetAvgInferences(scip->stat->glbhistory, SCIP_BRANCHDIR_UPWARDS);
2129
2130 return SCIPbranchGetScore(scip->set, NULL, inferencesdown, inferencesup);
2131}
2132
2133/** gets the average inference score value over all variables, only using the inference information of the
2134 * current run
2135 *
2136 * @return the average inference score value over all variables, only using the inference information of the
2137 * current run
2138 *
2139 * @pre This method can be called if SCIP is in one of the following stages:
2140 * - \ref SCIP_STAGE_SOLVING
2141 * - \ref SCIP_STAGE_SOLVED
2142 */
2144 SCIP* scip /**< SCIP data structure */
2145 )
2146{
2147 SCIP_Real inferencesdown;
2148 SCIP_Real inferencesup;
2149
2150 SCIP_CALL_ABORT( SCIPcheckStage(scip, "SCIPgetAvgInferenceScoreCurrentRun", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, TRUE, FALSE, FALSE, FALSE) );
2151
2152 inferencesdown = SCIPhistoryGetAvgInferences(scip->stat->glbhistorycrun, SCIP_BRANCHDIR_DOWNWARDS);
2153 inferencesup = SCIPhistoryGetAvgInferences(scip->stat->glbhistorycrun, SCIP_BRANCHDIR_UPWARDS);
2154
2155 return SCIPbranchGetScore(scip->set, NULL, inferencesdown, inferencesup);
2156}
2157
2158/** returns the average number of cutoffs found after branching in given direction over all variables
2159 *
2160 * @return the average number of cutoffs found after branching in given direction over all variables
2161 *
2162 * @pre This method can be called if SCIP is in one of the following stages:
2163 * - \ref SCIP_STAGE_SOLVING
2164 * - \ref SCIP_STAGE_SOLVED
2165 */
2167 SCIP* scip, /**< SCIP data structure */
2168 SCIP_BRANCHDIR dir /**< branching direction (downwards, or upwards) */
2169 )
2170{
2172
2173 return SCIPhistoryGetAvgCutoffs(scip->stat->glbhistory, dir);
2174}
2175
2176/** returns the average number of cutoffs found after branching in given direction over all variables,
2177 * only using the cutoff information of the current run
2178 *
2179 * @return the average number of cutoffs found after branching in given direction over all variables,
2180 * only using the cutoff information of the current run
2181 *
2182 * @pre This method can be called if SCIP is in one of the following stages:
2183 * - \ref SCIP_STAGE_SOLVING
2184 * - \ref SCIP_STAGE_SOLVED
2185 */
2187 SCIP* scip, /**< SCIP data structure */
2188 SCIP_BRANCHDIR dir /**< branching direction (downwards, or upwards) */
2189 )
2190{
2191 SCIP_CALL_ABORT( SCIPcheckStage(scip, "SCIPgetAvgCutoffsCurrentRun", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, TRUE, FALSE, FALSE, FALSE) );
2192
2193 return SCIPhistoryGetAvgCutoffs(scip->stat->glbhistorycrun, dir);
2194}
2195
2196/** gets the average cutoff score value over all variables
2197 *
2198 * @return the average cutoff score value over all variables
2199 *
2200 * @pre This method can be called if SCIP is in one of the following stages:
2201 * - \ref SCIP_STAGE_SOLVING
2202 * - \ref SCIP_STAGE_SOLVED
2203 */
2205 SCIP* scip /**< SCIP data structure */
2206 )
2207{
2208 SCIP_Real cutoffsdown;
2209 SCIP_Real cutoffsup;
2210
2212
2213 cutoffsdown = SCIPhistoryGetAvgCutoffs(scip->stat->glbhistory, SCIP_BRANCHDIR_DOWNWARDS);
2214 cutoffsup = SCIPhistoryGetAvgCutoffs(scip->stat->glbhistory, SCIP_BRANCHDIR_UPWARDS);
2215
2216 return SCIPbranchGetScore(scip->set, NULL, cutoffsdown, cutoffsup);
2217}
2218
2219/** gets the average cutoff score value over all variables, only using the cutoff score information of the current run
2220 *
2221 * @return the average cutoff score value over all variables, only using the cutoff score information of the current run
2222 *
2223 * @pre This method can be called if SCIP is in one of the following stages:
2224 * - \ref SCIP_STAGE_SOLVING
2225 * - \ref SCIP_STAGE_SOLVED
2226 */
2228 SCIP* scip /**< SCIP data structure */
2229 )
2230{
2231 SCIP_Real cutoffsdown;
2232 SCIP_Real cutoffsup;
2233
2234 SCIP_CALL_ABORT( SCIPcheckStage(scip, "SCIPgetAvgCutoffScoreCurrentRun", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, TRUE, FALSE, FALSE, FALSE) );
2235
2236 cutoffsdown = SCIPhistoryGetAvgCutoffs(scip->stat->glbhistorycrun, SCIP_BRANCHDIR_DOWNWARDS);
2237 cutoffsup = SCIPhistoryGetAvgCutoffs(scip->stat->glbhistorycrun, SCIP_BRANCHDIR_UPWARDS);
2238
2239 return SCIPbranchGetScore(scip->set, NULL, cutoffsdown, cutoffsup);
2240}
2241
2242/** increases the average normalized efficacy of a GMI cut over all variables
2243 *
2244 * @pre This method can be called if SCIP is in one of the following stages:
2245 * - \ref SCIP_STAGE_SOLVING
2246 * - \ref SCIP_STAGE_SOLVED
2247 */
2249 SCIP* scip, /**< SCIP data structure */
2250 SCIP_Real gmieff /**< average normalized GMI cut efficacy over all variables */
2251 )
2252{
2254
2255 SCIPhistoryIncGMIeffSum(scip->stat->glbhistory, gmieff);
2256}
2257
2258/** returns the average normalized efficacy of a GMI cut over all variables
2259 *
2260 * @return the average normalized efficacy of a GMI cut over all variables
2261 *
2262 * @pre This method can be called if SCIP is in one of the following stages:
2263 * - \ref SCIP_STAGE_SOLVING
2264 * - \ref SCIP_STAGE_SOLVED
2265 */
2267 SCIP* scip /**< SCIP data structure */
2268 )
2269{
2271
2272 return SCIPhistoryGetAvgGMIeff(scip->stat->glbhistory);
2273}
2274
2275/** computes a deterministic measure of time from statistics
2276 *
2277 * @return the deterministic time
2278 *
2279 * @pre This method can be called if SCIP is in one of the following stages:
2280 * - \ref SCIP_STAGE_PRESOLVING
2281 * - \ref SCIP_STAGE_PRESOLVED
2282 * - \ref SCIP_STAGE_SOLVING
2283 * - \ref SCIP_STAGE_SOLVED
2284 */
2286 SCIP* scip /**< SCIP data structure */
2287 )
2288{
2289/* TODO: SCIP_CALL_ABORT( SCIPcheckStage(scip, "SCIPgetDeterministicTime", FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, FALSE, TRUE, FALSE, TRUE, TRUE, FALSE, FALSE, FALSE) ); */
2290 if(scip->stat == NULL)
2291 return 0.0;
2292
2293 return 1e-6 * scip->stat->nnz * (
2294 0.00328285264101 * scip->stat->nprimalresolvelpiterations +
2295 0.00531625104146 * scip->stat->ndualresolvelpiterations +
2296 0.000738719124051 * scip->stat->nprobboundchgs +
2297 0.0011123144764 * scip->stat->nisstoppedcalls );
2298}
2299
2300/** outputs problem to file stream */
2301static
2303 SCIP* scip, /**< SCIP data structure */
2304 SCIP_PROB* prob, /**< problem data */
2305 FILE* file, /**< output file (or NULL for standard output) */
2306 const char* extension, /**< file format (or NULL for default CIP format) */
2307 SCIP_Bool genericnames /**< using generic variable and constraint names? */
2308 )
2309{
2310 SCIP_RESULT result;
2311 int i;
2312 assert(scip != NULL);
2313 assert(prob != NULL);
2314
2315 /* try all readers until one could read the file */
2316 result = SCIP_DIDNOTRUN;
2317 for( i = 0; i < scip->set->nreaders && result == SCIP_DIDNOTRUN; ++i )
2318 {
2319 SCIP_RETCODE retcode;
2320
2321 if( extension != NULL )
2322 retcode = SCIPreaderWrite(scip->set->readers[i], prob, scip->set, file, extension, genericnames, &result);
2323 else
2324 retcode = SCIPreaderWrite(scip->set->readers[i], prob, scip->set, file, "cip", genericnames, &result);
2325
2326 /* check for reader errors */
2327 if( retcode == SCIP_WRITEERROR )
2328 return retcode;
2329
2330 SCIP_CALL( retcode );
2331 }
2332
2333 switch( result )
2334 {
2335 case SCIP_DIDNOTRUN:
2336 return SCIP_PLUGINNOTFOUND;
2337
2338 case SCIP_SUCCESS:
2339 return SCIP_OKAY;
2340
2341 default:
2342 assert(i < scip->set->nreaders);
2343 SCIPerrorMessage("invalid result code <%d> from reader <%s> writing <%s> format\n",
2344 result, SCIPreaderGetName(scip->set->readers[i]), extension);
2345 return SCIP_READERROR;
2346 } /*lint !e788*/
2347}
2348
2349/** outputs original problem to file stream
2350 *
2351 * @return \ref SCIP_OKAY is returned if everything worked. Otherwise a suitable error code is passed. See \ref
2352 * SCIP_Retcode "SCIP_RETCODE" for a complete list of error codes.
2353 *
2354 * @pre This method can be called if SCIP is in one of the following stages:
2355 * - \ref SCIP_STAGE_PROBLEM
2356 * - \ref SCIP_STAGE_TRANSFORMING
2357 * - \ref SCIP_STAGE_TRANSFORMED
2358 * - \ref SCIP_STAGE_INITPRESOLVE
2359 * - \ref SCIP_STAGE_PRESOLVING
2360 * - \ref SCIP_STAGE_EXITPRESOLVE
2361 * - \ref SCIP_STAGE_PRESOLVED
2362 * - \ref SCIP_STAGE_INITSOLVE
2363 * - \ref SCIP_STAGE_SOLVING
2364 * - \ref SCIP_STAGE_SOLVED
2365 * - \ref SCIP_STAGE_EXITSOLVE
2366 * - \ref SCIP_STAGE_FREETRANS
2367 */
2369 SCIP* scip, /**< SCIP data structure */
2370 FILE* file, /**< output file (or NULL for standard output) */
2371 const char* extension, /**< file format (or NULL for default CIP format)*/
2372 SCIP_Bool genericnames /**< using generic variable and constraint names? */
2373 )
2374{
2375 SCIP_RETCODE retcode;
2376
2377 SCIP_CALL( SCIPcheckStage(scip, "SCIPprintOrigProblem", FALSE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, FALSE) );
2378
2379 assert(scip != NULL);
2380 assert( scip->origprob != NULL );
2381
2382 retcode = printProblem(scip, scip->origprob, file, extension, genericnames);
2383
2384 /* check for write errors */
2385 if( retcode == SCIP_WRITEERROR || retcode == SCIP_PLUGINNOTFOUND )
2386 return retcode;
2387 else
2388 {
2389 SCIP_CALL( retcode );
2390 }
2391
2392 return SCIP_OKAY;
2393}
2394
2395/** outputs transformed problem of the current node to file stream
2396 *
2397 * @return \ref SCIP_OKAY is returned if everything worked. Otherwise a suitable error code is passed. See \ref
2398 * SCIP_Retcode "SCIP_RETCODE" for a complete list of error codes.
2399 *
2400 * @pre This method can be called if SCIP is in one of the following stages:
2401 * - \ref SCIP_STAGE_TRANSFORMED
2402 * - \ref SCIP_STAGE_INITPRESOLVE
2403 * - \ref SCIP_STAGE_PRESOLVING
2404 * - \ref SCIP_STAGE_EXITPRESOLVE
2405 * - \ref SCIP_STAGE_PRESOLVED
2406 * - \ref SCIP_STAGE_INITSOLVE
2407 * - \ref SCIP_STAGE_SOLVING
2408 * - \ref SCIP_STAGE_SOLVED
2409 * - \ref SCIP_STAGE_EXITSOLVE
2410 * - \ref SCIP_STAGE_FREETRANS
2411 */
2413 SCIP* scip, /**< SCIP data structure */
2414 FILE* file, /**< output file (or NULL for standard output) */
2415 const char* extension, /**< file format (or NULL for default CIP format)*/
2416 SCIP_Bool genericnames /**< using generic variable and constraint names? */
2417 )
2418{
2419 SCIP_RETCODE retcode;
2420
2421 SCIP_CALL( SCIPcheckStage(scip, "SCIPprintTransProblem", FALSE, FALSE, FALSE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, FALSE) );
2422
2423 assert(scip != NULL);
2424 assert(scip->transprob != NULL );
2425
2426 retcode = printProblem(scip, scip->transprob, file, extension, genericnames);
2427
2428 /* check for write errors */
2429 if( retcode == SCIP_WRITEERROR || retcode == SCIP_PLUGINNOTFOUND )
2430 return retcode;
2431 else
2432 {
2433 SCIP_CALL( retcode );
2434 }
2435
2436 return SCIP_OKAY;
2437}
2438
2439/** outputs status statistics
2440 *
2441 * @note If limits have been changed between the solution and the call to this function, the status is recomputed and
2442 * thus may to correspond to the original status.
2443 *
2444 * @pre This method can be called if SCIP is in one of the following stages:
2445 * - \ref SCIP_STAGE_INIT
2446 * - \ref SCIP_STAGE_PROBLEM
2447 * - \ref SCIP_STAGE_TRANSFORMED
2448 * - \ref SCIP_STAGE_INITPRESOLVE
2449 * - \ref SCIP_STAGE_PRESOLVING
2450 * - \ref SCIP_STAGE_EXITPRESOLVE
2451 * - \ref SCIP_STAGE_PRESOLVED
2452 * - \ref SCIP_STAGE_SOLVING
2453 * - \ref SCIP_STAGE_SOLVED
2454 */
2456 SCIP* scip, /**< SCIP data structure */
2457 FILE* file /**< output file */
2458 )
2459{
2460 assert(scip != NULL);
2461 assert(scip->set != NULL);
2462
2463 SCIP_CALL_ABORT( SCIPcheckStage(scip, "SCIPprintStatusStatistics", TRUE, TRUE, FALSE, TRUE, TRUE, TRUE, TRUE, TRUE, FALSE, TRUE, TRUE, FALSE, FALSE, FALSE) );
2464
2465 SCIPmessageFPrintInfo(scip->messagehdlr, file, "SCIP Status : ");
2467 SCIPmessageFPrintInfo(scip->messagehdlr, file, "\n");
2468}
2469
2470/** outputs statistics for original problem
2471 *
2472 * @pre This method can be called if SCIP is in one of the following stages:
2473 * - \ref SCIP_STAGE_PROBLEM
2474 * - \ref SCIP_STAGE_TRANSFORMED
2475 * - \ref SCIP_STAGE_INITPRESOLVE
2476 * - \ref SCIP_STAGE_PRESOLVING
2477 * - \ref SCIP_STAGE_EXITPRESOLVE
2478 * - \ref SCIP_STAGE_PRESOLVED
2479 * - \ref SCIP_STAGE_SOLVING
2480 * - \ref SCIP_STAGE_SOLVED
2481 */
2483 SCIP* scip, /**< SCIP data structure */
2484 FILE* file /**< output file */
2485 )
2486{
2487 assert(scip != NULL);
2488 assert(scip->set != NULL);
2489
2490 SCIP_CALL_ABORT( SCIPcheckStage(scip, "SCIPprintOrigProblemStatistics", FALSE, TRUE, FALSE, TRUE, TRUE, TRUE, TRUE, TRUE, FALSE, TRUE, TRUE, FALSE, FALSE, FALSE) );
2491
2492 SCIPmessageFPrintInfo(scip->messagehdlr, file, "Original Problem :\n");
2493 SCIPprobPrintStatistics(scip->origprob, scip->set, scip->messagehdlr, file);
2494}
2495
2496/** outputs statistics for transformed problem
2497 *
2498 * @pre This method can be called if SCIP is in one of the following stages:
2499 * - \ref SCIP_STAGE_PROBLEM
2500 * - \ref SCIP_STAGE_TRANSFORMED
2501 * - \ref SCIP_STAGE_INITPRESOLVE
2502 * - \ref SCIP_STAGE_PRESOLVING
2503 * - \ref SCIP_STAGE_EXITPRESOLVE
2504 * - \ref SCIP_STAGE_PRESOLVED
2505 * - \ref SCIP_STAGE_SOLVING
2506 * - \ref SCIP_STAGE_SOLVED
2507 */
2509 SCIP* scip, /**< SCIP data structure */
2510 FILE* file /**< output file */
2511 )
2512{
2513 assert(scip != NULL);
2514 assert(scip->set != NULL);
2515
2516 SCIP_CALL_ABORT( SCIPcheckStage(scip, "SCIPprintTransProblemStatistics", FALSE, TRUE, FALSE, TRUE, TRUE, TRUE, TRUE, TRUE, FALSE, TRUE, TRUE, FALSE, FALSE, FALSE) );
2517
2518 SCIPmessageFPrintInfo(scip->messagehdlr, file, "Presolved Problem :\n");
2519 SCIPprobPrintStatistics(scip->transprob, scip->set, scip->messagehdlr, file);
2520 SCIPmessageFPrintInfo(scip->messagehdlr, file, " Nonzeros : %" SCIP_LONGINT_FORMAT " constraint, %" SCIP_LONGINT_FORMAT " clique table\n",
2521 scip->stat->nnz, SCIPcliquetableGetNEntries(scip->cliquetable));
2522}
2523
2524/** outputs presolver statistics
2525 *
2526 * @pre This method can be called if SCIP is in one of the following stages:
2527 * - \ref SCIP_STAGE_TRANSFORMED
2528 * - \ref SCIP_STAGE_INITPRESOLVE
2529 * - \ref SCIP_STAGE_PRESOLVING
2530 * - \ref SCIP_STAGE_EXITPRESOLVE
2531 * - \ref SCIP_STAGE_PRESOLVED
2532 * - \ref SCIP_STAGE_SOLVING
2533 * - \ref SCIP_STAGE_SOLVED
2534 */
2536 SCIP* scip, /**< SCIP data structure */
2537 FILE* file /**< output file */
2538 )
2539{
2540 int i;
2541
2542 assert(scip != NULL);
2543 assert(scip->set != NULL);
2544
2545 SCIP_CALL_ABORT( SCIPcheckStage(scip, "SCIPprintPresolverStatistics", FALSE, FALSE, FALSE, TRUE, TRUE, TRUE, TRUE, TRUE, FALSE, TRUE, TRUE, FALSE, FALSE, FALSE) );
2546
2547 SCIPmessageFPrintInfo(scip->messagehdlr, file, "Presolvers : ExecTime SetupTime Calls FixedVars AggrVars ChgTypes ChgBounds AddHoles DelCons AddCons ChgSides ChgCoefs\n");
2548
2549 /* sort presolvers w.r.t. their name */
2551
2552 /* presolver statistics */
2553 for( i = 0; i < scip->set->npresols; ++i )
2554 {
2555 SCIP_PRESOL* presol;
2556 presol = scip->set->presols[i];
2557 SCIPmessageFPrintInfo(scip->messagehdlr, file, " %-17.17s:", SCIPpresolGetName(presol));
2558 SCIPmessageFPrintInfo(scip->messagehdlr, file, " %10.2f %10.2f %6d %10d %10d %10d %10d %10d %10d %10d %10d %10d\n",
2559 SCIPpresolGetTime(presol),
2560 SCIPpresolGetSetupTime(presol),
2561 SCIPpresolGetNCalls(presol),
2563 SCIPpresolGetNAggrVars(presol),
2565 SCIPpresolGetNChgBds(presol),
2566 SCIPpresolGetNAddHoles(presol),
2567 SCIPpresolGetNDelConss(presol),
2568 SCIPpresolGetNAddConss(presol),
2569 SCIPpresolGetNChgSides(presol),
2570 SCIPpresolGetNChgCoefs(presol));
2571 }
2572
2573 /* sort propagators w.r.t. their name */
2575
2576 for( i = 0; i < scip->set->nprops; ++i )
2577 {
2578 SCIP_PROP* prop;
2579 prop = scip->set->props[i];
2580 if( SCIPpropDoesPresolve(prop) )
2581 {
2582 SCIPmessageFPrintInfo(scip->messagehdlr, file, " %-17.17s:", SCIPpropGetName(prop));
2583 SCIPmessageFPrintInfo(scip->messagehdlr, file, " %10.2f %10.2f %6d %10d %10d %10d %10d %10d %10d %10d %10d %10d\n",
2590 SCIPpropGetNChgBds(prop),
2595 SCIPpropGetNChgCoefs(prop));
2596 }
2597 }
2598
2599 /* constraint handler presolving methods statistics */
2600 for( i = 0; i < scip->set->nconshdlrs; ++i )
2601 {
2602 SCIP_CONSHDLR* conshdlr;
2603 int maxnactiveconss;
2604
2605 conshdlr = scip->set->conshdlrs[i];
2606 maxnactiveconss = SCIPconshdlrGetMaxNActiveConss(conshdlr);
2607 if( SCIPconshdlrDoesPresolve(conshdlr)
2608 && (maxnactiveconss > 0 || !SCIPconshdlrNeedsCons(conshdlr)
2609 || SCIPconshdlrGetNFixedVars(conshdlr) > 0
2610 || SCIPconshdlrGetNAggrVars(conshdlr) > 0
2611 || SCIPconshdlrGetNChgVarTypes(conshdlr) > 0
2612 || SCIPconshdlrGetNChgBds(conshdlr) > 0
2613 || SCIPconshdlrGetNAddHoles(conshdlr) > 0
2614 || SCIPconshdlrGetNDelConss(conshdlr) > 0
2615 || SCIPconshdlrGetNAddConss(conshdlr) > 0
2616 || SCIPconshdlrGetNChgSides(conshdlr) > 0
2617 || SCIPconshdlrGetNChgCoefs(conshdlr) > 0
2618 || SCIPconshdlrGetNUpgdConss(conshdlr) > 0) )
2619 {
2620 SCIPmessageFPrintInfo(scip->messagehdlr, file, " %-17.17s:", SCIPconshdlrGetName(conshdlr));
2621 SCIPmessageFPrintInfo(scip->messagehdlr, file, " %10.2f %10.2f %6d %10d %10d %10d %10d %10d %10d %10d %10d %10d\n",
2622 SCIPconshdlrGetPresolTime(conshdlr),
2623 SCIPconshdlrGetSetupTime(conshdlr),
2625 SCIPconshdlrGetNFixedVars(conshdlr),
2626 SCIPconshdlrGetNAggrVars(conshdlr),
2628 SCIPconshdlrGetNChgBds(conshdlr),
2629 SCIPconshdlrGetNAddHoles(conshdlr),
2630 SCIPconshdlrGetNDelConss(conshdlr),
2631 SCIPconshdlrGetNAddConss(conshdlr),
2632 SCIPconshdlrGetNChgSides(conshdlr),
2633 SCIPconshdlrGetNChgCoefs(conshdlr));
2634 }
2635 }
2636
2637 /* root node bound changes */
2638 SCIPmessageFPrintInfo(scip->messagehdlr, file, " root node : - - - %10d - - %10d - - - - -\n",
2639 scip->stat->nrootintfixings, scip->stat->nrootboundchgs);
2640}
2641
2642/** outputs constraint statistics
2643 *
2644 * @pre This method can be called if SCIP is in one of the following stages:
2645 * - \ref SCIP_STAGE_TRANSFORMED
2646 * - \ref SCIP_STAGE_INITPRESOLVE
2647 * - \ref SCIP_STAGE_PRESOLVING
2648 * - \ref SCIP_STAGE_EXITPRESOLVE
2649 * - \ref SCIP_STAGE_PRESOLVED
2650 * - \ref SCIP_STAGE_SOLVING
2651 * - \ref SCIP_STAGE_SOLVED
2652 */
2654 SCIP* scip, /**< SCIP data structure */
2655 FILE* file /**< output file */
2656 )
2657{
2658 int i;
2659
2660 assert(scip != NULL);
2661 assert(scip->set != NULL);
2662
2663 SCIP_CALL_ABORT( SCIPcheckStage(scip, "SCIPprintConstraintStatistics", FALSE, FALSE, FALSE, TRUE, TRUE, TRUE, TRUE, TRUE, FALSE, TRUE, TRUE, FALSE, FALSE, FALSE) );
2664
2665 /* Add maximal number of constraints of the same type? So far this information is not added because of lack of space. */
2666 SCIPmessageFPrintInfo(scip->messagehdlr, file, "Constraints : Number MaxNumber #Separate #Propagate #EnfoLP #EnfoRelax #EnfoPS #Check #ResProp Cutoffs DomReds Cuts Applied Conss Children\n");
2667
2668 for( i = 0; i < scip->set->nconshdlrs; ++i )
2669 {
2670 SCIP_CONSHDLR* conshdlr;
2671 int startnactiveconss;
2672 int maxnactiveconss;
2673
2674 conshdlr = scip->set->conshdlrs[i];
2675 startnactiveconss = SCIPconshdlrGetStartNActiveConss(conshdlr);
2676 maxnactiveconss = SCIPconshdlrGetMaxNActiveConss(conshdlr);
2677 if( maxnactiveconss > 0 || !SCIPconshdlrNeedsCons(conshdlr) )
2678 {
2679 SCIPmessageFPrintInfo(scip->messagehdlr, file, " %-17.17s:", SCIPconshdlrGetName(conshdlr));
2681 startnactiveconss,
2682 maxnactiveconss > startnactiveconss ? '+' : ' ',
2683 maxnactiveconss,
2684 SCIPconshdlrGetNSepaCalls(conshdlr),
2685 SCIPconshdlrGetNPropCalls(conshdlr),
2691 SCIPconshdlrGetNCutoffs(conshdlr),
2693 SCIPconshdlrGetNCutsFound(conshdlr),
2696 SCIPconshdlrGetNChildren(conshdlr));
2697 }
2698 }
2699}
2700
2701/** outputs constraint timing statistics
2702 *
2703 * @pre This method can be called if SCIP is in one of the following stages:
2704 * - \ref SCIP_STAGE_TRANSFORMED
2705 * - \ref SCIP_STAGE_INITPRESOLVE
2706 * - \ref SCIP_STAGE_PRESOLVING
2707 * - \ref SCIP_STAGE_EXITPRESOLVE
2708 * - \ref SCIP_STAGE_PRESOLVED
2709 * - \ref SCIP_STAGE_SOLVING
2710 * - \ref SCIP_STAGE_SOLVED
2711 */
2713 SCIP* scip, /**< SCIP data structure */
2714 FILE* file /**< output file */
2715 )
2716{
2717 int i;
2718
2719 assert(scip != NULL);
2720 assert(scip->set != NULL);
2721
2722 SCIP_CALL_ABORT( SCIPcheckStage(scip, "SCIPprintConstraintTimingStatistics", FALSE, FALSE, FALSE, TRUE, TRUE, TRUE, TRUE, TRUE, FALSE, TRUE, TRUE, FALSE, FALSE, FALSE) );
2723
2724 SCIPmessageFPrintInfo(scip->messagehdlr, file, "Constraint Timings : TotalTime SetupTime Separate Propagate EnfoLP EnfoPS EnfoRelax Check ResProp SB-Prop\n");
2725
2726 for( i = 0; i < scip->set->nconshdlrs; ++i )
2727 {
2728 SCIP_CONSHDLR* conshdlr;
2729 int maxnactiveconss;
2730
2731 conshdlr = scip->set->conshdlrs[i];
2732 maxnactiveconss = SCIPconshdlrGetMaxNActiveConss(conshdlr);
2733 if( maxnactiveconss > 0 || !SCIPconshdlrNeedsCons(conshdlr) )
2734 {
2735 SCIP_Real totaltime;
2736
2737 totaltime = SCIPconshdlrGetSepaTime(conshdlr) + SCIPconshdlrGetPropTime(conshdlr)
2739 + SCIPconshdlrGetEnfoLPTime(conshdlr)
2740 + SCIPconshdlrGetEnfoPSTime(conshdlr)
2742 + SCIPconshdlrGetCheckTime(conshdlr)
2743 + SCIPconshdlrGetRespropTime(conshdlr)
2744 + SCIPconshdlrGetSetupTime(conshdlr);
2745
2746 SCIPmessageFPrintInfo(scip->messagehdlr, file, " %-17.17s:", SCIPconshdlrGetName(conshdlr));
2747 SCIPmessageFPrintInfo(scip->messagehdlr, file, " %10.2f %10.2f %10.2f %10.2f %10.2f %10.2f %10.2f %10.2f %10.2f %10.2f\n",
2748 totaltime,
2749 SCIPconshdlrGetSetupTime(conshdlr),
2750 SCIPconshdlrGetSepaTime(conshdlr),
2751 SCIPconshdlrGetPropTime(conshdlr),
2752 SCIPconshdlrGetEnfoLPTime(conshdlr),
2753 SCIPconshdlrGetEnfoPSTime(conshdlr),
2755 SCIPconshdlrGetCheckTime(conshdlr),
2758 }
2759 }
2760}
2761
2762/** outputs propagator statistics
2763 *
2764 * @pre This method can be called if SCIP is in one of the following stages:
2765 * - \ref SCIP_STAGE_TRANSFORMED
2766 * - \ref SCIP_STAGE_INITPRESOLVE
2767 * - \ref SCIP_STAGE_PRESOLVING
2768 * - \ref SCIP_STAGE_EXITPRESOLVE
2769 * - \ref SCIP_STAGE_PRESOLVED
2770 * - \ref SCIP_STAGE_SOLVING
2771 * - \ref SCIP_STAGE_SOLVED
2772 */
2774 SCIP* scip, /**< SCIP data structure */
2775 FILE* file /**< output file */
2776 )
2777{
2778 int i;
2779
2780 assert(scip != NULL);
2781 assert(scip->set != NULL);
2782
2783 SCIP_CALL_ABORT( SCIPcheckStage(scip, "SCIPprintPropagatorStatistics", FALSE, FALSE, FALSE, TRUE, TRUE, TRUE, TRUE, TRUE, FALSE, TRUE, TRUE, FALSE, FALSE, FALSE) );
2784
2785 SCIPmessageFPrintInfo(scip->messagehdlr, file, "Propagators : #Propagate #ResProp Cutoffs DomReds\n");
2786
2787 /* sort propagaters w.r.t. their name */
2789
2790 for( i = 0; i < scip->set->nprops; ++i )
2791 {
2792 SCIP_PROP* prop;
2793 prop = scip->set->props[i];
2794
2795 SCIPmessageFPrintInfo(scip->messagehdlr, file, " %-17.17s: %10" SCIP_LONGINT_FORMAT " %10" SCIP_LONGINT_FORMAT " %10" SCIP_LONGINT_FORMAT " %10" SCIP_LONGINT_FORMAT "\n",
2796 SCIPpropGetName(prop),
2797 SCIPpropGetNCalls(prop),
2799 SCIPpropGetNCutoffs(prop),
2801 }
2802
2803 SCIPmessageFPrintInfo(scip->messagehdlr, file, "Propagator Timings : TotalTime SetupTime Presolve Propagate ResProp SB-Prop\n");
2804
2805 for( i = 0; i < scip->set->nprops; ++i )
2806 {
2807 SCIP_PROP* prop;
2808 SCIP_Real totaltime;
2809
2810 prop = scip->set->props[i];
2811 totaltime = SCIPpropGetPresolTime(prop) + SCIPpropGetTime(prop) + SCIPpropGetRespropTime(prop)
2813
2814 SCIPmessageFPrintInfo(scip->messagehdlr, file, " %-17.17s:", SCIPpropGetName(prop));
2815 SCIPmessageFPrintInfo(scip->messagehdlr, file, " %10.2f %10.2f %10.2f %10.2f %10.2f %10.2f\n",
2816 totaltime,
2819 SCIPpropGetTime(prop),
2822 }
2823}
2824
2825/** outputs conflict statistics
2826 *
2827 * @pre This method can be called if SCIP is in one of the following stages:
2828 * - \ref SCIP_STAGE_TRANSFORMED
2829 * - \ref SCIP_STAGE_INITPRESOLVE
2830 * - \ref SCIP_STAGE_PRESOLVING
2831 * - \ref SCIP_STAGE_EXITPRESOLVE
2832 * - \ref SCIP_STAGE_PRESOLVED
2833 * - \ref SCIP_STAGE_SOLVING
2834 * - \ref SCIP_STAGE_SOLVED
2835 */
2837 SCIP* scip, /**< SCIP data structure */
2838 FILE* file /**< output file */
2839 )
2840{
2841 char initstoresize[SCIP_MAXSTRLEN];
2842 char maxstoresize[SCIP_MAXSTRLEN];
2843
2844 assert(scip != NULL);
2845 assert(scip->set != NULL);
2846
2847 SCIP_CALL_ABORT( SCIPcheckStage(scip, "SCIPprintConflictStatistics", FALSE, FALSE, FALSE, TRUE, TRUE, TRUE, TRUE, TRUE, FALSE, TRUE, TRUE, FALSE, FALSE, FALSE) );
2848
2849 if( scip->set->conf_maxstoresize == 0 )
2850 {
2851 (void)SCIPsnprintf(initstoresize, SCIP_MAXSTRLEN, "inf");
2852 (void)SCIPsnprintf(maxstoresize, SCIP_MAXSTRLEN, "inf");
2853 }
2854 else
2855 {
2856 int initsize = SCIPconflictstoreGetInitPoolSize(scip->conflictstore);
2857 int maxsize = SCIPconflictstoreGetMaxPoolSize(scip->conflictstore);
2858
2859 if( maxsize == -1 )
2860 {
2861 (void)SCIPsnprintf(initstoresize, SCIP_MAXSTRLEN, "--");
2862 (void)SCIPsnprintf(maxstoresize, SCIP_MAXSTRLEN, "--");
2863 }
2864 else
2865 {
2866 assert(initsize >= 0);
2867 assert(maxsize >= 0);
2868
2869 (void)SCIPsnprintf(initstoresize, SCIP_MAXSTRLEN, "%d", initsize);
2870 (void)SCIPsnprintf(maxstoresize, SCIP_MAXSTRLEN, "%d", maxsize);
2871 }
2872 }
2873 SCIPmessageFPrintInfo(scip->messagehdlr, file, "Conflict Analysis : Time Calls Success DomReds Conflicts Literals Reconvs ReconvLits Dualrays Nonzeros LP Iters (pool size: [%s,%s])\n", initstoresize, maxstoresize);
2874 SCIPmessageFPrintInfo(scip->messagehdlr, file, " propagation : %10.2f %10" SCIP_LONGINT_FORMAT " %10" SCIP_LONGINT_FORMAT " - %10" SCIP_LONGINT_FORMAT " %10.1f %10" SCIP_LONGINT_FORMAT " %10.1f - - -\n",
2875 SCIPconflictGetPropTime(scip->conflict),
2886 SCIPmessageFPrintInfo(scip->messagehdlr, file, " infeasible LP : %10.2f %10" SCIP_LONGINT_FORMAT " %10" SCIP_LONGINT_FORMAT " - %10" SCIP_LONGINT_FORMAT " %10.1f %10" SCIP_LONGINT_FORMAT " %10.1f %10" SCIP_LONGINT_FORMAT " %10.1f %10" SCIP_LONGINT_FORMAT "\n",
2903 SCIPmessageFPrintInfo(scip->messagehdlr, file, " bound exceed. LP : %10.2f %10" SCIP_LONGINT_FORMAT " %10" SCIP_LONGINT_FORMAT " - %10" SCIP_LONGINT_FORMAT " %10.1f %10" SCIP_LONGINT_FORMAT " %10.1f %10" SCIP_LONGINT_FORMAT " %10.1f %10" SCIP_LONGINT_FORMAT "\n",
2920 SCIPmessageFPrintInfo(scip->messagehdlr, file, " strong branching : %10.2f %10" SCIP_LONGINT_FORMAT " %10" SCIP_LONGINT_FORMAT " - %10" SCIP_LONGINT_FORMAT " %10.1f %10" SCIP_LONGINT_FORMAT " %10.1f - - %10" SCIP_LONGINT_FORMAT "\n",
2933 SCIPmessageFPrintInfo(scip->messagehdlr, file, " pseudo solution : %10.2f %10" SCIP_LONGINT_FORMAT " %10" SCIP_LONGINT_FORMAT " - %10" SCIP_LONGINT_FORMAT " %10.1f %10" SCIP_LONGINT_FORMAT " %10.1f - - -\n",
2945 SCIPmessageFPrintInfo(scip->messagehdlr, file, " applied globally : %10.2f - - %10" SCIP_LONGINT_FORMAT " %10" SCIP_LONGINT_FORMAT " %10.1f - - %10" SCIP_LONGINT_FORMAT " - -\n",
2953 SCIPmessageFPrintInfo(scip->messagehdlr, file, " applied locally : - - - %10" SCIP_LONGINT_FORMAT " %10" SCIP_LONGINT_FORMAT " %10.1f - - %10" SCIP_LONGINT_FORMAT " - -\n",
2960}
2961
2962/** outputs separator statistics
2963 *
2964 * Columns:
2965 * - RootCalls: The number of calls that happened at the root.
2966 * - FoundCuts: The total number of cuts generated by the separators.
2967 * Note: Cutpool-FoundCuts \f$= \sum_{i=1}^nsepas ( Foundcuts_i - DirectAdd_i )\f$.
2968 * - ViaPoolAdd: The total number of cuts added to the sepastore from the cutpool.
2969 * - DirectAdd: The total number of cuts added directly to the sepastore from the separator.
2970 * - Applied: The sum of all cuts from the separator that were applied to the LP.
2971 * - ViaPoolApp: The number of cuts that entered the sepastore from the cutpool that were applied to the LP.
2972 * - DirectApp: The number of cuts that entered the sepastore directly and were applied to the LP.
2973 *
2974 * The number of cuts ViaPoolAdd + Directly should be equal to the number of cuts Filtered + Forced + Selected in the
2975 * cutselector statistics.
2976 *
2977 * @note The following edge case may lead to over or undercounting of statistics: When SCIPapplyCutsProbing() is
2978 * called, cuts are counted for the cut selection statistics, but not for the separator statistics. This
2979 * happens, e.g., in the default plugin prop_obbt.c.
2980 *
2981 * @pre This method can be called if SCIP is in one of the following stages:
2982 * - \ref SCIP_STAGE_SOLVING
2983 * - \ref SCIP_STAGE_SOLVED
2984 */
2986 SCIP* scip, /**< SCIP data structure */
2987 FILE* file /**< output file */
2988 )
2989{
2990 int i;
2991
2992 assert(scip != NULL);
2993 assert(scip->set != NULL);
2994
2995 SCIP_CALL_ABORT( SCIPcheckStage(scip, "SCIPprintSeparatorStatistics", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, TRUE, FALSE, FALSE, FALSE) );
2996
2997 SCIPmessageFPrintInfo(scip->messagehdlr, file, "Separators : ExecTime SetupTime Calls RootCalls Cutoffs DomReds FoundCuts ViaPoolAdd DirectAdd Applied ViaPoolApp DirectApp Conss\n");
2998 SCIPmessageFPrintInfo(scip->messagehdlr, file, " cut pool : %10.2f - %10" SCIP_LONGINT_FORMAT " %10" SCIP_LONGINT_FORMAT " - - %10" SCIP_LONGINT_FORMAT " %10" SCIP_LONGINT_FORMAT " - - - - - (maximal pool size: %10" SCIP_LONGINT_FORMAT")\n",
2999 SCIPcutpoolGetTime(scip->cutpool),
3000 SCIPcutpoolGetNCalls(scip->cutpool),
3004 SCIPcutpoolGetMaxNCuts(scip->cutpool));
3005
3006 /* sort separators w.r.t. their name */
3008
3009 for( i = 0; i < scip->set->nsepas; ++i )
3010 {
3011 SCIP_SEPA* sepa;
3012
3013 sepa = scip->set->sepas[i];
3014
3015 /* only output data for separators without parent separator */
3016 if( SCIPsepaGetParentsepa(sepa) == NULL )
3017 {
3018 /* output data */
3020 SCIPsepaGetName(sepa),
3021 SCIPsepaGetTime(sepa),
3023 SCIPsepaGetNCalls(sepa),
3025 SCIPsepaGetNCutoffs(sepa),
3034
3035 /* for parent separators search for dependent separators */
3036 if( SCIPsepaIsParentsepa(sepa) )
3037 {
3038 SCIP_SEPA* parentsepa;
3039 int k;
3040
3041 for( k = 0; k < scip->set->nsepas; ++k )
3042 {
3043 if( k == i )
3044 continue;
3045
3046 parentsepa = SCIPsepaGetParentsepa(scip->set->sepas[k]);
3047 if( parentsepa != sepa )
3048 continue;
3049
3050 SCIPmessageFPrintInfo(scip->messagehdlr, file, " > %-15.17s: %10s %10s %10s %10s %10s %10s %10s %10" SCIP_LONGINT_FORMAT" %10" SCIP_LONGINT_FORMAT" %10" SCIP_LONGINT_FORMAT" %10" SCIP_LONGINT_FORMAT " %10" SCIP_LONGINT_FORMAT " %10s\n",
3051 SCIPsepaGetName(scip->set->sepas[k]), "-", "-", "-", "-", "-", "-", "-",
3052 SCIPsepaGetNCutsAddedViaPool(scip->set->sepas[k]),
3053 SCIPsepaGetNCutsAddedDirect(scip->set->sepas[k]),
3054 SCIPsepaGetNCutsApplied(scip->set->sepas[k]),
3055 SCIPsepaGetNCutsAppliedViaPool(scip->set->sepas[k]),
3056 SCIPsepaGetNCutsAppliedDirect(scip->set->sepas[k]), "-");
3057 }
3058 }
3059 }
3060 }
3061}
3062
3063/** outputs cutselector statistics
3064 *
3065 * Filtered = ViaPoolAdd(Separators) + DirectAdd(Separators) - Selected - Cuts(Constraints)
3066 * Selected = Applied(Separators) + Applied(Constraints)
3067 *
3068 * @pre This method can be called if SCIP is in one of the following stages:
3069 * - \ref SCIP_STAGE_SOLVING
3070 * - \ref SCIP_STAGE_SOLVED
3071 */
3073 SCIP* scip, /**< SCIP data structure */
3074 FILE* file /**< output file */
3075 )
3076{
3077 int i;
3078
3079 assert(scip != NULL);
3080 assert(scip->set != NULL);
3081
3082 SCIP_CALL_ABORT( SCIPcheckStage(scip, "SCIPprintCutselectorStatistics", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, TRUE, FALSE, FALSE, FALSE) );
3083
3084 SCIPmessageFPrintInfo(scip->messagehdlr, file, "Cutselectors : ExecTime SetupTime Calls RootCalls Selected Forced Filtered RootSelec RootForc RootFilt \n");
3085
3086 /* sort cutsels w.r.t. their priority */
3088
3089 for( i = 0; i < scip->set->ncutsels; ++i )
3090 {
3091 SCIPmessageFPrintInfo(scip->messagehdlr, file, " %-17.17s: %10.2f %10.2f %10" SCIP_LONGINT_FORMAT " %10" SCIP_LONGINT_FORMAT " %10" SCIP_LONGINT_FORMAT " %10" SCIP_LONGINT_FORMAT " %10" SCIP_LONGINT_FORMAT " %10" SCIP_LONGINT_FORMAT " %10" SCIP_LONGINT_FORMAT " %10" SCIP_LONGINT_FORMAT "\n",
3092 SCIPcutselGetName(scip->set->cutsels[i]),
3093 SCIPcutselGetTime(scip->set->cutsels[i]),
3094 SCIPcutselGetSetupTime(scip->set->cutsels[i]),
3095 SCIPcutselGetNCalls(scip->set->cutsels[i]),
3096 SCIPcutselGetNRootCalls(scip->set->cutsels[i]),
3097 SCIPcutselGetNRootCuts(scip->set->cutsels[i]) + SCIPcutselGetNLocalCuts(scip->set->cutsels[i]),
3098 SCIPcutselGetNRootForcedCuts(scip->set->cutsels[i]) + SCIPcutselGetNLocalForcedCuts(scip->set->cutsels[i]),
3099 SCIPcutselGetNRootCutsFiltered(scip->set->cutsels[i]) + SCIPcutselGetNLocalCutsFiltered(scip->set->cutsels[i]),
3100 SCIPcutselGetNRootCuts(scip->set->cutsels[i]),
3101 SCIPcutselGetNRootForcedCuts(scip->set->cutsels[i]),
3102 SCIPcutselGetNRootCutsFiltered(scip->set->cutsels[i])
3103 );
3104 }
3105}
3106
3107/** outputs pricer statistics
3108 *
3109 * @pre This method can be called if SCIP is in one of the following stages:
3110 * - \ref SCIP_STAGE_SOLVING
3111 * - \ref SCIP_STAGE_SOLVED
3112 */
3114 SCIP* scip, /**< SCIP data structure */
3115 FILE* file /**< output file */
3116 )
3117{
3118 int i;
3119
3120 assert(scip != NULL);
3121 assert(scip->set != NULL);
3122
3123 SCIP_CALL_ABORT( SCIPcheckStage(scip, "SCIPprintPricerStatistics", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, TRUE, FALSE, FALSE, FALSE) );
3124
3125 SCIPmessageFPrintInfo(scip->messagehdlr, file, "Pricers : ExecTime SetupTime Calls Vars\n");
3126 SCIPmessageFPrintInfo(scip->messagehdlr, file, " problem variables: %10.2f - %10d %10d\n",
3130
3131 /* sort pricers w.r.t. their name */
3133
3134 for( i = 0; i < scip->set->nactivepricers; ++i )
3135 {
3136 SCIPmessageFPrintInfo(scip->messagehdlr, file, " %-17.17s: %10.2f %10.2f %10d %10d\n",
3137 SCIPpricerGetName(scip->set->pricers[i]),
3138 SCIPpricerGetTime(scip->set->pricers[i]),
3139 SCIPpricerGetSetupTime(scip->set->pricers[i]),
3140 SCIPpricerGetNCalls(scip->set->pricers[i]),
3141 SCIPpricerGetNVarsFound(scip->set->pricers[i]));
3142 }
3143}
3144
3145/** outputs branching rule statistics
3146 *
3147 * @pre This method can be called if SCIP is in one of the following stages:
3148 * - \ref SCIP_STAGE_SOLVING
3149 * - \ref SCIP_STAGE_SOLVED
3150 */
3152 SCIP* scip, /**< SCIP data structure */
3153 FILE* file /**< output file */
3154 )
3155{
3156 int i;
3157
3158 assert(scip != NULL);
3159 assert(scip->set != NULL);
3160
3161 SCIP_CALL_ABORT( SCIPcheckStage(scip, "SCIPprintBranchruleStatistics", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, TRUE, FALSE, FALSE, FALSE) );
3162
3163 SCIPmessageFPrintInfo(scip->messagehdlr, file, "Branching Rules : ExecTime SetupTime BranchLP BranchExt BranchPS Cutoffs DomReds Cuts Conss Children\n");
3164
3165 /* sort branching rules w.r.t. their name */
3167
3168 for( i = 0; i < scip->set->nbranchrules; ++i )
3169 {
3170 SCIPmessageFPrintInfo(scip->messagehdlr, file, " %-17.17s: %10.2f %10.2f %10" SCIP_LONGINT_FORMAT " %10" SCIP_LONGINT_FORMAT " %10" SCIP_LONGINT_FORMAT " %10" SCIP_LONGINT_FORMAT " %10" SCIP_LONGINT_FORMAT " %10" SCIP_LONGINT_FORMAT " %10" SCIP_LONGINT_FORMAT " %10" SCIP_LONGINT_FORMAT "\n",
3171 SCIPbranchruleGetName(scip->set->branchrules[i]),
3172 SCIPbranchruleGetTime(scip->set->branchrules[i]),
3173 SCIPbranchruleGetSetupTime(scip->set->branchrules[i]),
3174 SCIPbranchruleGetNLPCalls(scip->set->branchrules[i]),
3175 SCIPbranchruleGetNExternCalls(scip->set->branchrules[i]),
3176 SCIPbranchruleGetNPseudoCalls(scip->set->branchrules[i]),
3177 SCIPbranchruleGetNCutoffs(scip->set->branchrules[i]),
3178 SCIPbranchruleGetNDomredsFound(scip->set->branchrules[i]),
3179 SCIPbranchruleGetNCutsFound(scip->set->branchrules[i]),
3180 SCIPbranchruleGetNConssFound(scip->set->branchrules[i]),
3181 SCIPbranchruleGetNChildren(scip->set->branchrules[i]));
3182 }
3183}
3184
3185/** outputs heuristics statistics
3186 *
3187 * @pre This method can be called if SCIP is in one of the following stages:
3188 * - \ref SCIP_STAGE_PRESOLVING
3189 * - \ref SCIP_STAGE_EXITPRESOLVE
3190 * - \ref SCIP_STAGE_PRESOLVED
3191 * - \ref SCIP_STAGE_SOLVING
3192 * - \ref SCIP_STAGE_SOLVED
3193 */
3195 SCIP* scip, /**< SCIP data structure */
3196 FILE* file /**< output file */
3197 )
3198{
3199 int ndivesets = 0;
3200 int i;
3201
3202 assert(scip != NULL);
3203 assert(scip->set != NULL);
3204 assert(scip->tree != NULL);
3205
3206 SCIP_CALL_ABORT( SCIPcheckStage(scip, "SCIPprintHeuristicStatistics", FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, TRUE, TRUE, FALSE, TRUE, TRUE, FALSE, FALSE, FALSE) );
3207
3208 SCIPmessageFPrintInfo(scip->messagehdlr, file, "Primal Heuristics : ExecTime SetupTime Calls Found Best\n");
3209 SCIPmessageFPrintInfo(scip->messagehdlr, file, " LP solutions : %10.2f - - %10" SCIP_LONGINT_FORMAT " %10" SCIP_LONGINT_FORMAT "\n",
3210 SCIPclockGetTime(scip->stat->lpsoltime),
3211 scip->stat->nlpsolsfound, scip->stat->nlpbestsolsfound);
3212 SCIPmessageFPrintInfo(scip->messagehdlr, file, " relax solutions : %10.2f - - %10" SCIP_LONGINT_FORMAT " %10" SCIP_LONGINT_FORMAT "\n",
3213 SCIPclockGetTime(scip->stat->relaxsoltime),
3214 scip->stat->nrelaxsolsfound, scip->stat->nrelaxbestsolsfound);
3215 SCIPmessageFPrintInfo(scip->messagehdlr, file, " pseudo solutions : %10.2f - - %10" SCIP_LONGINT_FORMAT " %10" SCIP_LONGINT_FORMAT "\n",
3216 SCIPclockGetTime(scip->stat->pseudosoltime),
3217 scip->stat->npssolsfound, scip->stat->npsbestsolsfound);
3218 SCIPmessageFPrintInfo(scip->messagehdlr, file, " strong branching : %10.2f - - %10" SCIP_LONGINT_FORMAT " %10" SCIP_LONGINT_FORMAT "\n",
3219 SCIPclockGetTime(scip->stat->sbsoltime),
3220 scip->stat->nsbsolsfound, scip->stat->nsbbestsolsfound);
3221
3222 /* sort heuristics w.r.t. their names */
3224
3225 for( i = 0; i < scip->set->nheurs; ++i )
3226 {
3227 SCIPmessageFPrintInfo(scip->messagehdlr, file, " %-17.17s: %10.2f %10.2f %10" SCIP_LONGINT_FORMAT " %10" SCIP_LONGINT_FORMAT " %10" SCIP_LONGINT_FORMAT "\n",
3228 SCIPheurGetName(scip->set->heurs[i]),
3229 SCIPheurGetTime(scip->set->heurs[i]),
3230 SCIPheurGetSetupTime(scip->set->heurs[i]),
3231 SCIPheurGetNCalls(scip->set->heurs[i]),
3232 SCIPheurGetNSolsFound(scip->set->heurs[i]),
3233 SCIPheurGetNBestSolsFound(scip->set->heurs[i]));
3234
3235 /* count heuristics that use diving; needed to determine output later */
3236 ndivesets += SCIPheurGetNDivesets(scip->set->heurs[i]);
3237 }
3238
3239 SCIPmessageFPrintInfo(scip->messagehdlr, file, " other solutions : - - - %10" SCIP_LONGINT_FORMAT " -\n",
3240 scip->stat->nexternalsolsfound);
3241
3242 if ( ndivesets > 0 && scip->set->misc_showdivingstats )
3243 {
3244 int c;
3246
3247 /* print statistics for all three contexts individually */
3248 for( c = 0; c < 3; ++c )
3249 {
3250 SCIP_DIVECONTEXT divecontext = divecontexts[c];
3251
3252 if( divecontext == SCIP_DIVECONTEXT_SINGLE )
3253 {
3254 SCIPmessageFPrintInfo(scip->messagehdlr, file,
3255 "Diving %-12s: Calls Nodes LP Iters Backtracks Conflicts MinDepth MaxDepth AvgDepth RoundSols NLeafSols MinSolDpt MaxSolDpt AvgSolDpt\n", "(single)");
3256 }
3257 else
3258 {
3259 SCIPmessageFPrintInfo(scip->messagehdlr, file,
3260 "Diving %-12s: Calls Nodes LP Iters Backtracks Conflicts MinDepth MaxDepth AvgDepth RoundSols NLeafSols MinSolDpt MaxSolDpt AvgSolDpt\n",
3261 divecontext == SCIP_DIVECONTEXT_ADAPTIVE ? "(adaptive)" : "(scheduler)");
3262 }
3263
3264 for( i = 0; i < scip->set->nheurs; ++i )
3265 {
3266 int s;
3267 for( s = 0; s < SCIPheurGetNDivesets(scip->set->heurs[i]); ++s )
3268 {
3269 SCIP_DIVESET* diveset = SCIPheurGetDivesets(scip->set->heurs[i])[s];
3270
3271 SCIPmessageFPrintInfo(scip->messagehdlr, file, " %-17.17s: %10d",
3272 SCIPdivesetGetName(diveset),
3273 SCIPdivesetGetNCalls(diveset, divecontext));
3274 if( SCIPdivesetGetNCalls(diveset, divecontext) > 0 )
3275 {
3276 SCIPmessageFPrintInfo(scip->messagehdlr, file, " %10" SCIP_LONGINT_FORMAT " %10" SCIP_LONGINT_FORMAT " %10" SCIP_LONGINT_FORMAT " %10" SCIP_LONGINT_FORMAT " %10d %10d %10.1f %10" SCIP_LONGINT_FORMAT,
3277 SCIPdivesetGetNProbingNodes(diveset, divecontext),
3278 SCIPdivesetGetNLPIterations(diveset, divecontext),
3279 SCIPdivesetGetNBacktracks(diveset, divecontext),
3280 SCIPdivesetGetNConflicts(diveset, divecontext),
3281 SCIPdivesetGetMinDepth(diveset, divecontext),
3282 SCIPdivesetGetMaxDepth(diveset, divecontext),
3283 SCIPdivesetGetAvgDepth(diveset, divecontext),
3284 SCIPdivesetGetNSols(diveset, divecontext) - SCIPdivesetGetNSolutionCalls(diveset, divecontext));
3285
3286 if( SCIPdivesetGetNSolutionCalls(diveset, divecontext) > 0 )
3287 {
3288 SCIPmessageFPrintInfo(scip->messagehdlr, file, " %10d %10d %10d %10.1f\n",
3289 SCIPdivesetGetNSolutionCalls(diveset, divecontext),
3290 SCIPdivesetGetMinSolutionDepth(diveset, divecontext),
3291 SCIPdivesetGetMaxSolutionDepth(diveset, divecontext),
3292 SCIPdivesetGetAvgSolutionDepth(diveset, divecontext));
3293 }
3294 else
3295 SCIPmessageFPrintInfo(scip->messagehdlr, file, " - - - -\n");
3296 }
3297 else
3298 SCIPmessageFPrintInfo(scip->messagehdlr, file, " - - - - - - - - - - - -\n");
3299 }
3300 }
3301 }
3302 }
3303}
3304
3305/** outputs compression statistics
3306 *
3307 * @pre This method can be called if SCIP is in one of the following stages:
3308 * - \ref SCIP_STAGE_PRESOLVING
3309 * - \ref SCIP_STAGE_EXITPRESOLVE
3310 * - \ref SCIP_STAGE_PRESOLVED
3311 * - \ref SCIP_STAGE_SOLVING
3312 * - \ref SCIP_STAGE_SOLVED
3313 */
3315 SCIP* scip, /**< SCIP data structure */
3316 FILE* file /**< output file */
3317 )
3318{
3319 int i;
3320
3321 assert(scip != NULL);
3322
3323 SCIP_CALL_ABORT( SCIPcheckStage(scip, "SCIPprintCompressionStatistics", FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, TRUE, TRUE, FALSE, TRUE, TRUE, FALSE, FALSE, FALSE) );
3324
3325 /* only print compression statistics if tree reoptimization is enabled */
3326 if( !scip->set->reopt_enable )
3327 return;
3328
3329 SCIPmessageFPrintInfo(scip->messagehdlr, file, "Tree Compressions : ExecTime SetupTime Calls Found\n");
3330
3331 /* sort compressions w.r.t. their names */
3333
3334 for( i = 0; i < scip->set->ncomprs; ++i )
3335 {
3336 SCIPmessageFPrintInfo(scip->messagehdlr, file, " %-17.17s: %10.2f %10.2f %10" SCIP_LONGINT_FORMAT " %10" SCIP_LONGINT_FORMAT "\n",
3337 SCIPcomprGetName(scip->set->comprs[i]),
3338 SCIPcomprGetTime(scip->set->comprs[i]),
3339 SCIPcomprGetSetupTime(scip->set->comprs[i]),
3340 SCIPcomprGetNCalls(scip->set->comprs[i]),
3341 SCIPcomprGetNFound(scip->set->comprs[i]));
3342 }
3343}
3344
3345/** outputs LP statistics
3346 *
3347 * @pre This method can be called if SCIP is in one of the following stages:
3348 * - \ref SCIP_STAGE_SOLVING
3349 * - \ref SCIP_STAGE_SOLVED
3350 */
3352 SCIP* scip, /**< SCIP data structure */
3353 FILE* file /**< output file */
3354 )
3355{
3356 assert(scip != NULL);
3357 assert(scip->stat != NULL);
3358 assert(scip->lp != NULL);
3359
3361
3362 SCIPmessageFPrintInfo(scip->messagehdlr, file, "LP : Time Calls Iterations Iter/call Iter/sec Time-0-It Calls-0-It ItLimit\n");
3363
3364 SCIPmessageFPrintInfo(scip->messagehdlr, file, " primal LP : %10.2f %10" SCIP_LONGINT_FORMAT " %10" SCIP_LONGINT_FORMAT " %10.2f",
3365 SCIPclockGetTime(scip->stat->primallptime),
3366 scip->stat->nprimallps + scip->stat->nprimalzeroitlps,
3367 scip->stat->nprimallpiterations,
3368 scip->stat->nprimallps > 0 ? (SCIP_Real)scip->stat->nprimallpiterations/(SCIP_Real)scip->stat->nprimallps : 0.0);
3369 if( SCIPclockGetTime(scip->stat->primallptime) >= 0.01 )
3370 SCIPmessageFPrintInfo(scip->messagehdlr, file, " %10.2f", (SCIP_Real)scip->stat->nprimallpiterations/SCIPclockGetTime(scip->stat->primallptime));
3371 else
3372 SCIPmessageFPrintInfo(scip->messagehdlr, file, " -");
3373 SCIPmessageFPrintInfo(scip->messagehdlr, file, " %10.2f %10" SCIP_LONGINT_FORMAT "\n",
3374 scip->stat->primalzeroittime,
3375 scip->stat->nprimalzeroitlps);
3376
3377 SCIPmessageFPrintInfo(scip->messagehdlr, file, " dual LP : %10.2f %10" SCIP_LONGINT_FORMAT " %10" SCIP_LONGINT_FORMAT " %10.2f",
3378 SCIPclockGetTime(scip->stat->duallptime),
3379 scip->stat->nduallps + scip->stat->ndualzeroitlps,
3380 scip->stat->nduallpiterations,
3381 scip->stat->nduallps > 0 ? (SCIP_Real)scip->stat->nduallpiterations/(SCIP_Real)scip->stat->nduallps : 0.0);
3382 if( SCIPclockGetTime(scip->stat->duallptime) >= 0.01 )
3383 SCIPmessageFPrintInfo(scip->messagehdlr, file, " %10.2f", (SCIP_Real)scip->stat->nduallpiterations/SCIPclockGetTime(scip->stat->duallptime));
3384 else
3385 SCIPmessageFPrintInfo(scip->messagehdlr, file, " -");
3386 SCIPmessageFPrintInfo(scip->messagehdlr, file, " %10.2f %10" SCIP_LONGINT_FORMAT "\n",
3387 scip->stat->dualzeroittime,
3388 scip->stat->ndualzeroitlps);
3389
3390 SCIPmessageFPrintInfo(scip->messagehdlr, file, " lex dual LP : %10.2f %10" SCIP_LONGINT_FORMAT " %10" SCIP_LONGINT_FORMAT " %10.2f",
3391 SCIPclockGetTime(scip->stat->lexduallptime),
3392 scip->stat->nlexduallps,
3393 scip->stat->nlexduallpiterations,
3394 scip->stat->nlexduallps > 0 ? (SCIP_Real)scip->stat->nlexduallpiterations/(SCIP_Real)scip->stat->nlexduallps : 0.0);
3395 if( SCIPclockGetTime(scip->stat->lexduallptime) >= 0.01 )
3396 SCIPmessageFPrintInfo(scip->messagehdlr, file, " %10.2f\n", (SCIP_Real)scip->stat->nlexduallpiterations/SCIPclockGetTime(scip->stat->lexduallptime));
3397 else
3398 SCIPmessageFPrintInfo(scip->messagehdlr, file, " -\n");
3399
3400 SCIPmessageFPrintInfo(scip->messagehdlr, file, " barrier LP : %10.2f %10" SCIP_LONGINT_FORMAT " %10" SCIP_LONGINT_FORMAT " %10.2f",
3401 SCIPclockGetTime(scip->stat->barrierlptime),
3402 scip->stat->nbarrierlps,
3403 scip->stat->nbarrierlpiterations,
3404 scip->stat->nbarrierlps > 0 ? (SCIP_Real)scip->stat->nbarrierlpiterations/(SCIP_Real)scip->stat->nbarrierlps : 0.0);
3405 if( SCIPclockGetTime(scip->stat->barrierlptime) >= 0.01 )
3406 SCIPmessageFPrintInfo(scip->messagehdlr, file, " %10.2f", (SCIP_Real)scip->stat->nbarrierlpiterations/SCIPclockGetTime(scip->stat->barrierlptime));
3407 else
3408 SCIPmessageFPrintInfo(scip->messagehdlr, file, " -");
3409 SCIPmessageFPrintInfo(scip->messagehdlr, file, " %10.2f %10" SCIP_LONGINT_FORMAT "\n",
3410 scip->stat->barrierzeroittime,
3411 scip->stat->nbarrierzeroitlps);
3412
3413 SCIPmessageFPrintInfo(scip->messagehdlr, file, " resolve instable : %10.2f %10" SCIP_LONGINT_FORMAT " %10" SCIP_LONGINT_FORMAT " %10.2f",
3414 SCIPclockGetTime(scip->stat->resolveinstablelptime),
3415 scip->stat->nresolveinstablelps,
3416 scip->stat->nresolveinstablelpiters,
3417 scip->stat->nresolveinstablelps > 0 ? (SCIP_Real)scip->stat->nresolveinstablelpiters/(SCIP_Real)scip->stat->nresolveinstablelps : 0.0);
3418 if( SCIPclockGetTime(scip->stat->resolveinstablelptime) >= 0.01 )
3419 SCIPmessageFPrintInfo(scip->messagehdlr, file, " %10.2f\n", (SCIP_Real)scip->stat->nresolveinstablelpiters/SCIPclockGetTime(scip->stat->resolveinstablelptime));
3420 else
3421 SCIPmessageFPrintInfo(scip->messagehdlr, file, " -\n");
3422
3423 SCIPmessageFPrintInfo(scip->messagehdlr, file, " diving/probing LP: %10.2f %10" SCIP_LONGINT_FORMAT " %10" SCIP_LONGINT_FORMAT " %10.2f",
3424 SCIPclockGetTime(scip->stat->divinglptime),
3425 scip->stat->ndivinglps,
3426 scip->stat->ndivinglpiterations,
3427 scip->stat->ndivinglps > 0 ? (SCIP_Real)scip->stat->ndivinglpiterations/(SCIP_Real)scip->stat->ndivinglps : 0.0);
3428 if( SCIPclockGetTime(scip->stat->divinglptime) >= 0.01 )
3429 SCIPmessageFPrintInfo(scip->messagehdlr, file, " %10.2f\n", (SCIP_Real)scip->stat->ndivinglpiterations/SCIPclockGetTime(scip->stat->divinglptime));
3430 else
3431 SCIPmessageFPrintInfo(scip->messagehdlr, file, " -\n");
3432
3433 SCIPmessageFPrintInfo(scip->messagehdlr, file, " strong branching : %10.2f %10" SCIP_LONGINT_FORMAT " %10" SCIP_LONGINT_FORMAT " %10.2f",
3434 SCIPclockGetTime(scip->stat->strongbranchtime),
3435 scip->stat->nstrongbranchs,
3436 scip->stat->nsblpiterations,
3437 scip->stat->nstrongbranchs > 0 ? (SCIP_Real)scip->stat->nsblpiterations/(SCIP_Real)scip->stat->nstrongbranchs : 0.0);
3438 if( SCIPclockGetTime(scip->stat->strongbranchtime) >= 0.01 )
3439 SCIPmessageFPrintInfo(scip->messagehdlr, file, " %10.2f", (SCIP_Real)scip->stat->nsblpiterations/SCIPclockGetTime(scip->stat->strongbranchtime));
3440 else
3441 SCIPmessageFPrintInfo(scip->messagehdlr, file, " -");
3442 SCIPmessageFPrintInfo(scip->messagehdlr, file, " - - %10" SCIP_LONGINT_FORMAT "\n", scip->stat->nsbtimesiterlimhit);
3443
3444 SCIPmessageFPrintInfo(scip->messagehdlr, file, " (at root node) : - %10" SCIP_LONGINT_FORMAT " %10" SCIP_LONGINT_FORMAT " %10.2f -\n",
3445 scip->stat->nrootstrongbranchs,
3446 scip->stat->nrootsblpiterations,
3447 scip->stat->nrootstrongbranchs > 0
3448 ? (SCIP_Real)scip->stat->nrootsblpiterations/(SCIP_Real)scip->stat->nrootstrongbranchs : 0.0);
3449
3450 SCIPmessageFPrintInfo(scip->messagehdlr, file, " conflict analysis: %10.2f %10" SCIP_LONGINT_FORMAT " %10" SCIP_LONGINT_FORMAT " %10.2f",
3451 SCIPclockGetTime(scip->stat->conflictlptime),
3452 scip->stat->nconflictlps,
3453 scip->stat->nconflictlpiterations,
3454 scip->stat->nconflictlps > 0 ? (SCIP_Real)scip->stat->nconflictlpiterations/(SCIP_Real)scip->stat->nconflictlps : 0.0);
3455 if( SCIPclockGetTime(scip->stat->conflictlptime) >= 0.01 )
3456 SCIPmessageFPrintInfo(scip->messagehdlr, file, " %10.2f\n", (SCIP_Real)scip->stat->nconflictlpiterations/SCIPclockGetTime(scip->stat->conflictlptime));
3457 else
3458 SCIPmessageFPrintInfo(scip->messagehdlr, file, " -\n");
3459}
3460
3461/** outputs NLP statistics
3462 *
3463 * @pre This method can be called if SCIP is in one of the following stages:
3464 * - \ref SCIP_STAGE_SOLVING
3465 * - \ref SCIP_STAGE_SOLVED
3466 */
3468 SCIP* scip, /**< SCIP data structure */
3469 FILE* file /**< output file */
3470 )
3471{
3472 int nnlrowlinear;
3473 int nnlrowconvexineq;
3474 int nnlrownonconvexineq;
3475 int nnlrownonlineareq;
3476
3477 assert(scip != NULL);
3478 assert(scip->stat != NULL);
3479
3481
3482 if( scip->nlp == NULL )
3483 return;
3484
3485 SCIPmessageFPrintInfo(scip->messagehdlr, file, "NLP relaxation :\n");
3486
3487 SCIPmessageFPrintInfo(scip->messagehdlr, file, " solve time : %10.2f (%" SCIP_LONGINT_FORMAT " calls)\n",
3488 SCIPclockGetTime(scip->stat->nlpsoltime),
3489 scip->stat->nnlps);
3490
3491 SCIP_CALL_ABORT( SCIPgetNLPNlRowsStat(scip, &nnlrowlinear, &nnlrowconvexineq, &nnlrownonconvexineq, &nnlrownonlineareq) );
3492 SCIPmessageFPrintInfo(scip->messagehdlr, file, " convexity : %10s (%d linear rows, %d convex ineq., %d nonconvex ineq., %d nonlinear eq. or two-sided ineq.)\n",
3493 (nnlrownonconvexineq == 0 && nnlrownonlineareq == 0) ? "convex" : "nonconvex",
3494 nnlrowlinear, nnlrowconvexineq, nnlrownonconvexineq, nnlrownonlineareq);
3495}
3496
3497/** outputs relaxator statistics
3498 *
3499 * @pre This method can be called if SCIP is in one of the following stages:
3500 * - \ref SCIP_STAGE_SOLVING
3501 * - \ref SCIP_STAGE_SOLVED
3502 */
3504 SCIP* scip, /**< SCIP data structure */
3505 FILE* file /**< output file */
3506 )
3507{
3508 int i;
3509
3510 assert(scip != NULL);
3511 assert(scip->set != NULL);
3512
3513 SCIP_CALL_ABORT( SCIPcheckStage(scip, "SCIPprintRelaxatorStatistics", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, TRUE, FALSE, FALSE, FALSE) );
3514
3515 if( scip->set->nrelaxs == 0 )
3516 return;
3517
3518 SCIPmessageFPrintInfo(scip->messagehdlr, file, "Relaxators : Time Calls Cutoffs ImprBounds ImprTime ReducedDom Separated AddedConss\n");
3519
3520 /* sort relaxators w.r.t. their name */
3522
3523 for( i = 0; i < scip->set->nrelaxs; ++i )
3524 {
3525 SCIPmessageFPrintInfo(scip->messagehdlr, file, " %-17.17s: %10.2f %10" SCIP_LONGINT_FORMAT " %10" SCIP_LONGINT_FORMAT " %10" SCIP_LONGINT_FORMAT " %10.2f %10" SCIP_LONGINT_FORMAT " %10" SCIP_LONGINT_FORMAT " %10" SCIP_LONGINT_FORMAT "\n",
3526 SCIPrelaxGetName(scip->set->relaxs[i]),
3527 SCIPrelaxGetTime(scip->set->relaxs[i]),
3528 SCIPrelaxGetNCalls(scip->set->relaxs[i]),
3529 SCIPrelaxGetNCutoffs(scip->set->relaxs[i]),
3530 SCIPrelaxGetNImprovedLowerbound(scip->set->relaxs[i]),
3532 SCIPrelaxGetNReducedDomains(scip->set->relaxs[i]),
3533 SCIPrelaxGetNSeparatedCuts(scip->set->relaxs[i]),
3534 SCIPrelaxGetNAddedConss(scip->set->relaxs[i])
3535 );
3536 }
3537}
3538
3539/** outputs tree statistics
3540 *
3541 * @pre This method can be called if SCIP is in one of the following stages:
3542 * - \ref SCIP_STAGE_SOLVING
3543 * - \ref SCIP_STAGE_SOLVED
3544 */
3546 SCIP* scip, /**< SCIP data structure */
3547 FILE* file /**< output file */
3548 )
3549{
3550 assert(scip != NULL);
3551 assert(scip->stat != NULL);
3552 assert(scip->tree != NULL);
3553
3554 SCIP_CALL_ABORT( SCIPcheckStage(scip, "SCIPprintTreeStatistics", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, TRUE, FALSE, FALSE, FALSE) );
3555
3556 SCIPmessageFPrintInfo(scip->messagehdlr, file, "B&B Tree :\n");
3557 SCIPmessageFPrintInfo(scip->messagehdlr, file, " number of runs : %10d\n", scip->stat->nruns);
3558 SCIPmessageFPrintInfo(scip->messagehdlr, file,
3559 " nodes : %10" SCIP_LONGINT_FORMAT " (%" SCIP_LONGINT_FORMAT " internal, %" SCIP_LONGINT_FORMAT " leaves)\n",
3560 scip->stat->nnodes, scip->stat->ninternalnodes, scip->stat->nnodes - scip->stat->ninternalnodes );
3561 SCIPmessageFPrintInfo(scip->messagehdlr, file, " feasible leaves : %10" SCIP_LONGINT_FORMAT "\n", scip->stat->nfeasleaves);
3562 SCIPmessageFPrintInfo(scip->messagehdlr, file, " infeas. leaves : %10" SCIP_LONGINT_FORMAT "\n", scip->stat->ninfeasleaves);
3563 SCIPmessageFPrintInfo(scip->messagehdlr, file, " objective leaves : %10" SCIP_LONGINT_FORMAT "\n", scip->stat->nobjleaves);
3564 SCIPmessageFPrintInfo(scip->messagehdlr, file,
3565 " nodes (total) : %10" SCIP_LONGINT_FORMAT " (%" SCIP_LONGINT_FORMAT " internal, %" SCIP_LONGINT_FORMAT " leaves)\n",
3566 scip->stat->ntotalnodes, scip->stat->ntotalinternalnodes, scip->stat->ntotalnodes - scip->stat->ntotalinternalnodes);
3567 SCIPmessageFPrintInfo(scip->messagehdlr, file, " nodes left : %10d\n", SCIPtreeGetNNodes(scip->tree));
3568 SCIPmessageFPrintInfo(scip->messagehdlr, file, " max depth : %10d\n", scip->stat->maxdepth);
3569 SCIPmessageFPrintInfo(scip->messagehdlr, file, " max depth (total): %10d\n", scip->stat->maxtotaldepth);
3570 SCIPmessageFPrintInfo(scip->messagehdlr, file, " backtracks : %10" SCIP_LONGINT_FORMAT " (%.1f%%)\n", scip->stat->nbacktracks,
3571 scip->stat->nnodes > 0 ? 100.0 * (SCIP_Real)scip->stat->nbacktracks / (SCIP_Real)scip->stat->nnodes : 0.0);
3572 SCIPmessageFPrintInfo(scip->messagehdlr, file, " early backtracks : %10" SCIP_LONGINT_FORMAT " (%.1f%%)\n", scip->stat->nearlybacktracks,
3573 scip->stat->nbacktracks > 0 ? 100.0 * (SCIP_Real)scip->stat->nearlybacktracks / (SCIP_Real)scip->stat->nbacktracks : 0.0);
3574 SCIPmessageFPrintInfo(scip->messagehdlr, file, " nodes exc. ref. : %10" SCIP_LONGINT_FORMAT " (%.1f%%)\n", scip->stat->nnodesaboverefbound,
3575 scip->stat->nnodes > 0 ? 100.0 * (SCIP_Real)scip->stat->nnodesaboverefbound / (SCIP_Real)scip->stat->nnodes : 0.0);
3576
3577 SCIPmessageFPrintInfo(scip->messagehdlr, file, " delayed cutoffs : %10" SCIP_LONGINT_FORMAT "\n", scip->stat->ndelayedcutoffs);
3578 SCIPmessageFPrintInfo(scip->messagehdlr, file, " repropagations : %10" SCIP_LONGINT_FORMAT " (%" SCIP_LONGINT_FORMAT " domain reductions, %" SCIP_LONGINT_FORMAT " cutoffs)\n",
3579 scip->stat->nreprops, scip->stat->nrepropboundchgs, scip->stat->nrepropcutoffs);
3580 SCIPmessageFPrintInfo(scip->messagehdlr, file, " avg switch length: %10.2f\n",
3581 scip->stat->nnodes > 0
3582 ? (SCIP_Real)(scip->stat->nactivatednodes + scip->stat->ndeactivatednodes) / (SCIP_Real)scip->stat->nnodes : 0.0);
3583 SCIPmessageFPrintInfo(scip->messagehdlr, file, " switching time : %10.2f\n", SCIPclockGetTime(scip->stat->nodeactivationtime));
3584}
3585
3586/** outputs solution statistics
3587 *
3588 * @pre This method can be called if SCIP is in one of the following stages:
3589 * - \ref SCIP_STAGE_PRESOLVING
3590 * - \ref SCIP_STAGE_EXITPRESOLVE
3591 * - \ref SCIP_STAGE_PRESOLVED
3592 * - \ref SCIP_STAGE_SOLVING
3593 * - \ref SCIP_STAGE_SOLVED
3594 */
3596 SCIP* scip, /**< SCIP data structure */
3597 FILE* file /**< output file */
3598 )
3599{
3600 SCIP_Real primalbound;
3601 SCIP_Real dualbound;
3602 SCIP_Real gap;
3603 SCIP_Real firstprimalbound;
3604 SCIP_Bool objlimitreached;
3605 char limsolstring[SCIP_MAXSTRLEN];
3606
3607 assert(scip != NULL);
3608 assert(scip->stat != NULL);
3609 assert(scip->primal != NULL);
3610
3611 SCIP_CALL_ABORT( SCIPcheckStage(scip, "SCIPprintSolutionStatistics", FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, TRUE, TRUE, FALSE, TRUE, TRUE, FALSE, FALSE, FALSE) );
3612
3613 primalbound = SCIPgetPrimalbound(scip);
3614 dualbound = SCIPgetDualbound(scip);
3615 gap = SCIPgetGap(scip);
3616
3617 /* We output that the objective limit has been reached if the problem has been solved, no solution respecting the
3618 * objective limit has been found (nlimsolsfound == 0) and the primal bound is finite. Note that it still might be
3619 * that the original problem is infeasible, even without the objective limit, i.e., we cannot be sure that we
3620 * actually reached the objective limit. */
3621 objlimitreached = FALSE;
3622 if( SCIPgetStage(scip) == SCIP_STAGE_SOLVED && scip->primal->nlimsolsfound == 0
3624 objlimitreached = TRUE;
3625
3626 if( scip->primal->nsolsfound != scip->primal->nlimsolsfound )
3627 (void) SCIPsnprintf(limsolstring, SCIP_MAXSTRLEN, ", %" SCIP_LONGINT_FORMAT " respecting the objective limit", scip->primal->nlimsolsfound);
3628 else
3629 limsolstring[0] = '\0';
3630
3631 SCIPmessageFPrintInfo(scip->messagehdlr, file, "Solution :\n");
3632 SCIPmessageFPrintInfo(scip->messagehdlr, file, " Solutions found : %10" SCIP_LONGINT_FORMAT " (%" SCIP_LONGINT_FORMAT " improvements%s)\n",
3633 scip->primal->nsolsfound, scip->primal->nbestsolsfound, limsolstring);
3634
3635 if( SCIPsetIsInfinity(scip->set, REALABS(primalbound)) )
3636 {
3637 if( scip->set->stage == SCIP_STAGE_SOLVED )
3638 {
3639 if( scip->primal->nlimsolsfound == 0 )
3640 {
3642 {
3643 assert(!objlimitreached);
3644 SCIPmessageFPrintInfo(scip->messagehdlr, file, " Primal Bound : infeasible or unbounded\n");
3645 }
3646 else
3647 {
3649 if( objlimitreached )
3650 SCIPmessageFPrintInfo(scip->messagehdlr, file, " Primal Bound : infeasible (objective limit reached)\n");
3651 else
3652 SCIPmessageFPrintInfo(scip->messagehdlr, file, " Primal Bound : infeasible\n");
3653 }
3654 }
3655 else
3656 {
3657 assert(!objlimitreached);
3659 SCIPmessageFPrintInfo(scip->messagehdlr, file, " Primal Bound : unbounded\n");
3660 }
3661 }
3662 else
3663 SCIPmessageFPrintInfo(scip->messagehdlr, file, " Primal Bound : -\n");
3664 }
3665 else
3666 {
3667 if( scip->primal->nlimsolsfound == 0 )
3668 {
3669 SCIPmessageFPrintInfo(scip->messagehdlr, file, " Primal Bound : %+21.14e (objective limit)\n", primalbound);
3670
3671 /* display (best) primal bound */
3672 if( scip->primal->nsolsfound > 0 )
3673 {
3674 SCIP_Real bestsol;
3675 bestsol = SCIPsolGetObj(scip->primal->sols[0], scip->set, scip->transprob, scip->origprob);
3676 bestsol = SCIPretransformObj(scip, bestsol);
3677
3678 SCIPmessageFPrintInfo(scip->messagehdlr, file, " Best Solution : %+21.14e\n", bestsol);
3679 }
3680 }
3681 else
3682 {
3683 /* display first primal bound line */
3684 firstprimalbound = scip->stat->firstprimalbound;
3685 SCIPmessageFPrintInfo(scip->messagehdlr, file, " First Solution : %+21.14e", firstprimalbound);
3686
3687 SCIPmessageFPrintInfo(scip->messagehdlr, file, " (in run %d, after %" SCIP_LONGINT_FORMAT " nodes, %.2f seconds, depth %d, found by <%s>)\n",
3688 scip->stat->nrunsbeforefirst,
3689 scip->stat->nnodesbeforefirst,
3690 scip->stat->firstprimaltime,
3691 scip->stat->firstprimaldepth,
3692 ( scip->stat->firstprimalheur != NULL )
3693 ? ( SCIPheurGetName(scip->stat->firstprimalheur) )
3694 : (( scip->stat->nrunsbeforefirst == 0 ) ? "initial" : "relaxation"));
3695
3696 if( SCIPisInfinity(scip, scip->stat->firstsolgap) )
3697 SCIPmessageFPrintInfo(scip->messagehdlr, file, " Gap First Sol. : infinite\n");
3698 else
3699 SCIPmessageFPrintInfo(scip->messagehdlr, file, " Gap First Sol. : %10.2f %%\n", 100.0 * scip->stat->firstsolgap);
3700
3701 if( SCIPisInfinity(scip, scip->stat->lastsolgap) )
3702 SCIPmessageFPrintInfo(scip->messagehdlr, file, " Gap Last Sol. : infinite\n");
3703 else
3704 SCIPmessageFPrintInfo(scip->messagehdlr, file, " Gap Last Sol. : %10.2f %%\n", 100.0 * scip->stat->lastsolgap);
3705
3706 SCIPmessageFPrintInfo(scip->messagehdlr, file, " Primal Bound : %+21.14e", primalbound);
3707
3708 SCIPmessageFPrintInfo(scip->messagehdlr, file, " (in run %d, after %" SCIP_LONGINT_FORMAT " nodes, %.2f seconds, depth %d, found by <%s>)\n",
3709 SCIPsolGetRunnum(scip->primal->sols[0]),
3710 SCIPsolGetNodenum(scip->primal->sols[0]),
3711 SCIPsolGetTime(scip->primal->sols[0]),
3712 SCIPsolGetDepth(scip->primal->sols[0]),
3713 SCIPsolGetHeur(scip->primal->sols[0]) != NULL
3714 ? SCIPheurGetName(SCIPsolGetHeur(scip->primal->sols[0]))
3715 : (SCIPsolGetRunnum(scip->primal->sols[0]) == 0 ? "initial" : "relaxation"));
3716 }
3717 }
3718
3719 if( SCIPsetIsInfinity(scip->set, REALABS(dualbound)) )
3720 SCIPmessageFPrintInfo(scip->messagehdlr, file, " Dual Bound : -\n");
3721 else
3722 SCIPmessageFPrintInfo(scip->messagehdlr, file, " Dual Bound : %+21.14e\n", dualbound);
3723
3724 if( SCIPsetIsInfinity(scip->set, gap) )
3725 SCIPmessageFPrintInfo(scip->messagehdlr, file, " Gap : infinite\n");
3726 else
3727 SCIPmessageFPrintInfo(scip->messagehdlr, file, " Gap : %10.2f %%\n", 100.0 * gap);
3728
3729 if( scip->set->misc_calcintegral )
3730 {
3731 int s;
3732 const char* names[] = {
3733 "primal-dual",
3734 "primal-ref",
3735 "dual-ref"
3736 };
3737 SCIPmessageFPrintInfo(scip->messagehdlr, file, "Integrals : Total Avg%%\n");
3738 if( SCIPgetStatus(scip) == SCIP_STATUS_INFEASIBLE && ! objlimitreached )
3739 {
3740 for( s = 0; s < 3; ++s )
3741 {
3742 SCIPmessageFPrintInfo(scip->messagehdlr, file, " %-17s: %10s %10s (problem infeasible)\n",
3743 names[s], "-", "-");
3744 }
3745 }
3746 else
3747 {
3748 SCIP_Real integrals[3];
3749 SCIP_Real solvingtime = SCIPgetSolvingTime(scip);
3750
3751 if( !SCIPisFeasZero(scip, solvingtime) )
3752 {
3753 integrals[0] = SCIPstatGetPrimalDualIntegral(scip->stat, scip->set, scip->transprob, scip->origprob, TRUE);
3754
3755 if( scip->set->misc_referencevalue != SCIP_INVALID ) /*lint !e777*/
3756 {
3757 integrals[1] = SCIPstatGetPrimalReferenceIntegral(scip->stat, scip->set, scip->transprob, scip->origprob, FALSE);
3758 integrals[2] = SCIPstatGetDualReferenceIntegral(scip->stat, scip->set, scip->transprob, scip->origprob, FALSE);
3759 }
3760 else
3761 integrals[1] = integrals[2] = SCIP_INVALID;
3762 }
3763 else
3764 {
3765 BMSclearMemoryArray(integrals, 3);
3766 }
3767
3768 /* print integrals, if computed */
3769 for( s = 0; s < 3; ++s )
3770 {
3771 if( integrals[s] == SCIP_INVALID ) /*lint !e777*/
3772 SCIPmessageFPrintInfo(scip->messagehdlr, file, " %-17s: - - (not evaluated)\n", names[s]);
3773 else
3774 {
3775 SCIP_Real avg = integrals[s] / MAX(solvingtime,1e-6);
3776
3777 /* caution: this assert is non-deterministic since it depends on the solving time */
3778 assert(0.0 <= avg && SCIPisLE(scip, avg, 100.0));
3779 SCIPmessageFPrintInfo(scip->messagehdlr, file, " %-17s: %10.2f %10.2f\n", names[s], integrals[s], avg);
3780 }
3781 }
3782 }
3783 }
3784}
3785
3786/** outputs concurrent solver statistics
3787 *
3788 * @pre This method can be called if SCIP is in one of the following stages:
3789 * - \ref SCIP_STAGE_TRANSFORMED
3790 * - \ref SCIP_STAGE_INITPRESOLVE
3791 * - \ref SCIP_STAGE_PRESOLVING
3792 * - \ref SCIP_STAGE_EXITPRESOLVE
3793 * - \ref SCIP_STAGE_PRESOLVED
3794 * - \ref SCIP_STAGE_SOLVING
3795 * - \ref SCIP_STAGE_SOLVED
3796 */
3798 SCIP* scip, /**< SCIP data structure */
3799 FILE* file /**< output file */
3800 )
3801{
3802 SCIP_CONCSOLVER** concsolvers;
3803 int nconcsolvers;
3804 int i;
3805 int winner;
3806
3807 assert(scip != NULL);
3808 assert(scip->set != NULL);
3809
3810 SCIP_CALL_ABORT( SCIPcheckStage(scip, "SCIPprintConcsolverStatistics", FALSE, FALSE, FALSE, TRUE, TRUE, TRUE, TRUE, TRUE, FALSE, TRUE, TRUE, FALSE, FALSE, FALSE) );
3811
3812 if( !SCIPsyncstoreIsInitialized(scip->syncstore) )
3813 return;
3814
3815 nconcsolvers = SCIPgetNConcurrentSolvers(scip);
3816 concsolvers = SCIPgetConcurrentSolvers(scip);
3817 winner = SCIPsyncstoreGetWinner(scip->syncstore);
3818
3819 if( nconcsolvers > 0 )
3820 {
3821 SCIPmessageFPrintInfo(scip->messagehdlr, file, "Concurrent Solvers : SolvingTime SyncTime Nodes LP Iters SolsShared SolsRecvd TighterBnds TighterIntBnds\n");
3822 for( i = 0; i < nconcsolvers; ++i )
3823 {
3824 SCIPmessageFPrintInfo(scip->messagehdlr, file, " %c%-16s: %11.2f %11.2f %11" SCIP_LONGINT_FORMAT " %11" SCIP_LONGINT_FORMAT "%11" SCIP_LONGINT_FORMAT " %11" SCIP_LONGINT_FORMAT " %11" SCIP_LONGINT_FORMAT " %14" SCIP_LONGINT_FORMAT "\n",
3825 winner == i ? '*' : ' ',
3826 SCIPconcsolverGetName(concsolvers[i]),
3827 SCIPconcsolverGetSolvingTime(concsolvers[i]),
3828 SCIPconcsolverGetSyncTime(concsolvers[i]),
3829 SCIPconcsolverGetNNodes(concsolvers[i]),
3830 SCIPconcsolverGetNLPIterations(concsolvers[i]),
3831 SCIPconcsolverGetNSolsShared(concsolvers[i]),
3832 SCIPconcsolverGetNSolsRecvd(concsolvers[i]),
3833 SCIPconcsolverGetNTighterBnds(concsolvers[i]),
3834 SCIPconcsolverGetNTighterIntBnds(concsolvers[i])
3835 );
3836 }
3837 }
3838}
3839
3840/** display Benders' decomposition statistics */
3842 SCIP* scip, /**< SCIP data structure */
3843 FILE* file /**< output file */
3844 )
3845{
3846 SCIP_BENDERS** benders;
3847 int nbenders;
3848 int i;
3849
3850 assert(scip != NULL);
3851 assert(scip->set != NULL);
3852
3853 SCIP_CALL_ABORT( SCIPcheckStage(scip, "SCIPprintBendersStatistics", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, TRUE, FALSE, FALSE, FALSE) );
3854
3855 if( SCIPgetNActiveBenders(scip) == 0 )
3856 return;
3857
3858 nbenders = SCIPgetNBenders(scip);
3859 benders = SCIPgetBenders(scip);
3860
3861 SCIPmessageFPrintInfo(scip->messagehdlr, file, "Benders Decomp : ExecTime SetupTime Calls Found Transfer StrCalls StrFails StrCuts\n");
3862 for( i = 0; i < nbenders; ++i )
3863 {
3864 if( SCIPbendersIsActive(benders[i]) )
3865 {
3866 SCIP_BENDERSCUT** benderscuts;
3867 int nbenderscuts;
3868 int j;
3869
3870 SCIPmessageFPrintInfo(scip->messagehdlr, file, " %-17.17s: %10.2f %10.2f %10d %10d %10d %10d %10d %10d\n",
3871 SCIPbendersGetName(scip->set->benders[i]),
3872 SCIPbendersGetTime(scip->set->benders[i]),
3873 SCIPbendersGetSetupTime(scip->set->benders[i]),
3874 SCIPbendersGetNCalls(scip->set->benders[i]),
3875 SCIPbendersGetNCutsFound(scip->set->benders[i]),
3876 SCIPbendersGetNTransferredCuts(scip->set->benders[i]),
3877 SCIPbendersGetNStrengthenCalls(scip->set->benders[i]),
3878 SCIPbendersGetNStrengthenFails(scip->set->benders[i]),
3879 SCIPbendersGetNStrengthenCutsFound(scip->set->benders[i]));
3880
3881 nbenderscuts = SCIPbendersGetNBenderscuts(scip->set->benders[i]);
3882 benderscuts = SCIPbendersGetBenderscuts(scip->set->benders[i]);
3883
3884 for( j = 0; j < nbenderscuts; j++ )
3885 {
3886 SCIPmessageFPrintInfo(scip->messagehdlr, file, " %-15.17s: %10.2f %10.2f %10" SCIP_LONGINT_FORMAT " %10" SCIP_LONGINT_FORMAT " -\n",
3887 SCIPbenderscutGetName(benderscuts[j]),
3888 SCIPbenderscutGetTime(benderscuts[j]),
3889 SCIPbenderscutGetSetupTime(benderscuts[j]),
3890 SCIPbenderscutGetNCalls(benderscuts[j]),
3891 SCIPbenderscutGetNFound(benderscuts[j]));
3892 }
3893 }
3894 }
3895}
3896
3897/** outputs root statistics
3898 *
3899 * @pre This method can be called if SCIP is in one of the following stages:
3900 * - \ref SCIP_STAGE_SOLVING
3901 * - \ref SCIP_STAGE_SOLVED
3902 */
3904 SCIP* scip, /**< SCIP data structure */
3905 FILE* file /**< output file */
3906 )
3907{
3908 SCIP_Real dualboundroot;
3909 SCIP_Real firstdualboundroot;
3910 SCIP_Real firstlptime;
3911 SCIP_Real firstlpspeed;
3912
3913 assert(scip != NULL);
3914 assert(scip->stat != NULL);
3915 assert(scip->primal != NULL);
3916
3917 SCIP_CALL_ABORT( SCIPcheckStage(scip, "SCIPprintRootStatistics", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, TRUE, FALSE, FALSE, FALSE) );
3918
3919 dualboundroot = SCIPgetDualboundRoot(scip);
3920 firstdualboundroot = SCIPgetFirstLPDualboundRoot(scip);
3921 firstlptime = SCIPgetFirstLPTime(scip);
3922
3923 if( firstlptime > 0.0 )
3924 firstlpspeed = (SCIP_Real)scip->stat->nrootfirstlpiterations/firstlptime;
3925 else
3926 firstlpspeed = 0.0;
3927
3928 SCIPmessageFPrintInfo(scip->messagehdlr, file, "Root Node :\n");
3929 if( SCIPsetIsInfinity(scip->set, REALABS(firstdualboundroot)) )
3930 SCIPmessageFPrintInfo(scip->messagehdlr, file, " First LP value : -\n");
3931 else
3932 SCIPmessageFPrintInfo(scip->messagehdlr, file, " First LP value : %+21.14e\n", firstdualboundroot);
3933 if( firstlpspeed > 0.0 )
3934 SCIPmessageFPrintInfo(scip->messagehdlr, file, " First LP Iters : %10" SCIP_LONGINT_FORMAT " (%.2f Iter/sec)\n",
3935 scip->stat->nrootfirstlpiterations,
3936 (SCIP_Real)scip->stat->nrootfirstlpiterations/firstlptime);
3937 else
3938 SCIPmessageFPrintInfo(scip->messagehdlr, file, " First LP Iters : %10" SCIP_LONGINT_FORMAT "\n", scip->stat->nrootfirstlpiterations);
3939 SCIPmessageFPrintInfo(scip->messagehdlr, file, " First LP Time : %10.2f\n", firstlptime);
3940
3941 if( SCIPsetIsInfinity(scip->set, REALABS(dualboundroot)) )
3942 SCIPmessageFPrintInfo(scip->messagehdlr, file, " Final Dual Bound : -\n");
3943 else
3944 SCIPmessageFPrintInfo(scip->messagehdlr, file, " Final Dual Bound : %+21.14e\n", dualboundroot);
3945 SCIPmessageFPrintInfo(scip->messagehdlr, file, " Final Root Iters : %10" SCIP_LONGINT_FORMAT "\n", scip->stat->nrootlpiterations);
3946
3947 SCIPmessageFPrintInfo(scip->messagehdlr, file, " Root LP Estimate : ");
3948 if( scip->stat->rootlpbestestimate != SCIP_INVALID ) /*lint !e777*/
3949 {
3950 SCIPmessageFPrintInfo(scip->messagehdlr, file, "%+21.14e\n", SCIPretransformObj(scip, scip->stat->rootlpbestestimate));
3951 }
3952 else
3953 SCIPmessageFPrintInfo(scip->messagehdlr, file, "%21s\n","-");
3954}
3955
3956/** outputs timing statistics
3957 *
3958 * @pre This method can be called if SCIP is in one of the following stages:
3959 * - \ref SCIP_STAGE_PROBLEM
3960 * - \ref SCIP_STAGE_TRANSFORMED
3961 * - \ref SCIP_STAGE_INITPRESOLVE
3962 * - \ref SCIP_STAGE_PRESOLVING
3963 * - \ref SCIP_STAGE_EXITPRESOLVE
3964 * - \ref SCIP_STAGE_PRESOLVED
3965 * - \ref SCIP_STAGE_SOLVING
3966 * - \ref SCIP_STAGE_SOLVED
3967 */
3969 SCIP* scip, /**< SCIP data structure */
3970 FILE* file /**< output file */
3971 )
3972{
3973 SCIP_Real readingtime;
3974
3975 assert(scip != NULL);
3976 assert(scip->set != NULL);
3977
3978 SCIP_CALL_ABORT( SCIPcheckStage(scip, "SCIPprintTimingStatistics", FALSE, TRUE, FALSE, TRUE, TRUE, TRUE, TRUE, TRUE, FALSE, TRUE, TRUE, FALSE, FALSE, FALSE) );
3979
3980 readingtime = SCIPgetReadingTime(scip);
3981
3983 {
3984 SCIPmessageFPrintInfo(scip->messagehdlr, file, "Total Time : %10.2f\n", readingtime);
3985 SCIPmessageFPrintInfo(scip->messagehdlr, file, " reading : %10.2f\n", readingtime);
3986 }
3987 else
3988 {
3989 SCIP_Real totaltime;
3990 SCIP_Real solvingtime;
3991
3992 solvingtime = SCIPclockGetTime(scip->stat->solvingtime);
3993
3994 if( scip->set->time_reading )
3995 totaltime = solvingtime;
3996 else
3997 totaltime = solvingtime + readingtime;
3998
3999 SCIPmessageFPrintInfo(scip->messagehdlr, file, "Total Time : %10.2f\n", totaltime);
4000 SCIPmessageFPrintInfo(scip->messagehdlr, file, " solving : %10.2f\n", solvingtime);
4001 SCIPmessageFPrintInfo(scip->messagehdlr, file, " presolving : %10.2f (included in solving)\n", SCIPclockGetTime(scip->stat->presolvingtime));
4002 SCIPmessageFPrintInfo(scip->messagehdlr, file, " reading : %10.2f%s\n", readingtime, scip->set->time_reading ? " (included in solving)" : "");
4003
4004 if( scip->stat->ncopies > 0 )
4005 {
4006 SCIP_Real copytime;
4007
4008 copytime = SCIPclockGetTime(scip->stat->copyclock);
4009
4010 SCIPmessageFPrintInfo(scip->messagehdlr, file, " copying : %10.2f (%d #copies) (minimal %.2f, maximal %.2f, average %.2f)\n",
4011 copytime, scip->stat->ncopies, scip->stat->mincopytime, scip->stat->maxcopytime, copytime / scip->stat->ncopies);
4012 }
4013 else
4014 SCIPmessageFPrintInfo(scip->messagehdlr, file, " copying : %10.2f %s\n", 0.0, "(0 times copied the problem)");
4015 }
4016}
4017
4018/** outputs expression handler statistics
4019 *
4020 * @pre This method can be called if SCIP is in one of the following stages:
4021 * - \ref SCIP_STAGE_PROBLEM
4022 * - \ref SCIP_STAGE_TRANSFORMED
4023 * - \ref SCIP_STAGE_INITPRESOLVE
4024 * - \ref SCIP_STAGE_PRESOLVING
4025 * - \ref SCIP_STAGE_EXITPRESOLVE
4026 * - \ref SCIP_STAGE_PRESOLVED
4027 * - \ref SCIP_STAGE_SOLVING
4028 * - \ref SCIP_STAGE_SOLVED
4029 */
4031 SCIP* scip, /**< SCIP data structure */
4032 FILE* file /**< output file */
4033 )
4034{
4035 SCIP_Bool headerprinted = FALSE;
4036 int i;
4037
4038 assert(scip != NULL);
4039 assert(scip->set != NULL);
4040
4041 SCIP_CALL_ABORT( SCIPcheckStage(scip, "SCIPprintExpressionHandlerStatistics", FALSE, TRUE, FALSE, TRUE, TRUE, TRUE, TRUE, TRUE, FALSE, TRUE, TRUE, FALSE, FALSE, FALSE) );
4042
4043 for( i = 0; i < scip->set->nexprhdlrs; ++i )
4044 {
4045 SCIP_EXPRHDLR* exprhdlr = scip->set->exprhdlrs[i];
4046 assert(exprhdlr != NULL);
4047
4048 /* skip unused expression handler */
4049 if( SCIPexprhdlrGetNCreated(exprhdlr) == 0 )
4050 continue;
4051
4052 if( !headerprinted )
4053 {
4054 SCIPmessageFPrintInfo(scip->messagehdlr, file,
4055 "Expressions : %10s %10s %10s %10s %10s %10s %10s %10s %10s %10s %10s %10s\n",
4056 "#IntEval", "IntEvalTi", "#RevProp", "RevPropTi", "DomReds", "Cutoffs", "#Estimate", "EstimTime", "Branching", "#Simplify", "SimplifyTi", "Simplified");
4057 headerprinted = TRUE;
4058 }
4059
4060 SCIPmessageFPrintInfo(scip->messagehdlr, file, " %-17s:", SCIPexprhdlrGetName(exprhdlr));
4061 SCIPmessageFPrintInfo(scip->messagehdlr, file, " %10lld", SCIPexprhdlrGetNIntevalCalls(exprhdlr));
4062 SCIPmessageFPrintInfo(scip->messagehdlr, file, " %10.2f", SCIPexprhdlrGetIntevalTime(exprhdlr));
4063 SCIPmessageFPrintInfo(scip->messagehdlr, file, " %10lld", SCIPexprhdlrGetNReversepropCalls(exprhdlr));
4064 SCIPmessageFPrintInfo(scip->messagehdlr, file, " %10.2f", SCIPexprhdlrGetReversepropTime(exprhdlr));
4065 SCIPmessageFPrintInfo(scip->messagehdlr, file, " %10lld", SCIPexprhdlrGetNDomainReductions(exprhdlr));
4066 SCIPmessageFPrintInfo(scip->messagehdlr, file, " %10lld", SCIPexprhdlrGetNCutoffs(exprhdlr));
4067 SCIPmessageFPrintInfo(scip->messagehdlr, file, " %10lld", SCIPexprhdlrGetNEstimateCalls(exprhdlr));
4068 SCIPmessageFPrintInfo(scip->messagehdlr, file, " %10.2f", SCIPexprhdlrGetEstimateTime(exprhdlr));
4069 SCIPmessageFPrintInfo(scip->messagehdlr, file, " %10lld", SCIPexprhdlrGetNBranchings(exprhdlr));
4070 SCIPmessageFPrintInfo(scip->messagehdlr, file, " %10lld", SCIPexprhdlrGetNSimplifyCalls(exprhdlr));
4071 SCIPmessageFPrintInfo(scip->messagehdlr, file, " %10.2f", SCIPexprhdlrGetSimplifyTime(exprhdlr));
4072 SCIPmessageFPrintInfo(scip->messagehdlr, file, " %10lld", SCIPexprhdlrGetNSimplifications(exprhdlr));
4073 SCIPmessageFPrintInfo(scip->messagehdlr, file, "\n");
4074 }
4075}
4076
4077/** outputs NLPI statistics
4078 *
4079 * @pre This method can be called if SCIP is in one of the following stages:
4080 * - \ref SCIP_STAGE_PROBLEM
4081 * - \ref SCIP_STAGE_TRANSFORMED
4082 * - \ref SCIP_STAGE_INITPRESOLVE
4083 * - \ref SCIP_STAGE_PRESOLVING
4084 * - \ref SCIP_STAGE_EXITPRESOLVE
4085 * - \ref SCIP_STAGE_PRESOLVED
4086 * - \ref SCIP_STAGE_SOLVING
4087 * - \ref SCIP_STAGE_SOLVED
4088 */
4090 SCIP* scip, /**< SCIP data structure */
4091 FILE* file /**< output file */
4092 )
4093{
4094 SCIP_Bool printedheader = FALSE;
4095 int i;
4096
4097 assert(scip != NULL);
4098 assert(scip->set != NULL);
4099
4100 SCIP_CALL_ABORT( SCIPcheckStage(scip, "SCIPprintNLPIStatistics", FALSE, TRUE, FALSE, TRUE, TRUE, TRUE, TRUE, TRUE, FALSE, TRUE, TRUE, FALSE, FALSE, FALSE) );
4101
4102 for( i = 0; i < scip->set->nnlpis; ++i )
4103 {
4104 SCIP_Real solvetime;
4105 SCIP_Real evaltime = 0.0;
4106 SCIP_Longint niter;
4107 SCIP_NLPI* nlpi;
4108 int j;
4109
4110 nlpi = scip->set->nlpis[i];
4111 assert(nlpi != NULL);
4112
4113 /* skip unused NLP solver */
4114 if( SCIPnlpiGetNProblems(nlpi) == 0 )
4115 continue;
4116
4117 if( !printedheader )
4118 {
4119 SCIPmessageFPrintInfo(scip->messagehdlr, file,
4120 "NLP Solvers : %10s %10s %10s %10s %s%10s %10s"
4121 " %10s %10s %10s %10s %10s %10s %10s %10s %10s %10s"
4122 " %10s %10s %10s %10s %10s %10s %10s\n",
4123 "#Problems", "ProblemTi", "#Solves", "SolveTime",
4124 scip->set->time_nlpieval ? " EvalTime%" : "",
4125 "#Iter", "Time/Iter",
4126 "#Okay", "#TimeLimit", "#IterLimit", "#LObjLimit", "#Interrupt", "#NumError", "#EvalError", "#OutOfMem", "#LicenseEr", "#OtherTerm",
4127 "#GlobOpt", "#LocOpt", "#Feasible", "#LocInfeas", "#GlobInfea", "#Unbounded", "#Unknown"
4128 );
4129 printedheader = TRUE;
4130 }
4131
4132 solvetime = SCIPnlpiGetSolveTime(nlpi);
4133 if( scip->set->time_nlpieval )
4134 evaltime = SCIPnlpiGetEvalTime(nlpi);
4135 niter = SCIPnlpiGetNIterations(nlpi);
4136
4137 SCIPmessageFPrintInfo(scip->messagehdlr, file, " %-17s:", SCIPnlpiGetName(nlpi));
4138 SCIPmessageFPrintInfo(scip->messagehdlr, file, " %10d", SCIPnlpiGetNProblems(nlpi));
4139 SCIPmessageFPrintInfo(scip->messagehdlr, file, " %10.2f", SCIPnlpiGetProblemTime(nlpi));
4140 SCIPmessageFPrintInfo(scip->messagehdlr, file, " %10d", SCIPnlpiGetNSolves(nlpi));
4141 SCIPmessageFPrintInfo(scip->messagehdlr, file, " %10.2f", solvetime);
4142 if( scip->set->time_nlpieval )
4143 SCIPmessageFPrintInfo(scip->messagehdlr, file, " %10.2f", solvetime > 0.0 ? 100.0 * evaltime / solvetime : 0.0);
4144 SCIPmessageFPrintInfo(scip->messagehdlr, file, " %10" SCIP_LONGINT_FORMAT, niter);
4145 SCIPmessageFPrintInfo(scip->messagehdlr, file, " %10.2f", niter > 0 ? solvetime / niter : 0.0);
4146
4147 for( j = (int)SCIP_NLPTERMSTAT_OKAY; j <= (int)SCIP_NLPTERMSTAT_OTHER; ++j )
4148 SCIPmessageFPrintInfo(scip->messagehdlr, file, " %10d", SCIPnlpiGetNTermStat(nlpi, (SCIP_NLPTERMSTAT)j));
4149
4150 for( j = (int)SCIP_NLPSOLSTAT_GLOBOPT; j <= (int)SCIP_NLPSOLSTAT_UNKNOWN; ++j )
4151 SCIPmessageFPrintInfo(scip->messagehdlr, file, " %10d", SCIPnlpiGetNSolStat(nlpi, (SCIP_NLPSOLSTAT)j));
4152
4153 SCIPmessageFPrintInfo(scip->messagehdlr, file, "\n");
4154 }
4155}
4156
4157/** comparison method for statistics tables */
4158static
4160{ /*lint --e{715}*/
4161 return (SCIPtableGetPosition((SCIP_TABLE*)elem1) - (SCIPtableGetPosition((SCIP_TABLE*)elem2)));
4162}
4163
4164/** outputs solving statistics
4165 *
4166 * @return \ref SCIP_OKAY is returned if everything worked. Otherwise a suitable error code is passed. See \ref
4167 * SCIP_Retcode "SCIP_RETCODE" for a complete list of error codes.
4168 *
4169 * @note If limits have been changed between the solution and the call to this function, the status is recomputed and
4170 * thus may to correspond to the original status.
4171 *
4172 * @pre This method can be called if SCIP is in one of the following stages:
4173 * - \ref SCIP_STAGE_INIT
4174 * - \ref SCIP_STAGE_PROBLEM
4175 * - \ref SCIP_STAGE_TRANSFORMED
4176 * - \ref SCIP_STAGE_INITPRESOLVE
4177 * - \ref SCIP_STAGE_PRESOLVING
4178 * - \ref SCIP_STAGE_EXITPRESOLVE
4179 * - \ref SCIP_STAGE_PRESOLVED
4180 * - \ref SCIP_STAGE_SOLVING
4181 * - \ref SCIP_STAGE_SOLVED
4182 */
4184 SCIP* scip, /**< SCIP data structure */
4185 FILE* file /**< output file (or NULL for standard output) */
4186 )
4187{
4188 SCIP_TABLE** tables;
4189 int ntables;
4190 int i;
4191
4192 assert(scip != NULL);
4193 assert(scip->set != NULL);
4194
4195 SCIP_CALL( SCIPcheckStage(scip, "SCIPprintStatistics", TRUE, TRUE, FALSE, TRUE, TRUE, TRUE, TRUE, TRUE, FALSE, TRUE, TRUE, FALSE, FALSE, FALSE) );
4196
4197 ntables = SCIPgetNTables(scip);
4198 tables = SCIPgetTables(scip);
4199
4200 /* sort all tables by position unless this has already been done */
4201 if( ! scip->set->tablessorted )
4202 {
4203 SCIPsortPtr((void**)tables, tablePosComp, ntables);
4204
4205 scip->set->tablessorted = TRUE;
4206 }
4207
4208 for( i = 0; i < ntables; ++i )
4209 {
4210 /* skip tables which are not active or only used in later stages */
4211 if( ( ! SCIPtableIsActive(tables[i]) ) || SCIPtableGetEarliestStage(tables[i]) > SCIPgetStage(scip) )
4212 continue;
4213
4214 SCIP_CALL( SCIPtableOutput(tables[i], scip->set, file) );
4215 }
4216
4217 return SCIP_OKAY;
4218}
4219
4220/** outputs reoptimization statistics
4221 *
4222 * @return \ref SCIP_OKAY is returned if everything worked. Otherwise a suitable error code is passed. See \ref
4223 * SCIP_Retcode "SCIP_RETCODE" for a complete list of error codes.
4224 *
4225 * @pre This method can be called if SCIP is in one of the following stages:
4226 * - \ref SCIP_STAGE_INIT
4227 * - \ref SCIP_STAGE_PROBLEM
4228 * - \ref SCIP_STAGE_TRANSFORMED
4229 * - \ref SCIP_STAGE_INITPRESOLVE
4230 * - \ref SCIP_STAGE_PRESOLVING
4231 * - \ref SCIP_STAGE_EXITPRESOLVE
4232 * - \ref SCIP_STAGE_PRESOLVED
4233 * - \ref SCIP_STAGE_SOLVING
4234 * - \ref SCIP_STAGE_SOLVED
4235 */
4237 SCIP* scip, /**< SCIP data structure */
4238 FILE* file /**< output file (or NULL for standard output) */
4239 )
4240{
4241 SCIP_Real solving;
4242 SCIP_Real presolving;
4243 SCIP_Real updatetime;
4244
4245 SCIP_CALL( SCIPcheckStage(scip, "SCIPprintReoptStatistics", TRUE, TRUE, FALSE, TRUE, TRUE, TRUE, TRUE, TRUE, FALSE, TRUE, TRUE, FALSE, FALSE, FALSE) );
4246
4247 assert(scip != NULL);
4248
4249 /* skip if reoptimization is disabled */
4250 if( !scip->set->reopt_enable )
4251 return SCIP_OKAY;
4252
4253 /* skip if not problem yet */
4254 if( scip->stat == NULL )
4255 return SCIP_OKAY;
4256
4257 solving = SCIPclockGetTime(scip->stat->solvingtimeoverall);
4258 presolving = SCIPclockGetTime(scip->stat->presolvingtimeoverall);
4259 updatetime = SCIPclockGetTime(scip->stat->reoptupdatetime);
4260
4261 SCIPmessageFPrintInfo(scip->messagehdlr, file, "SCIP Reopt Status : finished after %d runs.\n", scip->stat->nreoptruns);
4262 SCIPmessageFPrintInfo(scip->messagehdlr, file, "Time (sec) :\n");
4263 SCIPmessageFPrintInfo(scip->messagehdlr, file, " solving : %10.2f\n", solving);
4264 SCIPmessageFPrintInfo(scip->messagehdlr, file, " presolving : %10.2f (included in solving)\n", presolving);
4265 SCIPmessageFPrintInfo(scip->messagehdlr, file, " save time : %10.2f\n", SCIPreoptGetSavingtime(scip->reopt));
4266 SCIPmessageFPrintInfo(scip->messagehdlr, file, " update time : %10.2f\n", updatetime);
4267 SCIPmessageFPrintInfo(scip->messagehdlr, file, "Nodes : feas infeas pruned cutoff\n");
4268 SCIPmessageFPrintInfo(scip->messagehdlr, file, " total : %10d %10d %10d %10d\n",
4271 if( scip->stat->nreoptruns > 0 )
4272 {
4273 SCIPmessageFPrintInfo(scip->messagehdlr, file, " avg : %10.2f %10.2f %10.2f %10.2f\n",
4274 (SCIP_Real)SCIPreoptGetNTotalFeasNodes(scip->reopt)/scip->stat->nreoptruns,
4275 (SCIP_Real)SCIPreoptGetNTotalInfNodes(scip->reopt)/scip->stat->nreoptruns,
4276 (SCIP_Real)SCIPreoptGetNTotalPrunedNodes(scip->reopt)/scip->stat->nreoptruns,
4277 (SCIP_Real)SCIPreoptGetNTotalCutoffReoptnodes(scip->reopt)/scip->stat->nreoptruns);
4278 }
4279 else
4280 {
4281 SCIPmessageFPrintInfo(scip->messagehdlr, file, " avg : %10s %10s %10s %10s\n", "--", "--", "--", "--");
4282 }
4283 SCIPmessageFPrintInfo(scip->messagehdlr, file, "Restarts : global local\n");
4284 SCIPmessageFPrintInfo(scip->messagehdlr, file, " first : %10d --\n", SCIPreoptGetFirstRestarts(scip->reopt));
4285 SCIPmessageFPrintInfo(scip->messagehdlr, file, " last : %10d --\n", SCIPreoptGetLastRestarts(scip->reopt));
4286 SCIPmessageFPrintInfo(scip->messagehdlr, file, " total : %10d %10d\n", SCIPreoptGetNRestartsGlobal(scip->reopt),
4288 if( scip->stat->nreoptruns > 0 )
4289 {
4290 SCIPmessageFPrintInfo(scip->messagehdlr, file, " avg : -- %10.2f\n",
4291 (SCIP_Real)SCIPreoptGetNTotalRestartsLocal(scip->reopt)/scip->stat->nreoptruns);
4292 }
4293 else
4294 {
4295 SCIPmessageFPrintInfo(scip->messagehdlr, file, " avg : -- %10s\n", "--");
4296 }
4297
4298 return SCIP_OKAY;
4299}
4300
4301/** outputs history statistics about branchings on variables
4302 *
4303 * @return \ref SCIP_OKAY is returned if everything worked. Otherwise a suitable error code is passed. See \ref
4304 * SCIP_Retcode "SCIP_RETCODE" for a complete list of error codes.
4305 *
4306 * @pre This method can be called if SCIP is in one of the following stages:
4307 * - \ref SCIP_STAGE_INIT
4308 * - \ref SCIP_STAGE_PROBLEM
4309 * - \ref SCIP_STAGE_TRANSFORMED
4310 * - \ref SCIP_STAGE_INITPRESOLVE
4311 * - \ref SCIP_STAGE_PRESOLVING
4312 * - \ref SCIP_STAGE_EXITPRESOLVE
4313 * - \ref SCIP_STAGE_PRESOLVED
4314 * - \ref SCIP_STAGE_SOLVING
4315 * - \ref SCIP_STAGE_SOLVED
4316 */
4318 SCIP* scip, /**< SCIP data structure */
4319 FILE* file /**< output file (or NULL for standard output) */
4320 )
4321{
4322 SCIP_VAR** vars;
4323 int totalnstrongbranchs;
4324 int v;
4325
4326 SCIP_CALL( SCIPcheckStage(scip, "SCIPprintBranchingStatistics", TRUE, TRUE, FALSE, TRUE, TRUE, TRUE, TRUE, TRUE, FALSE, TRUE, TRUE, FALSE, FALSE, FALSE) );
4327
4328 switch( scip->set->stage )
4329 {
4330 case SCIP_STAGE_INIT:
4331 case SCIP_STAGE_PROBLEM:
4332 SCIPmessageFPrintInfo(scip->messagehdlr, file, "problem not yet solved. branching statistics not available.\n");
4333 return SCIP_OKAY;
4334
4340 case SCIP_STAGE_SOLVING:
4341 case SCIP_STAGE_SOLVED:
4342 SCIP_CALL( SCIPallocBufferArray(scip, &vars, scip->transprob->nvars) );
4343 for( v = 0; v < scip->transprob->nvars; ++v )
4344 {
4345 SCIP_VAR* var;
4346 int i;
4347
4348 var = scip->transprob->vars[v];
4349 for( i = v; i > 0 && strcmp(SCIPvarGetName(var), SCIPvarGetName(vars[i-1])) < 0; i-- )
4350 vars[i] = vars[i-1];
4351 vars[i] = var;
4352 }
4353
4354 SCIPmessageFPrintInfo(scip->messagehdlr, file, " locks branchings inferences cutoffs LP gain pscostcount gain variance \n");
4355 SCIPmessageFPrintInfo(scip->messagehdlr, file, "variable prio factor down up depth down up sb down up down up down up down up down up\n");
4356
4357 totalnstrongbranchs = 0;
4358 for( v = 0; v < scip->transprob->nvars; ++v )
4359 {
4362 || SCIPgetVarNStrongbranchs(scip, vars[v]) > 0 )
4363 {
4364 int nstrongbranchs;
4365
4366 nstrongbranchs = SCIPgetVarNStrongbranchs(scip, vars[v]);
4367 totalnstrongbranchs += nstrongbranchs;
4368 SCIPmessageFPrintInfo(scip->messagehdlr, file, "%-16s %5d %8.1f %6d %6d %6.1f %7" SCIP_LONGINT_FORMAT " %7" SCIP_LONGINT_FORMAT " %5d %8.1f %8.1f %5.1f%% %5.1f%% %15.4f %15.4f %7.1f %7.1f %15.2f %15.2f\n",
4369 SCIPvarGetName(vars[v]),
4370 SCIPvarGetBranchPriority(vars[v]),
4371 SCIPvarGetBranchFactor(vars[v]),
4375 + SCIPvarGetAvgBranchdepth(vars[v], SCIP_BRANCHDIR_UPWARDS))/2.0 - 1.0,
4378 nstrongbranchs,
4381 100.0 * SCIPvarGetAvgCutoffs(vars[v], scip->stat, SCIP_BRANCHDIR_DOWNWARDS),
4382 100.0 * SCIPvarGetAvgCutoffs(vars[v], scip->stat, SCIP_BRANCHDIR_UPWARDS),
4383 SCIPvarGetPseudocost(vars[v], scip->stat, -1.0),
4384 SCIPvarGetPseudocost(vars[v], scip->stat, +1.0),
4389 }
4390 }
4391 SCIPmessageFPrintInfo(scip->messagehdlr, file, "total %7" SCIP_LONGINT_FORMAT " %7" SCIP_LONGINT_FORMAT " %5d %8.1f %8.1f %5.1f%% %5.1f%% %15.4f %15.4f %7.1f %7.1f %15.2f %15.2f\n",
4394 totalnstrongbranchs,
4407 SCIPhistoryGetPseudocost(scip->stat->glbhistory, -1.0),
4408 SCIPhistoryGetPseudocost(scip->stat->glbhistory, +1.0),
4413
4414 SCIPfreeBufferArray(scip, &vars);
4415
4416 return SCIP_OKAY;
4417
4418 default:
4419 SCIPerrorMessage("invalid SCIP stage <%d>\n", scip->set->stage);
4420 return SCIP_INVALIDCALL;
4421 } /*lint !e788*/
4422}
4423
4424/** outputs node information display line
4425 *
4426 * @return \ref SCIP_OKAY is returned if everything worked. Otherwise a suitable error code is passed. See \ref
4427 * SCIP_Retcode "SCIP_RETCODE" for a complete list of error codes.
4428 *
4429 * @pre This method can be called if SCIP is in one of the following stages:
4430 * - \ref SCIP_STAGE_SOLVING
4431 */
4433 SCIP* scip, /**< SCIP data structure */
4434 FILE* file, /**< output file (or NULL for standard output) */
4435 SCIP_VERBLEVEL verblevel, /**< minimal verbosity level to actually display the information line */
4436 SCIP_Bool endline /**< should the line be terminated with a newline symbol? */
4437 )
4438{
4439 SCIP_CALL( SCIPcheckStage(scip, "SCIPprintDisplayLine", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE, FALSE) );
4440
4441 if( (SCIP_VERBLEVEL)scip->set->disp_verblevel >= verblevel )
4442 {
4443 SCIP_CALL( SCIPdispPrintLine(scip->set, scip->messagehdlr, scip->stat, file, TRUE, endline) );
4444 }
4445
4446 return SCIP_OKAY;
4447}
4448
4449/** gets total number of implications between variables that are stored in the implication graph
4450 *
4451 * @return the total number of implications between variables that are stored in the implication graph
4452 *
4453 * @pre This method can be called if SCIP is in one of the following stages:
4454 * - \ref SCIP_STAGE_INITPRESOLVE
4455 * - \ref SCIP_STAGE_PRESOLVING
4456 * - \ref SCIP_STAGE_EXITPRESOLVE
4457 * - \ref SCIP_STAGE_PRESOLVED
4458 * - \ref SCIP_STAGE_INITSOLVE
4459 * - \ref SCIP_STAGE_SOLVING
4460 * - \ref SCIP_STAGE_SOLVED
4461 */
4463 SCIP* scip /**< SCIP data structure */
4464 )
4465{
4466 SCIP_CALL_ABORT( SCIPcheckStage(scip, "SCIPgetNImplications", FALSE, FALSE, FALSE, FALSE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, FALSE, FALSE, FALSE) );
4467
4468 return scip->stat->nimplications;
4469}
4470
4471/** stores conflict graph of binary variables' implications into a file, which can be used as input for the DOT tool
4472 *
4473 * @return \ref SCIP_OKAY is returned if everything worked. Otherwise a suitable error code is passed. See \ref
4474 * SCIP_Retcode "SCIP_RETCODE" for a complete list of error codes.
4475 *
4476 * @pre This method can be called if SCIP is in one of the following stages:
4477 * - \ref SCIP_STAGE_TRANSFORMED
4478 * - \ref SCIP_STAGE_INITPRESOLVE
4479 * - \ref SCIP_STAGE_PRESOLVING
4480 * - \ref SCIP_STAGE_EXITPRESOLVE
4481 * - \ref SCIP_STAGE_PRESOLVED
4482 * - \ref SCIP_STAGE_INITSOLVE
4483 * - \ref SCIP_STAGE_SOLVING
4484 * - \ref SCIP_STAGE_SOLVED
4485 * - \ref SCIP_STAGE_EXITSOLVE
4486 *
4487 * @deprecated because binary implications are now stored as cliques, please use SCIPwriteCliqueGraph() instead
4488 */ /*lint -e715*/
4490 SCIP* scip, /**< SCIP data structure */
4491 const char* filename /**< file name, or NULL for stdout */
4492 )
4493{ /*lint --e{715}*/
4494 SCIPwarningMessage(scip, "SCIPwriteImplicationConflictGraph() is deprecated and does not do anything anymore. All binary to binary implications are now stored in the clique data structure, which can be written to a GML formatted file via SCIPwriteCliqueGraph().\n");
4495
4496 return SCIP_OKAY;
4497}
4498
4499/** update statistical information when a new solution was found */
4501 SCIP* scip /**< SCIP data structure */
4502 )
4503{
4505
4506 if( scip->primal->nsols == 1 )
4507 scip->stat->firstsolgap = scip->stat->lastsolgap;
4508
4509 if( scip->set->misc_calcintegral )
4510 {
4511 SCIP_Real upperbound = SCIPgetUpperbound(scip);
4512
4513 if( upperbound < scip->stat->lastupperbound )
4514 SCIPstatUpdatePrimalDualIntegrals(scip->stat, scip->set, scip->transprob, scip->origprob, upperbound, -SCIPinfinity(scip));
4515 }
4516}
4517
4518/** recomputes and returns the primal dual gap stored in the stats
4519 *
4520 * @return returns the primal dual gap stored in the stats
4521 */
4522SCIP_EXPORT
4524 SCIP* scip /**< SCIP data structure */
4525 )
4526{
4527 return SCIPstatGetPrimalDualIntegral(scip->stat, scip->set, scip->transprob, scip->origprob, TRUE);
4528}
SCIP_Real SCIPbranchGetScore(SCIP_SET *set, SCIP_VAR *var, SCIP_Real downgain, SCIP_Real upgain)
Definition: branch.c:2190
internal methods for branching rules and branching candidate storage
SCIP_Real SCIPclockGetTime(SCIP_CLOCK *clck)
Definition: clock.c:438
internal methods for clocks and timing issues
SCIP_Longint SCIPconcsolverGetNNodes(SCIP_CONCSOLVER *concsolver)
Definition: concsolver.c:573
SCIP_Longint SCIPconcsolverGetNSolsRecvd(SCIP_CONCSOLVER *concsolver)
Definition: concsolver.c:583
SCIP_Real SCIPconcsolverGetSyncTime(SCIP_CONCSOLVER *concsolver)
Definition: concsolver.c:553
SCIP_Longint SCIPconcsolverGetNTighterIntBnds(SCIP_CONCSOLVER *concsolver)
Definition: concsolver.c:613
SCIP_Real SCIPconcsolverGetSolvingTime(SCIP_CONCSOLVER *concsolver)
Definition: concsolver.c:543
SCIP_Longint SCIPconcsolverGetNTighterBnds(SCIP_CONCSOLVER *concsolver)
Definition: concsolver.c:603
SCIP_Longint SCIPconcsolverGetNLPIterations(SCIP_CONCSOLVER *concsolver)
Definition: concsolver.c:563
char * SCIPconcsolverGetName(SCIP_CONCSOLVER *concsolver)
Definition: concsolver.c:300
SCIP_Longint SCIPconcsolverGetNSolsShared(SCIP_CONCSOLVER *concsolver)
Definition: concsolver.c:593
datastructures for concurrent solvers
SCIP_CONCSOLVER ** SCIPgetConcurrentSolvers(SCIP *scip)
Definition: concurrent.c:128
int SCIPgetNConcurrentSolvers(SCIP *scip)
Definition: concurrent.c:117
helper functions for concurrent scip solvers
internal methods for conflict analysis
int SCIPconflictGetNConflicts(SCIP_CONFLICT *conflict)
SCIP_Longint SCIPconflictGetNAppliedGlobalConss(SCIP_CONFLICT *conflict)
SCIP_Longint SCIPconflictGetNDualproofsInfLocal(SCIP_CONFLICT *conflict)
SCIP_Longint SCIPconflictGetNAppliedLocalLiterals(SCIP_CONFLICT *conflict)
SCIP_Longint SCIPconflictGetNPropCalls(SCIP_CONFLICT *conflict)
SCIP_Longint SCIPconflictGetNDualproofsInfNonzeros(SCIP_CONFLICT *conflict)
SCIP_Longint SCIPconflictGetNStrongbranchIterations(SCIP_CONFLICT *conflict)
SCIP_Real SCIPconflictGetInfeasibleLPTime(SCIP_CONFLICT *conflict)
SCIP_Longint SCIPconflictGetNInfeasibleLPCalls(SCIP_CONFLICT *conflict)
SCIP_Real SCIPconflictGetGlobalApplTime(SCIP_CONFLICT *conflict)
SCIP_Longint SCIPconflictGetNInfeasibleLPSuccess(SCIP_CONFLICT *conflict)
SCIP_Longint SCIPconflictGetNBoundexceedingLPReconvergenceConss(SCIP_CONFLICT *conflict)
SCIP_Longint SCIPconflictGetNGlobalChgBds(SCIP_CONFLICT *conflict)
SCIP_Longint SCIPconflictGetNPropConflictLiterals(SCIP_CONFLICT *conflict)
SCIP_Longint SCIPconflictGetNAppliedConss(SCIP_CONFLICT *conflict)
SCIP_Longint SCIPconflictGetNInfeasibleLPConflictConss(SCIP_CONFLICT *conflict)
SCIP_Longint SCIPconflictGetNBoundexceedingLPConflictConss(SCIP_CONFLICT *conflict)
SCIP_Longint SCIPconflictGetNBoundexceedingLPSuccess(SCIP_CONFLICT *conflict)
SCIP_Longint SCIPconflictGetNStrongbranchCalls(SCIP_CONFLICT *conflict)
SCIP_Longint SCIPconflictGetNInfeasibleLPReconvergenceLiterals(SCIP_CONFLICT *conflict)
SCIP_Longint SCIPconflictGetNPropReconvergenceConss(SCIP_CONFLICT *conflict)
SCIP_Real SCIPconflictGetBoundexceedingLPTime(SCIP_CONFLICT *conflict)
SCIP_Longint SCIPconflictGetNStrongbranchReconvergenceLiterals(SCIP_CONFLICT *conflict)
SCIP_Real SCIPconflictGetPseudoTime(SCIP_CONFLICT *conflict)
SCIP_Longint SCIPconflictGetNPseudoReconvergenceLiterals(SCIP_CONFLICT *conflict)
SCIP_Longint SCIPconflictGetNPropReconvergenceLiterals(SCIP_CONFLICT *conflict)
SCIP_Longint SCIPconflictGetNInfeasibleLPReconvergenceConss(SCIP_CONFLICT *conflict)
SCIP_Longint SCIPconflictGetNAppliedLocalConss(SCIP_CONFLICT *conflict)
SCIP_Longint SCIPconflictGetNStrongbranchReconvergenceConss(SCIP_CONFLICT *conflict)
SCIP_Longint SCIPconflictGetNBoundexceedingLPConflictLiterals(SCIP_CONFLICT *conflict)
SCIP_Real SCIPconflictGetStrongbranchTime(SCIP_CONFLICT *conflict)
SCIP_Longint SCIPconflictGetNPseudoSuccess(SCIP_CONFLICT *conflict)
SCIP_Longint SCIPconflictGetNInfeasibleLPConflictLiterals(SCIP_CONFLICT *conflict)
SCIP_Longint SCIPconflictGetNPseudoConflictLiterals(SCIP_CONFLICT *conflict)
SCIP_Longint SCIPconflictGetNLocalChgBds(SCIP_CONFLICT *conflict)
SCIP_Longint SCIPconflictGetNDualproofsBndSuccess(SCIP_CONFLICT *conflict)
SCIP_Longint SCIPconflictGetNPropSuccess(SCIP_CONFLICT *conflict)
SCIP_Longint SCIPconflictGetNDualproofsInfSuccess(SCIP_CONFLICT *conflict)
SCIP_Longint SCIPconflictGetNBoundexceedingLPCalls(SCIP_CONFLICT *conflict)
SCIP_Longint SCIPconflictGetNPropConflictConss(SCIP_CONFLICT *conflict)
SCIP_Longint SCIPconflictGetNStrongbranchSuccess(SCIP_CONFLICT *conflict)
SCIP_Longint SCIPconflictGetNDualproofsBndGlobal(SCIP_CONFLICT *conflict)
SCIP_Longint SCIPconflictGetNPseudoReconvergenceConss(SCIP_CONFLICT *conflict)
SCIP_Longint SCIPconflictGetNAppliedGlobalLiterals(SCIP_CONFLICT *conflict)
SCIP_Longint SCIPconflictGetNDualproofsBndLocal(SCIP_CONFLICT *conflict)
SCIP_Longint SCIPconflictGetNPseudoCalls(SCIP_CONFLICT *conflict)
SCIP_Real SCIPconflictGetPropTime(SCIP_CONFLICT *conflict)
SCIP_Longint SCIPconflictGetNBoundexceedingLPIterations(SCIP_CONFLICT *conflict)
SCIP_Longint SCIPconflictGetNStrongbranchConflictLiterals(SCIP_CONFLICT *conflict)
SCIP_Longint SCIPconflictGetNPseudoConflictConss(SCIP_CONFLICT *conflict)
SCIP_Longint SCIPconflictGetNDualproofsBndNonzeros(SCIP_CONFLICT *conflict)
SCIP_Longint SCIPconflictGetNDualproofsInfGlobal(SCIP_CONFLICT *conflict)
SCIP_Longint SCIPconflictGetNBoundexceedingLPReconvergenceLiterals(SCIP_CONFLICT *conflict)
SCIP_Longint SCIPconflictGetNStrongbranchConflictConss(SCIP_CONFLICT *conflict)
SCIP_Longint SCIPconflictGetNInfeasibleLPIterations(SCIP_CONFLICT *conflict)
int SCIPconflictstoreGetMaxPoolSize(SCIP_CONFLICTSTORE *conflictstore)
int SCIPconflictstoreGetInitPoolSize(SCIP_CONFLICTSTORE *conflictstore)
internal methods for storing conflicts
SCIP_RETCODE SCIPcheckStage(SCIP *scip, const char *method, SCIP_Bool init, SCIP_Bool problem, SCIP_Bool transforming, SCIP_Bool transformed, SCIP_Bool initpresolve, SCIP_Bool presolving, SCIP_Bool exitpresolve, SCIP_Bool presolved, SCIP_Bool initsolve, SCIP_Bool solving, SCIP_Bool solved, SCIP_Bool exitsolve, SCIP_Bool freetrans, SCIP_Bool freescip)
Definition: debug.c:2208
methods for debugging
#define NULL
Definition: def.h:266
#define SCIP_MAXSTRLEN
Definition: def.h:287
#define SCIP_Longint
Definition: def.h:157
#define SCIP_INVALID
Definition: def.h:192
#define SCIP_Bool
Definition: def.h:91
#define SCIP_Real
Definition: def.h:172
#define TRUE
Definition: def.h:93
#define FALSE
Definition: def.h:94
#define MAX(x, y)
Definition: def.h:238
#define SCIP_CALL_ABORT(x)
Definition: def.h:352
#define SCIP_LONGINT_FORMAT
Definition: def.h:164
#define REALABS(x)
Definition: def.h:196
#define SCIP_CALL(x)
Definition: def.h:373
SCIP_RETCODE SCIPdispPrintLine(SCIP_SET *set, SCIP_MESSAGEHDLR *messagehdlr, SCIP_STAT *stat, FILE *file, SCIP_Bool forcedisplay, SCIP_Bool endline)
Definition: disp.c:415
internal methods for displaying runtime statistics
#define nnodes
Definition: gastrans.c:74
SCIP_RETCODE SCIPprintStage(SCIP *scip, FILE *file)
Definition: scip_general.c:412
SCIP_STATUS SCIPgetStatus(SCIP *scip)
Definition: scip_general.c:508
SCIP_STAGE SCIPgetStage(SCIP *scip)
Definition: scip_general.c:390
void SCIPwarningMessage(SCIP *scip, const char *formatstr,...)
Definition: scip_message.c:120
SCIP_Real SCIPcomputeGap(SCIP_Real eps, SCIP_Real inf, SCIP_Real primalbound, SCIP_Real dualbound)
Definition: misc.c:11233
int SCIPgetNActiveBenders(SCIP *scip)
Definition: scip_benders.c:532
SCIP_Real SCIPbendersGetSetupTime(SCIP_BENDERS *benders)
Definition: benders.c:6062
int SCIPbendersGetNTransferredCuts(SCIP_BENDERS *benders)
Definition: benders.c:6757
int SCIPbendersGetNStrengthenFails(SCIP_BENDERS *benders)
Definition: benders.c:6052
SCIP_BENDERS ** SCIPgetBenders(SCIP *scip)
Definition: scip_benders.c:508
int SCIPgetNBenders(SCIP *scip)
Definition: scip_benders.c:521
int SCIPbendersGetNStrengthenCalls(SCIP_BENDERS *benders)
Definition: benders.c:6042
int SCIPbendersGetNBenderscuts(SCIP_BENDERS *benders)
Definition: benders.c:7012
SCIP_Bool SCIPbendersIsActive(SCIP_BENDERS *benders)
Definition: benders.c:2687
const char * SCIPbendersGetName(SCIP_BENDERS *benders)
Definition: benders.c:5946
int SCIPbendersGetNStrengthenCutsFound(SCIP_BENDERS *benders)
Definition: benders.c:6032
int SCIPbendersGetNCalls(SCIP_BENDERS *benders)
Definition: benders.c:6012
int SCIPbendersGetNCutsFound(SCIP_BENDERS *benders)
Definition: benders.c:6022
SCIP_Real SCIPbendersGetTime(SCIP_BENDERS *benders)
Definition: benders.c:6072
SCIP_BENDERSCUT ** SCIPbendersGetBenderscuts(SCIP_BENDERS *benders)
Definition: benders.c:6995
const char * SCIPbenderscutGetName(SCIP_BENDERSCUT *benderscut)
Definition: benderscut.c:492
SCIP_Longint SCIPbenderscutGetNCalls(SCIP_BENDERSCUT *benderscut)
Definition: benderscut.c:533
SCIP_Real SCIPbenderscutGetTime(SCIP_BENDERSCUT *benderscut)
Definition: benderscut.c:573
SCIP_Real SCIPbenderscutGetSetupTime(SCIP_BENDERSCUT *benderscut)
Definition: benderscut.c:563
SCIP_Longint SCIPbenderscutGetNFound(SCIP_BENDERSCUT *benderscut)
Definition: benderscut.c:543
SCIP_Longint SCIPbranchruleGetNDomredsFound(SCIP_BRANCHRULE *branchrule)
Definition: branch.c:2153
SCIP_Longint SCIPbranchruleGetNPseudoCalls(SCIP_BRANCHRULE *branchrule)
Definition: branch.c:2111
SCIP_Longint SCIPbranchruleGetNConssFound(SCIP_BRANCHRULE *branchrule)
Definition: branch.c:2143
SCIP_Longint SCIPbranchruleGetNLPCalls(SCIP_BRANCHRULE *branchrule)
Definition: branch.c:2091
const char * SCIPbranchruleGetName(SCIP_BRANCHRULE *branchrule)
Definition: branch.c:1971
SCIP_Longint SCIPbranchruleGetNChildren(SCIP_BRANCHRULE *branchrule)
Definition: branch.c:2163
SCIP_Real SCIPbranchruleGetTime(SCIP_BRANCHRULE *branchrule)
Definition: branch.c:2081
SCIP_Real SCIPbranchruleGetSetupTime(SCIP_BRANCHRULE *branchrule)
Definition: branch.c:2071
SCIP_Longint SCIPbranchruleGetNCutoffs(SCIP_BRANCHRULE *branchrule)
Definition: branch.c:2121
SCIP_Longint SCIPbranchruleGetNExternCalls(SCIP_BRANCHRULE *branchrule)
Definition: branch.c:2101
SCIP_Longint SCIPbranchruleGetNCutsFound(SCIP_BRANCHRULE *branchrule)
Definition: branch.c:2131
SCIP_Longint SCIPcomprGetNCalls(SCIP_COMPR *compr)
Definition: compr.c:510
SCIP_Longint SCIPcomprGetNFound(SCIP_COMPR *compr)
Definition: compr.c:520
SCIP_Real SCIPcomprGetSetupTime(SCIP_COMPR *compr)
Definition: compr.c:540
SCIP_Real SCIPcomprGetTime(SCIP_COMPR *compr)
Definition: compr.c:550
const char * SCIPcomprGetName(SCIP_COMPR *compr)
Definition: compr.c:456
int SCIPconshdlrGetMaxNActiveConss(SCIP_CONSHDLR *conshdlr)
Definition: cons.c:4970
SCIP_Real SCIPconshdlrGetCheckTime(SCIP_CONSHDLR *conshdlr)
Definition: cons.c:4800
SCIP_Longint SCIPconshdlrGetNCheckCalls(SCIP_CONSHDLR *conshdlr)
Definition: cons.c:4870
int SCIPconshdlrGetNChgSides(SCIP_CONSHDLR *conshdlr)
Definition: cons.c:5080
SCIP_Real SCIPconshdlrGetPresolTime(SCIP_CONSHDLR *conshdlr)
Definition: cons.c:4730
SCIP_Bool SCIPconshdlrDoesPresolve(SCIP_CONSHDLR *conshdlr)
Definition: cons.c:5170
int SCIPconshdlrGetNFixedVars(SCIP_CONSHDLR *conshdlr)
Definition: cons.c:4990
SCIP_Real SCIPconshdlrGetEnfoLPTime(SCIP_CONSHDLR *conshdlr)
Definition: cons.c:4750
int SCIPconshdlrGetNPresolCalls(SCIP_CONSHDLR *conshdlr)
Definition: cons.c:5090
SCIP_Longint SCIPconshdlrGetNDomredsFound(SCIP_CONSHDLR *conshdlr)
Definition: cons.c:4950
SCIP_Longint SCIPconshdlrGetNCutsApplied(SCIP_CONSHDLR *conshdlr)
Definition: cons.c:4910
int SCIPconshdlrGetNChgCoefs(SCIP_CONSHDLR *conshdlr)
Definition: cons.c:5070
SCIP_Real SCIPconshdlrGetStrongBranchPropTime(SCIP_CONSHDLR *conshdlr)
Definition: cons.c:4790
SCIP_Longint SCIPconshdlrGetNCutsFound(SCIP_CONSHDLR *conshdlr)
Definition: cons.c:4900
SCIP_Real SCIPconshdlrGetPropTime(SCIP_CONSHDLR *conshdlr)
Definition: cons.c:4780
SCIP_Real SCIPconshdlrGetEnfoPSTime(SCIP_CONSHDLR *conshdlr)
Definition: cons.c:4760
SCIP_Longint SCIPconshdlrGetNCutoffs(SCIP_CONSHDLR *conshdlr)
Definition: cons.c:4890
const char * SCIPconshdlrGetName(SCIP_CONSHDLR *conshdlr)
Definition: cons.c:4197
SCIP_Longint SCIPconshdlrGetNSepaCalls(SCIP_CONSHDLR *conshdlr)
Definition: cons.c:4820
int SCIPconshdlrGetNDelConss(SCIP_CONSHDLR *conshdlr)
Definition: cons.c:5040
SCIP_Longint SCIPconshdlrGetNChildren(SCIP_CONSHDLR *conshdlr)
Definition: cons.c:4960
SCIP_Real SCIPconshdlrGetEnfoRelaxTime(SCIP_CONSHDLR *conshdlr)
Definition: cons.c:4770
SCIP_Bool SCIPconshdlrNeedsCons(SCIP_CONSHDLR *conshdlr)
Definition: cons.c:5160
int SCIPconshdlrGetNAggrVars(SCIP_CONSHDLR *conshdlr)
Definition: cons.c:5000
SCIP_Longint SCIPconshdlrGetNEnfoPSCalls(SCIP_CONSHDLR *conshdlr)
Definition: cons.c:4840
int SCIPconshdlrGetNAddHoles(SCIP_CONSHDLR *conshdlr)
Definition: cons.c:5030
int SCIPconshdlrGetNUpgdConss(SCIP_CONSHDLR *conshdlr)
Definition: cons.c:5060
int SCIPconshdlrGetStartNActiveConss(SCIP_CONSHDLR *conshdlr)
Definition: cons.c:4980
int SCIPconshdlrGetNAddConss(SCIP_CONSHDLR *conshdlr)
Definition: cons.c:5050
int SCIPconshdlrGetNChgBds(SCIP_CONSHDLR *conshdlr)
Definition: cons.c:5020
SCIP_Longint SCIPconshdlrGetNConssFound(SCIP_CONSHDLR *conshdlr)
Definition: cons.c:4940
SCIP_Longint SCIPconshdlrGetNPropCalls(SCIP_CONSHDLR *conshdlr)
Definition: cons.c:4860
SCIP_Longint SCIPconshdlrGetNEnfoLPCalls(SCIP_CONSHDLR *conshdlr)
Definition: cons.c:4830
SCIP_Real SCIPconshdlrGetSetupTime(SCIP_CONSHDLR *conshdlr)
Definition: cons.c:4720
SCIP_Longint SCIPconshdlrGetNRespropCalls(SCIP_CONSHDLR *conshdlr)
Definition: cons.c:4880
SCIP_Real SCIPconshdlrGetSepaTime(SCIP_CONSHDLR *conshdlr)
Definition: cons.c:4740
int SCIPconshdlrGetNChgVarTypes(SCIP_CONSHDLR *conshdlr)
Definition: cons.c:5010
SCIP_Real SCIPconshdlrGetRespropTime(SCIP_CONSHDLR *conshdlr)
Definition: cons.c:4810
SCIP_Longint SCIPconshdlrGetNEnfoRelaxCalls(SCIP_CONSHDLR *conshdlr)
Definition: cons.c:4850
SCIP_Longint SCIPcutpoolGetNRootCalls(SCIP_CUTPOOL *cutpool)
Definition: cutpool.c:1117
SCIP_Longint SCIPcutpoolGetNCutsFound(SCIP_CUTPOOL *cutpool)
Definition: cutpool.c:1127
SCIP_Real SCIPcutpoolGetTime(SCIP_CUTPOOL *cutpool)
Definition: cutpool.c:1097
SCIP_Longint SCIPcutpoolGetMaxNCuts(SCIP_CUTPOOL *cutpool)
Definition: cutpool.c:1087
SCIP_Longint SCIPcutpoolGetNCalls(SCIP_CUTPOOL *cutpool)
Definition: cutpool.c:1107
SCIP_Longint SCIPcutpoolGetNCutsAdded(SCIP_CUTPOOL *cutpool)
Definition: cutpool.c:1137
SCIP_Longint SCIPcutselGetNLocalCuts(SCIP_CUTSEL *cutsel)
Definition: cutsel.c:625
SCIP_Longint SCIPcutselGetNLocalCutsFiltered(SCIP_CUTSEL *cutsel)
Definition: cutsel.c:645
SCIP_Longint SCIPcutselGetNRootCuts(SCIP_CUTSEL *cutsel)
Definition: cutsel.c:595
SCIP_Longint SCIPcutselGetNRootForcedCuts(SCIP_CUTSEL *cutsel)
Definition: cutsel.c:605
SCIP_Longint SCIPcutselGetNCalls(SCIP_CUTSEL *cutsel)
Definition: cutsel.c:575
SCIP_Real SCIPcutselGetTime(SCIP_CUTSEL *cutsel)
Definition: cutsel.c:565
const char * SCIPcutselGetName(SCIP_CUTSEL *cutsel)
Definition: cutsel.c:159
SCIP_Longint SCIPcutselGetNRootCutsFiltered(SCIP_CUTSEL *cutsel)
Definition: cutsel.c:615
SCIP_Real SCIPcutselGetSetupTime(SCIP_CUTSEL *cutsel)
Definition: cutsel.c:555
SCIP_Longint SCIPcutselGetNLocalForcedCuts(SCIP_CUTSEL *cutsel)
Definition: cutsel.c:635
SCIP_Longint SCIPcutselGetNRootCalls(SCIP_CUTSEL *cutsel)
Definition: cutsel.c:585
SCIP_Longint SCIPdivesetGetNBacktracks(SCIP_DIVESET *diveset, SCIP_DIVECONTEXT divecontext)
Definition: heur.c:615
SCIP_Longint SCIPdivesetGetNSols(SCIP_DIVESET *diveset, SCIP_DIVECONTEXT divecontext)
Definition: heur.c:641
int SCIPdivesetGetMaxSolutionDepth(SCIP_DIVESET *diveset, SCIP_DIVECONTEXT divecontext)
Definition: heur.c:563
SCIP_Longint SCIPdivesetGetNConflicts(SCIP_DIVESET *diveset, SCIP_DIVECONTEXT divecontext)
Definition: heur.c:628
SCIP_Real SCIPdivesetGetAvgSolutionDepth(SCIP_DIVESET *diveset, SCIP_DIVECONTEXT divecontext)
Definition: heur.c:576
int SCIPdivesetGetMaxDepth(SCIP_DIVESET *diveset, SCIP_DIVECONTEXT divecontext)
Definition: heur.c:524
int SCIPdivesetGetMinDepth(SCIP_DIVESET *diveset, SCIP_DIVECONTEXT divecontext)
Definition: heur.c:511
SCIP_Real SCIPdivesetGetAvgDepth(SCIP_DIVESET *diveset, SCIP_DIVECONTEXT divecontext)
Definition: heur.c:537
SCIP_Longint SCIPdivesetGetNLPIterations(SCIP_DIVESET *diveset, SCIP_DIVECONTEXT divecontext)
Definition: heur.c:589
int SCIPdivesetGetMinSolutionDepth(SCIP_DIVESET *diveset, SCIP_DIVECONTEXT divecontext)
Definition: heur.c:550
const char * SCIPdivesetGetName(SCIP_DIVESET *diveset)
Definition: heur.c:445
int SCIPdivesetGetNCalls(SCIP_DIVESET *diveset, SCIP_DIVECONTEXT divecontext)
Definition: heur.c:485
SCIP_Longint SCIPdivesetGetNProbingNodes(SCIP_DIVESET *diveset, SCIP_DIVECONTEXT divecontext)
Definition: heur.c:602
int SCIPdivesetGetNSolutionCalls(SCIP_DIVESET *diveset, SCIP_DIVECONTEXT divecontext)
Definition: heur.c:498
const char * SCIPexprhdlrGetName(SCIP_EXPRHDLR *exprhdlr)
Definition: expr.c:545
SCIP_Real SCIPexprhdlrGetEstimateTime(SCIP_EXPRHDLR *exprhdlr)
Definition: expr.c:793
SCIP_Longint SCIPexprhdlrGetNDomainReductions(SCIP_EXPRHDLR *exprhdlr)
Definition: expr.c:761
SCIP_Real SCIPexprhdlrGetReversepropTime(SCIP_EXPRHDLR *exprhdlr)
Definition: expr.c:741
SCIP_Longint SCIPexprhdlrGetNReversepropCalls(SCIP_EXPRHDLR *exprhdlr)
Definition: expr.c:731
unsigned int SCIPexprhdlrGetNCreated(SCIP_EXPRHDLR *exprhdlr)
Definition: expr.c:701
SCIP_Longint SCIPexprhdlrGetNBranchings(SCIP_EXPRHDLR *exprhdlr)
Definition: expr.c:807
SCIP_Longint SCIPexprhdlrGetNSimplifyCalls(SCIP_EXPRHDLR *exprhdlr)
Definition: expr.c:827
SCIP_Real SCIPexprhdlrGetIntevalTime(SCIP_EXPRHDLR *exprhdlr)
Definition: expr.c:721
SCIP_Real SCIPexprhdlrGetSimplifyTime(SCIP_EXPRHDLR *exprhdlr)
Definition: expr.c:837
SCIP_Longint SCIPexprhdlrGetNIntevalCalls(SCIP_EXPRHDLR *exprhdlr)
Definition: expr.c:711
SCIP_Longint SCIPexprhdlrGetNSimplifications(SCIP_EXPRHDLR *exprhdlr)
Definition: expr.c:847
SCIP_Longint SCIPexprhdlrGetNCutoffs(SCIP_EXPRHDLR *exprhdlr)
Definition: expr.c:751
SCIP_Longint SCIPexprhdlrGetNEstimateCalls(SCIP_EXPRHDLR *exprhdlr)
Definition: expr.c:783
SCIP_Longint SCIPheurGetNSolsFound(SCIP_HEUR *heur)
Definition: heur.c:1589
SCIP_Longint SCIPheurGetNBestSolsFound(SCIP_HEUR *heur)
Definition: heur.c:1599
SCIP_Longint SCIPheurGetNCalls(SCIP_HEUR *heur)
Definition: heur.c:1579
SCIP_Real SCIPheurGetSetupTime(SCIP_HEUR *heur)
Definition: heur.c:1631
int SCIPheurGetNDivesets(SCIP_HEUR *heur)
Definition: heur.c:1661
SCIP_Real SCIPheurGetTime(SCIP_HEUR *heur)
Definition: heur.c:1641
const char * SCIPheurGetName(SCIP_HEUR *heur)
Definition: heur.c:1453
SCIP_DIVESET ** SCIPheurGetDivesets(SCIP_HEUR *heur)
Definition: heur.c:1651
#define SCIPallocBufferArray(scip, ptr, num)
Definition: scip_mem.h:124
#define SCIPfreeBufferArray(scip, ptr)
Definition: scip_mem.h:136
int SCIPnlpiGetNSolves(SCIP_NLPI *nlpi)
Definition: nlpi.c:774
SCIP_Real SCIPnlpiGetProblemTime(SCIP_NLPI *nlpi)
Definition: nlpi.c:765
SCIP_Real SCIPnlpiGetSolveTime(SCIP_NLPI *nlpi)
Definition: nlpi.c:783
int SCIPnlpiGetNTermStat(SCIP_NLPI *nlpi, SCIP_NLPTERMSTAT termstatus)
Definition: nlpi.c:813
SCIP_Longint SCIPnlpiGetNIterations(SCIP_NLPI *nlpi)
Definition: nlpi.c:804
int SCIPnlpiGetNProblems(SCIP_NLPI *nlpi)
Definition: nlpi.c:756
int SCIPnlpiGetNSolStat(SCIP_NLPI *nlpi, SCIP_NLPSOLSTAT solstatus)
Definition: nlpi.c:823
const char * SCIPnlpiGetName(SCIP_NLPI *nlpi)
Definition: nlpi.c:722
SCIP_Real SCIPnlpiGetEvalTime(SCIP_NLPI *nlpi)
Definition: nlpi.c:795
SCIP_RETCODE SCIPgetNLPNlRowsStat(SCIP *scip, int *nlinear, int *nconvexineq, int *nnonconvexineq, int *nnonlineareq)
Definition: scip_nlp.c:369
SCIP_Real SCIPpresolGetSetupTime(SCIP_PRESOL *presol)
Definition: presol.c:697
int SCIPpresolGetNAggrVars(SCIP_PRESOL *presol)
Definition: presol.c:727
int SCIPpresolGetNCalls(SCIP_PRESOL *presol)
Definition: presol.c:817
int SCIPpresolGetNDelConss(SCIP_PRESOL *presol)
Definition: presol.c:767
int SCIPpresolGetNChgCoefs(SCIP_PRESOL *presol)
Definition: presol.c:797
int SCIPpresolGetNAddHoles(SCIP_PRESOL *presol)
Definition: presol.c:757
SCIP_Real SCIPpresolGetTime(SCIP_PRESOL *presol)
Definition: presol.c:707
int SCIPpresolGetNChgVarTypes(SCIP_PRESOL *presol)
Definition: presol.c:737
int SCIPpresolGetNChgSides(SCIP_PRESOL *presol)
Definition: presol.c:807
int SCIPpresolGetNFixedVars(SCIP_PRESOL *presol)
Definition: presol.c:717
int SCIPpresolGetNChgBds(SCIP_PRESOL *presol)
Definition: presol.c:747
int SCIPpresolGetNAddConss(SCIP_PRESOL *presol)
Definition: presol.c:777
const char * SCIPpresolGetName(SCIP_PRESOL *presol)
Definition: presol.c:599
int SCIPpricerGetNVarsFound(SCIP_PRICER *pricer)
Definition: pricer.c:654
const char * SCIPpricerGetName(SCIP_PRICER *pricer)
Definition: pricer.c:600
SCIP_Real SCIPpricerGetSetupTime(SCIP_PRICER *pricer)
Definition: pricer.c:664
SCIP_Real SCIPpricerGetTime(SCIP_PRICER *pricer)
Definition: pricer.c:674
int SCIPpricerGetNCalls(SCIP_PRICER *pricer)
Definition: pricer.c:644
SCIP_Bool SCIPpropDoesPresolve(SCIP_PROP *prop)
Definition: prop.c:1286
SCIP_Real SCIPpropGetRespropTime(SCIP_PROP *prop)
Definition: prop.c:1076
SCIP_Real SCIPpropGetPresolTime(SCIP_PROP *prop)
Definition: prop.c:1086
SCIP_Longint SCIPpropGetNCutoffs(SCIP_PROP *prop)
Definition: prop.c:1116
SCIP_Real SCIPpropGetSetupTime(SCIP_PROP *prop)
Definition: prop.c:1034
int SCIPpropGetNAddHoles(SCIP_PROP *prop)
Definition: prop.c:1206
int SCIPpropGetNChgBds(SCIP_PROP *prop)
Definition: prop.c:1196
int SCIPpropGetNChgSides(SCIP_PROP *prop)
Definition: prop.c:1256
int SCIPpropGetNPresolCalls(SCIP_PROP *prop)
Definition: prop.c:1266
SCIP_Longint SCIPpropGetNRespropCalls(SCIP_PROP *prop)
Definition: prop.c:1106
SCIP_Real SCIPpropGetStrongBranchPropTime(SCIP_PROP *prop)
Definition: prop.c:1066
SCIP_Longint SCIPpropGetNDomredsFound(SCIP_PROP *prop)
Definition: prop.c:1126
int SCIPpropGetNChgCoefs(SCIP_PROP *prop)
Definition: prop.c:1246
int SCIPpropGetNAggrVars(SCIP_PROP *prop)
Definition: prop.c:1176
int SCIPpropGetNFixedVars(SCIP_PROP *prop)
Definition: prop.c:1166
const char * SCIPpropGetName(SCIP_PROP *prop)
Definition: prop.c:941
int SCIPpropGetNAddConss(SCIP_PROP *prop)
Definition: prop.c:1226
SCIP_Real SCIPpropGetTime(SCIP_PROP *prop)
Definition: prop.c:1056
int SCIPpropGetNChgVarTypes(SCIP_PROP *prop)
Definition: prop.c:1186
SCIP_Longint SCIPpropGetNCalls(SCIP_PROP *prop)
Definition: prop.c:1096
int SCIPpropGetNDelConss(SCIP_PROP *prop)
Definition: prop.c:1216
const char * SCIPreaderGetName(SCIP_READER *reader)
Definition: reader.c:557
SCIP_Longint SCIPrelaxGetNAddedConss(SCIP_RELAX *relax)
Definition: relax.c:658
SCIP_Real SCIPrelaxGetTime(SCIP_RELAX *relax)
Definition: relax.c:618
const char * SCIPrelaxGetName(SCIP_RELAX *relax)
Definition: relax.c:542
SCIP_Longint SCIPrelaxGetNCutoffs(SCIP_RELAX *relax)
Definition: relax.c:638
SCIP_Longint SCIPrelaxGetNSeparatedCuts(SCIP_RELAX *relax)
Definition: relax.c:688
SCIP_Longint SCIPrelaxGetNReducedDomains(SCIP_RELAX *relax)
Definition: relax.c:678
SCIP_Real SCIPrelaxGetImprovedLowerboundTime(SCIP_RELAX *relax)
Definition: relax.c:668
SCIP_Longint SCIPrelaxGetNImprovedLowerbound(SCIP_RELAX *relax)
Definition: relax.c:648
SCIP_Longint SCIPrelaxGetNCalls(SCIP_RELAX *relax)
Definition: relax.c:628
SCIP_Longint SCIPsepaGetNCutsApplied(SCIP_SEPA *sepa)
Definition: sepa.c:941
SCIP_Longint SCIPsepaGetNCutoffs(SCIP_SEPA *sepa)
Definition: sepa.c:890
SCIP_Longint SCIPsepaGetNCutsAppliedViaPool(SCIP_SEPA *sepa)
Definition: sepa.c:951
SCIP_Longint SCIPsepaGetNCutsAppliedDirect(SCIP_SEPA *sepa)
Definition: sepa.c:961
const char * SCIPsepaGetName(SCIP_SEPA *sepa)
Definition: sepa.c:743
SCIP_Longint SCIPsepaGetNDomredsFound(SCIP_SEPA *sepa)
Definition: sepa.c:1079
SCIP_Bool SCIPsepaIsParentsepa(SCIP_SEPA *sepa)
Definition: sepa.c:1129
SCIP_Real SCIPsepaGetTime(SCIP_SEPA *sepa)
Definition: sepa.c:850
SCIP_SEPA * SCIPsepaGetParentsepa(SCIP_SEPA *sepa)
Definition: sepa.c:1139
SCIP_Longint SCIPsepaGetNCutsAddedViaPool(SCIP_SEPA *sepa)
Definition: sepa.c:921
SCIP_Longint SCIPsepaGetNConssFound(SCIP_SEPA *sepa)
Definition: sepa.c:1069
SCIP_Longint SCIPsepaGetNRootCalls(SCIP_SEPA *sepa)
Definition: sepa.c:870
SCIP_Longint SCIPsepaGetNCutsAddedDirect(SCIP_SEPA *sepa)
Definition: sepa.c:931
SCIP_Real SCIPsepaGetSetupTime(SCIP_SEPA *sepa)
Definition: sepa.c:840
SCIP_Longint SCIPsepaGetNCutsFound(SCIP_SEPA *sepa)
Definition: sepa.c:900
SCIP_Longint SCIPsepaGetNCalls(SCIP_SEPA *sepa)
Definition: sepa.c:860
SCIP_Real SCIPsolGetTime(SCIP_SOL *sol)
Definition: sol.c:2764
SCIP_Longint SCIPsolGetNodenum(SCIP_SOL *sol)
Definition: sol.c:2784
SCIP_HEUR * SCIPsolGetHeur(SCIP_SOL *sol)
Definition: sol.c:2804
int SCIPsolGetDepth(SCIP_SOL *sol)
Definition: sol.c:2794
int SCIPsolGetRunnum(SCIP_SOL *sol)
Definition: sol.c:2774
SCIP_Real SCIPretransformObj(SCIP *scip, SCIP_Real obj)
Definition: scip_sol.c:1428
void SCIPprintPropagatorStatistics(SCIP *scip, FILE *file)
void SCIPprintTreeStatistics(SCIP *scip, FILE *file)
void SCIPprintStatusStatistics(SCIP *scip, FILE *file)
SCIP_Real SCIPgetAvgConflictScoreCurrentRun(SCIP *scip)
void SCIPprintCompressionStatistics(SCIP *scip, FILE *file)
SCIP_Real SCIPgetAvgCutoffsCurrentRun(SCIP *scip, SCIP_BRANCHDIR dir)
void SCIPprintRootStatistics(SCIP *scip, FILE *file)
SCIP_Bool SCIPisPrimalboundSol(SCIP *scip)
SCIP_Longint SCIPgetNConflictDualproofsApplied(SCIP *scip)
int SCIPgetNImplications(SCIP *scip)
void SCIPprintConstraintTimingStatistics(SCIP *scip, FILE *file)
void SCIPaddNNodes(SCIP *scip, SCIP_Longint nnodes)
void SCIPincAvgGMIeff(SCIP *scip, SCIP_Real gmieff)
SCIP_Real SCIPgetDeterministicTime(SCIP *scip)
SCIP_Longint SCIPgetNSolsFound(SCIP *scip)
SCIP_Real SCIPgetPrimalbound(SCIP *scip)
int SCIPgetMaxDepth(SCIP *scip)
SCIP_RETCODE SCIPupdateCutoffbound(SCIP *scip, SCIP_Real cutoffbound)
SCIP_Longint SCIPgetNBarrierLPIterations(SCIP *scip)
SCIP_Real SCIPgetAvgInferenceScore(SCIP *scip)
SCIP_Longint SCIPgetNDivingLPIterations(SCIP *scip)
SCIP_Real SCIPgetAvgPseudocostScoreCurrentRun(SCIP *scip)
SCIP_Real SCIPgetUpperbound(SCIP *scip)
SCIP_Real SCIPgetLowerboundRoot(SCIP *scip)
SCIP_Real SCIPgetAvgConflictlengthScore(SCIP *scip)
void SCIPprintSolutionStatistics(SCIP *scip, FILE *file)
SCIP_Real SCIPgetAvgPseudocostCount(SCIP *scip, SCIP_BRANCHDIR dir)
SCIP_Longint SCIPgetNInfeasibleLeaves(SCIP *scip)
void SCIPprintRelaxatorStatistics(SCIP *scip, FILE *file)
SCIP_Real SCIPgetGap(SCIP *scip)
SCIP_Longint SCIPgetNResolveLPIterations(SCIP *scip)
void SCIPprintOrigProblemStatistics(SCIP *scip, FILE *file)
SCIP_Longint SCIPgetNNodeZeroIterationLPs(SCIP *scip)
SCIP_Longint SCIPgetNNodes(SCIP *scip)
SCIP_Longint SCIPgetNFeasibleLeaves(SCIP *scip)
SCIP_Longint SCIPgetNNodeInitLPs(SCIP *scip)
int SCIPgetMaxTotalDepth(SCIP *scip)
int SCIPgetNPricevars(SCIP *scip)
int SCIPgetNRootboundChgsRun(SCIP *scip)
SCIP_Real SCIPgetDualbound(SCIP *scip)
void SCIPprintLPStatistics(SCIP *scip, FILE *file)
SCIP_Longint SCIPgetNRootStrongbranchs(SCIP *scip)
int SCIPgetNEnabledConss(SCIP *scip)
int SCIPgetNSepaRounds(SCIP *scip)
int SCIPgetNCutsFoundRound(SCIP *scip)
void SCIPprintNLPStatistics(SCIP *scip, FILE *file)
int SCIPgetNRootboundChgs(SCIP *scip)
SCIP_Real SCIPgetFirstPrimalBound(SCIP *scip)
SCIP_Longint SCIPgetNStrongbranchLPIterations(SCIP *scip)
int SCIPgetNPricevarsApplied(SCIP *scip)
int SCIPgetNCutsApplied(SCIP *scip)
void SCIPprintPricerStatistics(SCIP *scip, FILE *file)
SCIP_RETCODE SCIPprintStatistics(SCIP *scip, FILE *file)
SCIP_Real SCIPgetLowerbound(SCIP *scip)
SCIP_Real SCIPgetAvgLowerbound(SCIP *scip)
SCIP_RETCODE SCIPprintBranchingStatistics(SCIP *scip, FILE *file)
SCIP_Longint SCIPgetNTotalNodes(SCIP *scip)
void SCIPprintSeparatorStatistics(SCIP *scip, FILE *file)
void SCIPprintConcsolverStatistics(SCIP *scip, FILE *file)
SCIP_Longint SCIPgetNResolveLPs(SCIP *scip)
int SCIPgetNRuns(SCIP *scip)
void SCIPprintNLPIStatistics(SCIP *scip, FILE *file)
SCIP_Longint SCIPgetNNodeLPIterations(SCIP *scip)
SCIP_Longint SCIPgetNDualLPIterations(SCIP *scip)
void SCIPprintBranchruleStatistics(SCIP *scip, FILE *file)
int SCIPgetNActiveConss(SCIP *scip)
void SCIPprintConflictStatistics(SCIP *scip, FILE *file)
SCIP_Real SCIPgetDualboundRoot(SCIP *scip)
SCIP_Longint SCIPgetNDualLPs(SCIP *scip)
SCIP_Real SCIPgetAvgCutoffScoreCurrentRun(SCIP *scip)
SCIP_Real SCIPgetAvgGMIeff(SCIP *scip)
void SCIPprintExpressionHandlerStatistics(SCIP *scip, FILE *file)
int SCIPgetNPriceRounds(SCIP *scip)
SCIP_Longint SCIPgetNLPs(SCIP *scip)
int SCIPgetNReoptRuns(SCIP *scip)
SCIP_Real SCIPgetAvgDualbound(SCIP *scip)
void SCIPprintBendersStatistics(SCIP *scip, FILE *file)
void SCIPprintTimingStatistics(SCIP *scip, FILE *file)
SCIP_Longint SCIPgetNRootLPIterations(SCIP *scip)
SCIP_Longint SCIPgetNPrimalResolveLPIterations(SCIP *scip)
SCIP_Real SCIPgetAvgInferenceScoreCurrentRun(SCIP *scip)
void SCIPprintCutselectorStatistics(SCIP *scip, FILE *file)
SCIP_Real SCIPgetAvgConflictScore(SCIP *scip)
SCIP_Longint SCIPgetNLimSolsFound(SCIP *scip)
void SCIPstoreSolutionGap(SCIP *scip)
SCIP_Real SCIPgetAvgPseudocost(SCIP *scip, SCIP_Real solvaldelta)
void SCIPprintConstraintStatistics(SCIP *scip, FILE *file)
SCIP_RETCODE SCIPprintTransProblem(SCIP *scip, FILE *file, const char *extension, SCIP_Bool genericnames)
SCIP_Longint SCIPgetNBacktracks(SCIP *scip)
SCIP_RETCODE SCIPprintReoptStatistics(SCIP *scip, FILE *file)
SCIP_Longint SCIPgetNBarrierLPs(SCIP *scip)
SCIP_RETCODE SCIPprintOrigProblem(SCIP *scip, FILE *file, const char *extension, SCIP_Bool genericnames)
SCIP_Longint SCIPgetNDualResolveLPIterations(SCIP *scip)
SCIP_Real SCIPgetTransGap(SCIP *scip)
SCIP_Longint SCIPgetNBestSolsFound(SCIP *scip)
SCIP_RETCODE SCIPwriteImplicationConflictGraph(SCIP *scip, const char *filename)
SCIP_Real SCIPgetAvgPseudocostScore(SCIP *scip)
SCIP_Real SCIPgetPseudocostCount(SCIP *scip, SCIP_BRANCHDIR dir, SCIP_Bool onlycurrentrun)
SCIP_Real SCIPgetCutoffbound(SCIP *scip)
SCIP_Real SCIPgetFirstLPLowerboundRoot(SCIP *scip)
SCIP_Real SCIPgetAvgPseudocostCountCurrentRun(SCIP *scip, SCIP_BRANCHDIR dir)
SCIP_Longint SCIPgetNConflictConssApplied(SCIP *scip)
SCIP_Longint SCIPgetNObjlimLeaves(SCIP *scip)
int SCIPgetNCutsFound(SCIP *scip)
void SCIPprintPresolverStatistics(SCIP *scip, FILE *file)
void SCIPprintTransProblemStatistics(SCIP *scip, FILE *file)
SCIP_RETCODE SCIPprintDisplayLine(SCIP *scip, FILE *file, SCIP_VERBLEVEL verblevel, SCIP_Bool endline)
SCIP_Longint SCIPgetNDivingLPs(SCIP *scip)
SCIP_Longint SCIPgetNNodeLPs(SCIP *scip)
SCIP_Real SCIPgetFirstLPDualboundRoot(SCIP *scip)
SCIP_Real SCIPgetAvgConflictlengthScoreCurrentRun(SCIP *scip)
SCIP_Longint SCIPgetNRootFirstLPIterations(SCIP *scip)
int SCIPgetNPricevarsFound(SCIP *scip)
SCIP_Longint SCIPgetNNodeInitLPIterations(SCIP *scip)
SCIP_Longint SCIPgetNNZs(SCIP *scip)
SCIP_Longint SCIPgetNDelayedCutoffs(SCIP *scip)
SCIP_Longint SCIPgetNPrimalResolveLPs(SCIP *scip)
SCIP_Longint SCIPgetNConflictConssFound(SCIP *scip)
SCIP_Real SCIPgetAvgPseudocostCurrentRun(SCIP *scip, SCIP_Real solvaldelta)
SCIP_Real SCIPgetAvgInferences(SCIP *scip, SCIP_BRANCHDIR dir)
SCIP_Longint SCIPgetNPrimalLPIterations(SCIP *scip)
SCIP_Longint SCIPgetNStrongbranchs(SCIP *scip)
int SCIPgetNConflictConssFoundNode(SCIP *scip)
SCIP_Longint SCIPgetNLPIterations(SCIP *scip)
SCIP_Real SCIPgetAvgInferencesCurrentRun(SCIP *scip, SCIP_BRANCHDIR dir)
SCIP_Longint SCIPgetNDualResolveLPs(SCIP *scip)
void SCIPprintHeuristicStatistics(SCIP *scip, FILE *file)
SCIP_Real SCIPgetPseudocostVariance(SCIP *scip, SCIP_BRANCHDIR branchdir, SCIP_Bool onlycurrentrun)
SCIP_Real SCIPgetPrimalDualIntegral(SCIP *scip)
SCIP_Longint SCIPgetNPrimalLPs(SCIP *scip)
SCIP_Real SCIPgetAvgCutoffs(SCIP *scip, SCIP_BRANCHDIR dir)
SCIP_Longint SCIPgetNRootStrongbranchLPIterations(SCIP *scip)
SCIP_Real SCIPgetAvgCutoffScore(SCIP *scip)
int SCIPtableGetPosition(SCIP_TABLE *table)
Definition: table.c:329
SCIP_TABLE ** SCIPgetTables(SCIP *scip)
Definition: scip_table.c:107
int SCIPgetNTables(SCIP *scip)
Definition: scip_table.c:118
SCIP_STAGE SCIPtableGetEarliestStage(SCIP_TABLE *table)
Definition: table.c:339
SCIP_Bool SCIPtableIsActive(SCIP_TABLE *table)
Definition: table.c:349
SCIP_Real SCIPgetFirstLPTime(SCIP *scip)
Definition: scip_timing.c:468
SCIP_Real SCIPgetSolvingTime(SCIP *scip)
Definition: scip_timing.c:378
SCIP_Real SCIPgetReadingTime(SCIP *scip)
Definition: scip_timing.c:405
SCIP_Real SCIPinfinity(SCIP *scip)
SCIP_Bool SCIPisLE(SCIP *scip, SCIP_Real val1, SCIP_Real val2)
SCIP_Bool SCIPisFeasZero(SCIP *scip, SCIP_Real val)
SCIP_Bool SCIPisInfinity(SCIP *scip, SCIP_Real val)
SCIP_Real SCIPvarGetAvgBranchdepth(SCIP_VAR *var, SCIP_BRANCHDIR dir)
Definition: var.c:15807
int SCIPvarGetNLocksUpType(SCIP_VAR *var, SCIP_LOCKTYPE locktype)
Definition: var.c:3353
const char * SCIPvarGetName(SCIP_VAR *var)
Definition: var.c:17439
SCIP_Real SCIPvarGetBranchFactor(SCIP_VAR *var)
Definition: var.c:18258
SCIP_Longint SCIPvarGetNBranchings(SCIP_VAR *var, SCIP_BRANCHDIR dir)
Definition: var.c:15719
int SCIPvarGetBranchPriority(SCIP_VAR *var)
Definition: var.c:18270
int SCIPgetVarNStrongbranchs(SCIP *scip, SCIP_VAR *var)
Definition: scip_var.c:4349
int SCIPvarGetNLocksDownType(SCIP_VAR *var, SCIP_LOCKTYPE locktype)
Definition: var.c:3295
void SCIPsortPtr(void **ptrarray, SCIP_DECL_SORTPTRCOMP((*ptrcomp)), int len)
int SCIPsnprintf(char *t, int len, const char *s,...)
Definition: misc.c:10880
SCIP_Real SCIPhistoryGetPseudocost(SCIP_HISTORY *history, SCIP_Real solvaldelta)
Definition: history.c:446
SCIP_Real SCIPhistoryGetAvgInferences(SCIP_HISTORY *history, SCIP_BRANCHDIR dir)
Definition: history.c:665
SCIP_Longint SCIPhistoryGetNBranchings(SCIP_HISTORY *history, SCIP_BRANCHDIR dir)
Definition: history.c:639
SCIP_Real SCIPhistoryGetAvgConflictlength(SCIP_HISTORY *history, SCIP_BRANCHDIR dir)
Definition: history.c:578
SCIP_Real SCIPhistoryGetAvgCutoffs(SCIP_HISTORY *history, SCIP_BRANCHDIR dir)
Definition: history.c:691
SCIP_Real SCIPhistoryGetCutoffSum(SCIP_HISTORY *history, SCIP_BRANCHDIR dir)
Definition: history.c:678
SCIP_Real SCIPhistoryGetPseudocostCount(SCIP_HISTORY *history, SCIP_BRANCHDIR dir)
Definition: history.c:484
SCIP_Real SCIPhistoryGetPseudocostVariance(SCIP_HISTORY *history, SCIP_BRANCHDIR direction)
Definition: history.c:460
SCIP_Real SCIPhistoryGetVSIDS(SCIP_HISTORY *history, SCIP_BRANCHDIR dir)
Definition: history.c:536
SCIP_Real SCIPhistoryGetAvgGMIeff(SCIP_HISTORY *history)
Definition: history.c:749
SCIP_Real SCIPhistoryGetInferenceSum(SCIP_HISTORY *history, SCIP_BRANCHDIR dir)
Definition: history.c:652
void SCIPhistoryIncGMIeffSum(SCIP_HISTORY *history, SCIP_Real gmieff)
Definition: history.c:759
internal methods for branching and inference history
SCIP_Longint SCIPcliquetableGetNEntries(SCIP_CLIQUETABLE *cliquetable)
Definition: implics.c:3536
methods for implications, variable bounds, and cliques
memory allocation routines
#define BMSclearMemoryArray(ptr, num)
Definition: memory.h:130
void SCIPmessageFPrintInfo(SCIP_MESSAGEHDLR *messagehdlr, FILE *file, const char *formatstr,...)
Definition: message.c:618
int SCIPpricestoreGetNVars(SCIP_PRICESTORE *pricestore)
Definition: pricestore.c:609
int SCIPpricestoreGetNVarsApplied(SCIP_PRICESTORE *pricestore)
Definition: pricestore.c:671
SCIP_Real SCIPpricestoreGetProbPricingTime(SCIP_PRICESTORE *pricestore)
Definition: pricestore.c:631
int SCIPpricestoreGetNVarsFound(SCIP_PRICESTORE *pricestore)
Definition: pricestore.c:661
int SCIPpricestoreGetNProbvarsFound(SCIP_PRICESTORE *pricestore)
Definition: pricestore.c:651
int SCIPpricestoreGetNProbPricings(SCIP_PRICESTORE *pricestore)
Definition: pricestore.c:641
internal methods for storing priced variables
SCIP_Bool SCIPprimalUpperboundIsSol(SCIP_PRIMAL *primal, SCIP_SET *set, SCIP_PROB *transprob, SCIP_PROB *origprob)
Definition: primal.c:561
SCIP_RETCODE SCIPprimalSetCutoffbound(SCIP_PRIMAL *primal, BMS_BLKMEM *blkmem, SCIP_SET *set, SCIP_STAT *stat, SCIP_EVENTFILTER *eventfilter, SCIP_EVENTQUEUE *eventqueue, SCIP_PROB *transprob, SCIP_PROB *origprob, SCIP_TREE *tree, SCIP_REOPT *reopt, SCIP_LP *lp, SCIP_Real cutoffbound, SCIP_Bool useforobjlimit)
Definition: primal.c:290
internal methods for collecting primal CIP solutions and primal informations
void SCIPprobPrintStatistics(SCIP_PROB *prob, SCIP_SET *set, SCIP_MESSAGEHDLR *messagehdlr, FILE *file)
Definition: prob.c:2261
SCIP_Real SCIPprobExternObjval(SCIP_PROB *transprob, SCIP_PROB *origprob, SCIP_SET *set, SCIP_Real objval)
Definition: prob.c:2157
SCIP_Real SCIPprobInternObjval(SCIP_PROB *transprob, SCIP_PROB *origprob, SCIP_SET *set, SCIP_Real objval)
Definition: prob.c:2179
internal methods for storing and manipulating the main problem
public methods for Benders' decomposition
public methods for Benders' decomposition cuts
public methods for branching rules
public methods for tree compressions
public methods for managing constraints
public methods for storing cuts in a cut pool
public methods for cut selectors
public functions to work with algebraic expressions
public methods for primal heuristics
public methods for branching and inference history structure
public methods for message output
#define SCIPerrorMessage
Definition: pub_message.h:64
public data structures and miscellaneous methods
methods for sorting joint arrays of various types
public methods for NLP solver interfaces
public methods for presolvers
public methods for variable pricers
public methods for propagators
public methods for input file readers
public methods for relaxation handlers
public methods for reoptimization
int SCIPreoptGetNTotalPrunedNodes(SCIP_REOPT *reopt)
Definition: reopt.c:4993
int SCIPreoptGetNTotalFeasNodes(SCIP_REOPT *reopt)
Definition: reopt.c:4973
int SCIPreoptGetFirstRestarts(SCIP_REOPT *reopt)
Definition: reopt.c:4943
int SCIPreoptGetNTotalRestartsLocal(SCIP_REOPT *reopt)
Definition: reopt.c:4933
int SCIPreoptGetLastRestarts(SCIP_REOPT *reopt)
Definition: reopt.c:4953
int SCIPreoptGetNTotalCutoffReoptnodes(SCIP_REOPT *reopt)
Definition: reopt.c:5013
int SCIPreoptGetNTotalInfNodes(SCIP_REOPT *reopt)
Definition: reopt.c:5033
int SCIPreoptGetNRestartsGlobal(SCIP_REOPT *reopt)
Definition: reopt.c:4913
public methods for separators
public methods for primal CIP solutions
public methods for displaying statistic tables
public methods for problem variables
SCIP_RETCODE SCIPreaderWrite(SCIP_READER *reader, SCIP_PROB *prob, SCIP_SET *set, FILE *file, const char *extension, SCIP_Bool genericnames, SCIP_RESULT *result)
Definition: reader.c:270
internal methods for input file readers
SCIP_Real SCIPreoptGetSavingtime(SCIP_REOPT *reopt)
Definition: reopt.c:7598
data structures and methods for collecting reoptimization information
public methods for Benders decomposition
general public methods
public methods for memory management
public methods for message handling
public methods for nonlinear relaxation
public methods for numerical tolerances
public methods for solutions
static SCIP_RETCODE printProblem(SCIP *scip, SCIP_PROB *prob, FILE *file, const char *extension, SCIP_Bool genericnames)
static SCIP_DECL_SORTPTRCOMP(tablePosComp)
public methods for querying solving statistics
public methods for statistics table plugins
public methods for timing
public methods for SCIP variables
int SCIPsepastoreGetNCutsFoundRound(SCIP_SEPASTORE *sepastore)
Definition: sepastore.c:1190
int SCIPsepastoreGetNCutsApplied(SCIP_SEPASTORE *sepastore)
Definition: sepastore.c:1200
int SCIPsepastoreGetNCutsAdded(SCIP_SEPASTORE *sepastore)
Definition: sepastore.c:1160
internal methods for storing separated cuts
void SCIPsetSortCutsels(SCIP_SET *set)
Definition: set.c:4344
void SCIPsetSortBranchrulesName(SCIP_SET *set)
Definition: set.c:4920
void SCIPsetSortPresolsName(SCIP_SET *set)
Definition: set.c:4137
void SCIPsetSortRelaxsName(SCIP_SET *set)
Definition: set.c:4211
void SCIPsetSortPropsName(SCIP_SET *set)
Definition: set.c:4435
SCIP_Real SCIPsetEpsilon(SCIP_SET *set)
Definition: set.c:6086
void SCIPsetSortComprsName(SCIP_SET *set)
Definition: set.c:4714
void SCIPsetSortPricersName(SCIP_SET *set)
Definition: set.c:3758
SCIP_Real SCIPsetInfinity(SCIP_SET *set)
Definition: set.c:6064
SCIP_Bool SCIPsetIsInfinity(SCIP_SET *set, SCIP_Real val)
Definition: set.c:6199
void SCIPsetSortHeursName(SCIP_SET *set)
Definition: set.c:4640
void SCIPsetSortSepasName(SCIP_SET *set)
Definition: set.c:4285
internal methods for global SCIP settings
SCIP_Real SCIPsolGetObj(SCIP_SOL *sol, SCIP_SET *set, SCIP_PROB *transprob, SCIP_PROB *origprob)
Definition: sol.c:1571
internal methods for storing primal CIP solutions
void SCIPstatUpdatePrimalDualIntegrals(SCIP_STAT *stat, SCIP_SET *set, SCIP_PROB *transprob, SCIP_PROB *origprob, SCIP_Real upperbound, SCIP_Real lowerbound)
Definition: stat.c:459
SCIP_Real SCIPstatGetPrimalReferenceIntegral(SCIP_STAT *stat, SCIP_SET *set, SCIP_PROB *transprob, SCIP_PROB *origprob, SCIP_Bool update)
Definition: stat.c:573
SCIP_Real SCIPstatGetDualReferenceIntegral(SCIP_STAT *stat, SCIP_SET *set, SCIP_PROB *transprob, SCIP_PROB *origprob, SCIP_Bool update)
Definition: stat.c:552
SCIP_Real SCIPstatGetPrimalDualIntegral(SCIP_STAT *stat, SCIP_SET *set, SCIP_PROB *transprob, SCIP_PROB *origprob, SCIP_Bool update)
Definition: stat.c:594
internal methods for problem statistics
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.
datastructures for global SCIP settings
datastructures for problem statistics
Definition: heur_padm.c:135
int SCIPsyncstoreGetWinner(SCIP_SYNCSTORE *syncstore)
Definition: syncstore.c:531
SCIP_Bool SCIPsyncstoreIsInitialized(SCIP_SYNCSTORE *syncstore)
Definition: syncstore.c:795
the function declarations for the synchronization store
SCIP_RETCODE SCIPtableOutput(SCIP_TABLE *table, SCIP_SET *set, FILE *file)
Definition: table.c:272
internal methods for displaying statistics tables
SCIP_Real SCIPtreeGetAvgLowerbound(SCIP_TREE *tree, SCIP_Real cutoffbound)
Definition: tree.c:7418
SCIP_Real SCIPtreeGetLowerbound(SCIP_TREE *tree, SCIP_SET *set)
Definition: tree.c:7328
int SCIPtreeGetNNodes(SCIP_TREE *tree)
Definition: tree.c:8362
internal methods for branch and bound tree
enum SCIP_DiveContext SCIP_DIVECONTEXT
Definition: type_heur.h:73
@ SCIP_DIVECONTEXT_SINGLE
Definition: type_heur.h:69
@ SCIP_DIVECONTEXT_ADAPTIVE
Definition: type_heur.h:70
@ SCIP_DIVECONTEXT_SCHEDULER
Definition: type_heur.h:71
@ SCIP_BRANCHDIR_DOWNWARDS
Definition: type_history.h:43
@ SCIP_BRANCHDIR_UPWARDS
Definition: type_history.h:44
enum SCIP_BranchDir SCIP_BRANCHDIR
Definition: type_history.h:48
enum SCIP_VerbLevel SCIP_VERBLEVEL
Definition: type_message.h:59
enum SCIP_NlpSolStat SCIP_NLPSOLSTAT
Definition: type_nlpi.h:168
@ SCIP_NLPTERMSTAT_OKAY
Definition: type_nlpi.h:173
@ SCIP_NLPTERMSTAT_OTHER
Definition: type_nlpi.h:182
@ SCIP_NLPSOLSTAT_GLOBOPT
Definition: type_nlpi.h:160
@ SCIP_NLPSOLSTAT_UNKNOWN
Definition: type_nlpi.h:166
enum SCIP_NlpTermStat SCIP_NLPTERMSTAT
Definition: type_nlpi.h:194
@ SCIP_DIDNOTRUN
Definition: type_result.h:42
@ SCIP_SUCCESS
Definition: type_result.h:58
enum SCIP_Result SCIP_RESULT
Definition: type_result.h:61
@ SCIP_READERROR
Definition: type_retcode.h:45
@ SCIP_PLUGINNOTFOUND
Definition: type_retcode.h:54
@ SCIP_WRITEERROR
Definition: type_retcode.h:46
@ 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_STAGE_PROBLEM
Definition: type_set.h:45
@ SCIP_STAGE_INITPRESOLVE
Definition: type_set.h:48
@ SCIP_STAGE_SOLVED
Definition: type_set.h:54
@ SCIP_STAGE_PRESOLVING
Definition: type_set.h:49
@ SCIP_STAGE_TRANSFORMED
Definition: type_set.h:47
@ SCIP_STAGE_INITSOLVE
Definition: type_set.h:52
@ SCIP_STAGE_EXITPRESOLVE
Definition: type_set.h:50
@ SCIP_STAGE_INIT
Definition: type_set.h:44
@ SCIP_STAGE_SOLVING
Definition: type_set.h:53
@ SCIP_STAGE_PRESOLVED
Definition: type_set.h:51
@ SCIP_STATUS_UNBOUNDED
Definition: type_stat.h:63
@ SCIP_STATUS_INFORUNBD
Definition: type_stat.h:64
@ SCIP_STATUS_INFEASIBLE
Definition: type_stat.h:62
@ SCIP_LOCKTYPE_MODEL
Definition: type_var.h:97
SCIP_Real SCIPvarGetPseudocost(SCIP_VAR *var, SCIP_STAT *stat, SCIP_Real solvaldelta)
Definition: var.c:14497
SCIP_Real SCIPvarGetPseudocostCount(SCIP_VAR *var, SCIP_BRANCHDIR dir)
Definition: var.c:14593
SCIP_Real SCIPvarGetPseudocostVariance(SCIP_VAR *var, SCIP_BRANCHDIR dir, SCIP_Bool onlycurrentrun)
Definition: var.c:14712
SCIP_Real SCIPvarGetAvgCutoffs(SCIP_VAR *var, SCIP_STAT *stat, SCIP_BRANCHDIR dir)
Definition: var.c:16285
SCIP_Real SCIPvarGetAvgInferences(SCIP_VAR *var, SCIP_STAT *stat, SCIP_BRANCHDIR dir)
Definition: var.c:16087
internal methods for problem variables