Scippy

SCIP

Solving Constraint Integer Programs

disp_default.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-2014 Konrad-Zuse-Zentrum */
7 /* fuer Informationstechnik Berlin */
8 /* */
9 /* SCIP is distributed under the terms of the ZIB Academic License. */
10 /* */
11 /* You should have received a copy of the ZIB Academic License */
12 /* along with SCIP; see the file COPYING. If not email to scip@zib.de. */
13 /* */
14 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
15 
16 /**@file disp_default.c
17  * @brief default display columns
18  * @author Tobias Achterberg
19  */
20 
21 /*---+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8----+----9----+----0----+----1----+----2*/
22 
23 #include <assert.h>
24 #include <string.h>
25 
26 #include "scip/disp_default.h"
27 
28 
29 #define DISP_NAME_SOLFOUND "solfound"
30 #define DISP_DESC_SOLFOUND "letter that indicates the heuristic, that found the solution"
31 #define DISP_HEAD_SOLFOUND " "
32 #define DISP_WIDT_SOLFOUND 1
33 #define DISP_PRIO_SOLFOUND 80000
34 #define DISP_POSI_SOLFOUND 0
35 #define DISP_STRI_SOLFOUND FALSE
36 
37 #define DISP_NAME_TIME "time"
38 #define DISP_DESC_TIME "total solution time"
39 #define DISP_HEAD_TIME "time"
40 #define DISP_WIDT_TIME 5
41 #define DISP_PRIO_TIME 4000
42 #define DISP_POSI_TIME 50
43 #define DISP_STRI_TIME TRUE
44 
45 #define DISP_NAME_NNODES "nnodes"
46 #define DISP_DESC_NNODES "number of processed nodes"
47 #define DISP_HEAD_NNODES "node"
48 #define DISP_WIDT_NNODES 7
49 #define DISP_PRIO_NNODES 100000
50 #define DISP_POSI_NNODES 100
51 #define DISP_STRI_NNODES TRUE
52 
53 #define DISP_NAME_NODESLEFT "nodesleft"
54 #define DISP_DESC_NODESLEFT "number of unprocessed nodes"
55 #define DISP_HEAD_NODESLEFT "left"
56 #define DISP_WIDT_NODESLEFT 7
57 #define DISP_PRIO_NODESLEFT 90000
58 #define DISP_POSI_NODESLEFT 200
59 #define DISP_STRI_NODESLEFT TRUE
60 
61 #define DISP_NAME_LPITERATIONS "lpiterations"
62 #define DISP_DESC_LPITERATIONS "number of simplex iterations"
63 #define DISP_HEAD_LPITERATIONS "LP iter"
64 #define DISP_WIDT_LPITERATIONS 7
65 #define DISP_PRIO_LPITERATIONS 30000
66 #define DISP_POSI_LPITERATIONS 1000
67 #define DISP_STRI_LPITERATIONS TRUE
68 
69 #define DISP_NAME_LPAVGITERS "lpavgiterations"
70 #define DISP_DESC_LPAVGITERS "average number of LP iterations since the last output line"
71 #define DISP_HEAD_LPAVGITERS "LP it/n"
72 #define DISP_WIDT_LPAVGITERS 7
73 #define DISP_PRIO_LPAVGITERS 25000
74 #define DISP_POSI_LPAVGITERS 1400
75 #define DISP_STRI_LPAVGITERS TRUE
76 
77 #define DISP_NAME_LPCOND "lpcond"
78 #define DISP_DESC_LPCOND "estimate on condition number of LP solution"
79 #define DISP_HEAD_LPCOND "LP cond"
80 #define DISP_WIDT_LPCOND 7
81 #define DISP_PRIO_LPCOND 0
82 #define DISP_POSI_LPCOND 1450
83 #define DISP_STRI_LPCOND TRUE
84 
85 #define DISP_NAME_MEMUSED "memused"
86 #define DISP_DESC_MEMUSED "total number of bytes used in block memory"
87 #define DISP_HEAD_MEMUSED "mem"
88 #define DISP_WIDT_MEMUSED 5
89 #define DISP_PRIO_MEMUSED 20000
90 #define DISP_POSI_MEMUSED 1500
91 #define DISP_STRI_MEMUSED TRUE
92 
93 #define DISP_NAME_DEPTH "depth"
94 #define DISP_DESC_DEPTH "depth of current node"
95 #define DISP_HEAD_DEPTH "depth"
96 #define DISP_WIDT_DEPTH 5
97 #define DISP_PRIO_DEPTH 500
98 #define DISP_POSI_DEPTH 2000
99 #define DISP_STRI_DEPTH TRUE
100 
101 #define DISP_NAME_MAXDEPTH "maxdepth"
102 #define DISP_DESC_MAXDEPTH "maximal depth of all processed nodes"
103 #define DISP_HEAD_MAXDEPTH "mdpt"
104 #define DISP_WIDT_MAXDEPTH 5
105 #define DISP_PRIO_MAXDEPTH 5000
106 #define DISP_POSI_MAXDEPTH 2100
107 #define DISP_STRI_MAXDEPTH TRUE
108 
109 #define DISP_NAME_PLUNGEDEPTH "plungedepth"
110 #define DISP_DESC_PLUNGEDEPTH "current plunging depth"
111 #define DISP_HEAD_PLUNGEDEPTH "pdpt"
112 #define DISP_WIDT_PLUNGEDEPTH 5
113 #define DISP_PRIO_PLUNGEDEPTH 10
114 #define DISP_POSI_PLUNGEDEPTH 2200
115 #define DISP_STRI_PLUNGEDEPTH TRUE
116 
117 #define DISP_NAME_NFRAC "nfrac"
118 #define DISP_DESC_NFRAC "number of fractional variables in the current solution"
119 #define DISP_HEAD_NFRAC "frac"
120 #define DISP_WIDT_NFRAC 5
121 #define DISP_PRIO_NFRAC 700
122 #define DISP_POSI_NFRAC 2500
123 #define DISP_STRI_NFRAC TRUE
124 
125 #define DISP_NAME_NEXTERNCANDS "nexternbranchcands"
126 #define DISP_DESC_NEXTERNCANDS "number of extern branching variables in the current node"
127 #define DISP_HEAD_NEXTERNCANDS "extbr"
128 #define DISP_WIDT_NEXTERNCANDS 5
129 #define DISP_PRIO_NEXTERNCANDS 650
130 #define DISP_POSI_NEXTERNCANDS 2600
131 #define DISP_STRI_NEXTERNCANDS TRUE
132 
133 #define DISP_NAME_VARS "vars"
134 #define DISP_DESC_VARS "number of variables in the problem"
135 #define DISP_HEAD_VARS "vars"
136 #define DISP_WIDT_VARS 5
137 #define DISP_PRIO_VARS 3000
138 #define DISP_POSI_VARS 3000
139 #define DISP_STRI_VARS TRUE
140 
141 #define DISP_NAME_CONSS "conss"
142 #define DISP_DESC_CONSS "number of globally valid constraints in the problem"
143 #define DISP_HEAD_CONSS "cons"
144 #define DISP_WIDT_CONSS 5
145 #define DISP_PRIO_CONSS 3100
146 #define DISP_POSI_CONSS 3100
147 #define DISP_STRI_CONSS TRUE
148 
149 #define DISP_NAME_CURCONSS "curconss"
150 #define DISP_DESC_CURCONSS "number of enabled constraints in current node"
151 #define DISP_HEAD_CURCONSS "ccons"
152 #define DISP_WIDT_CURCONSS 5
153 #define DISP_PRIO_CURCONSS 600
154 #define DISP_POSI_CURCONSS 3200
155 #define DISP_STRI_CURCONSS TRUE
156 
157 #define DISP_NAME_CURCOLS "curcols"
158 #define DISP_DESC_CURCOLS "number of LP columns in current node"
159 #define DISP_HEAD_CURCOLS "cols"
160 #define DISP_WIDT_CURCOLS 5
161 #define DISP_PRIO_CURCOLS 800
162 #define DISP_POSI_CURCOLS 3300
163 #define DISP_STRI_CURCOLS TRUE
164 
165 #define DISP_NAME_CURROWS "currows"
166 #define DISP_DESC_CURROWS "number of LP rows in current node"
167 #define DISP_HEAD_CURROWS "rows"
168 #define DISP_WIDT_CURROWS 5
169 #define DISP_PRIO_CURROWS 900
170 #define DISP_POSI_CURROWS 3400
171 #define DISP_STRI_CURROWS TRUE
172 
173 #define DISP_NAME_CUTS "cuts"
174 #define DISP_DESC_CUTS "total number of cuts applied to the LPs"
175 #define DISP_HEAD_CUTS "cuts"
176 #define DISP_WIDT_CUTS 5
177 #define DISP_PRIO_CUTS 2100
178 #define DISP_POSI_CUTS 3500
179 #define DISP_STRI_CUTS TRUE
180 
181 #define DISP_NAME_SEPAROUNDS "separounds"
182 #define DISP_DESC_SEPAROUNDS "number of separation rounds performed at the current node"
183 #define DISP_HEAD_SEPAROUNDS "sepa"
184 #define DISP_WIDT_SEPAROUNDS 4
185 #define DISP_PRIO_SEPAROUNDS 100
186 #define DISP_POSI_SEPAROUNDS 3600
187 #define DISP_STRI_SEPAROUNDS TRUE
188 
189 #define DISP_NAME_POOLSIZE "poolsize"
190 #define DISP_DESC_POOLSIZE "number of LP rows in the cut pool"
191 #define DISP_HEAD_POOLSIZE "pool"
192 #define DISP_WIDT_POOLSIZE 5
193 #define DISP_PRIO_POOLSIZE 50
194 #define DISP_POSI_POOLSIZE 3700
195 #define DISP_STRI_POOLSIZE TRUE
196 
197 #define DISP_NAME_CONFLICTS "conflicts"
198 #define DISP_DESC_CONFLICTS "total number of conflicts found in conflict analysis"
199 #define DISP_HEAD_CONFLICTS "confs"
200 #define DISP_WIDT_CONFLICTS 5
201 #define DISP_PRIO_CONFLICTS 2000
202 #define DISP_POSI_CONFLICTS 4000
203 #define DISP_STRI_CONFLICTS TRUE
204 
205 #define DISP_NAME_STRONGBRANCHS "strongbranchs"
206 #define DISP_DESC_STRONGBRANCHS "total number of strong branching calls"
207 #define DISP_HEAD_STRONGBRANCHS "strbr"
208 #define DISP_WIDT_STRONGBRANCHS 5
209 #define DISP_PRIO_STRONGBRANCHS 1000
210 #define DISP_POSI_STRONGBRANCHS 5000
211 #define DISP_STRI_STRONGBRANCHS TRUE
212 
213 #define DISP_NAME_PSEUDOOBJ "pseudoobj"
214 #define DISP_DESC_PSEUDOOBJ "current pseudo objective value"
215 #define DISP_HEAD_PSEUDOOBJ "pseudoobj"
216 #define DISP_WIDT_PSEUDOOBJ 14
217 #define DISP_PRIO_PSEUDOOBJ 300
218 #define DISP_POSI_PSEUDOOBJ 6000
219 #define DISP_STRI_PSEUDOOBJ TRUE
220 
221 #define DISP_NAME_LPOBJ "lpobj"
222 #define DISP_DESC_LPOBJ "current LP objective value"
223 #define DISP_HEAD_LPOBJ "lpobj"
224 #define DISP_WIDT_LPOBJ 14
225 #define DISP_PRIO_LPOBJ 300
226 #define DISP_POSI_LPOBJ 6500
227 #define DISP_STRI_LPOBJ TRUE
228 
229 #define DISP_NAME_CURDUALBOUND "curdualbound"
230 #define DISP_DESC_CURDUALBOUND "dual bound of current node"
231 #define DISP_HEAD_CURDUALBOUND "curdualbound"
232 #define DISP_WIDT_CURDUALBOUND 14
233 #define DISP_PRIO_CURDUALBOUND 400
234 #define DISP_POSI_CURDUALBOUND 7000
235 #define DISP_STRI_CURDUALBOUND TRUE
236 
237 #define DISP_NAME_ESTIMATE "estimate"
238 #define DISP_DESC_ESTIMATE "estimated value of feasible solution in current node"
239 #define DISP_HEAD_ESTIMATE "estimate"
240 #define DISP_WIDT_ESTIMATE 14
241 #define DISP_PRIO_ESTIMATE 200
242 #define DISP_POSI_ESTIMATE 7500
243 #define DISP_STRI_ESTIMATE TRUE
244 
245 #define DISP_NAME_AVGDUALBOUND "avgdualbound"
246 #define DISP_DESC_AVGDUALBOUND "average dual bound of all unprocessed nodes"
247 #define DISP_HEAD_AVGDUALBOUND "avgdualbound"
248 #define DISP_WIDT_AVGDUALBOUND 14
249 #define DISP_PRIO_AVGDUALBOUND 40
250 #define DISP_POSI_AVGDUALBOUND 8000
251 #define DISP_STRI_AVGDUALBOUND TRUE
252 
253 #define DISP_NAME_DUALBOUND "dualbound"
254 #define DISP_DESC_DUALBOUND "current global dual bound"
255 #define DISP_HEAD_DUALBOUND "dualbound"
256 #define DISP_WIDT_DUALBOUND 14
257 #define DISP_PRIO_DUALBOUND 70000
258 #define DISP_POSI_DUALBOUND 9000
259 #define DISP_STRI_DUALBOUND TRUE
260 
261 #define DISP_NAME_PRIMALBOUND "primalbound"
262 #define DISP_DESC_PRIMALBOUND "current primal bound"
263 #define DISP_HEAD_PRIMALBOUND "primalbound"
264 #define DISP_WIDT_PRIMALBOUND 14
265 #define DISP_PRIO_PRIMALBOUND 80000
266 #define DISP_POSI_PRIMALBOUND 10000
267 #define DISP_STRI_PRIMALBOUND TRUE
268 
269 #define DISP_NAME_CUTOFFBOUND "cutoffbound"
270 #define DISP_DESC_CUTOFFBOUND "current cutoff bound"
271 #define DISP_HEAD_CUTOFFBOUND "cutoffbound"
272 #define DISP_WIDT_CUTOFFBOUND 14
273 #define DISP_PRIO_CUTOFFBOUND 10
274 #define DISP_POSI_CUTOFFBOUND 10100
275 #define DISP_STRI_CUTOFFBOUND TRUE
276 
277 #define DISP_NAME_GAP "gap"
278 #define DISP_DESC_GAP "current (relative) gap using |primal-dual|/MIN(|dual|,|primal|)"
279 #define DISP_HEAD_GAP "gap"
280 #define DISP_WIDT_GAP 8
281 #define DISP_PRIO_GAP 60000
282 #define DISP_POSI_GAP 20000
283 #define DISP_STRI_GAP TRUE
284 
285 #define DISP_NAME_PRIMALGAP "primalgap"
286 #define DISP_DESC_PRIMALGAP "current (relative) gap using |primal-dual|/|primal|"
287 #define DISP_HEAD_PRIMALGAP "primgap"
288 #define DISP_WIDT_PRIMALGAP 8
289 #define DISP_PRIO_PRIMALGAP 20000
290 #define DISP_POSI_PRIMALGAP 21000
291 #define DISP_STRI_PRIMALGAP TRUE
292 
293 #define DISP_NAME_NSOLS "nsols"
294 #define DISP_DESC_NSOLS "current number of solutions found"
295 #define DISP_HEAD_NSOLS "nsols"
296 #define DISP_WIDT_NSOLS 5
297 #define DISP_PRIO_NSOLS 0
298 #define DISP_POSI_NSOLS 30000
299 #define DISP_STRI_NSOLS TRUE
300 
301 
302 /*
303  * Callback methods
304  */
305 
306 /** copy method for display plugins (called when SCIP copies plugins) */
307 static
308 SCIP_DECL_DISPCOPY(dispCopyDefault)
309 { /*lint --e{715}*/
310  assert(scip != NULL);
311  assert(disp != NULL);
312 
313  /* call inclusion method of dialog */
315 
316  return SCIP_OKAY;
317 }
318 
319 /** solving process initialization method of display column (called when branch and bound process is about to begin) */
320 static
321 SCIP_DECL_DISPINITSOL(SCIPdispInitsolSolFound)
322 { /*lint --e{715}*/
323 
324  assert(disp != NULL);
325  assert(strcmp(SCIPdispGetName(disp), DISP_NAME_SOLFOUND) == 0);
326  assert(scip != NULL);
327 
329 
330  return SCIP_OKAY;
331 }
332 
333 /** output method of display column to output file stream 'file' for character of best solution */
334 static
335 SCIP_DECL_DISPOUTPUT(SCIPdispOutputSolFound)
336 { /*lint --e{715}*/
337  SCIP_SOL* sol;
338  SCIP_DISPDATA* dispdata;
339 
340  assert(disp != NULL);
341  assert(strcmp(SCIPdispGetName(disp), DISP_NAME_SOLFOUND) == 0);
342  assert(scip != NULL);
343 
344  sol = SCIPgetBestSol(scip);
345  if( sol == NULL )
346  SCIPdispSetData(disp, NULL);
347 
348  dispdata = SCIPdispGetData(disp);
349  if( sol != (SCIP_SOL*)dispdata && SCIPisFeasLE(scip, SCIPgetSolTransObj(scip, sol), SCIPgetUpperbound(scip)) )
350  {
351  SCIP_HEUR* heur;
352  char c;
353 
354  heur = SCIPgetSolHeur(scip, sol);
355 
356  if( heur == NULL )
357  {
358  if( SCIPsolIsOriginal(sol) )
359  c = '#';
360  else
361  c = '*';
362  }
363  else
364  c = SCIPheurGetDispchar(heur);
365 
366  SCIPinfoMessage(scip, file, "%c", c);
367 
368  SCIPdispSetData(disp, (SCIP_DISPDATA*)sol);
369  }
370  else
371  SCIPinfoMessage(scip, file, " ");
372 
373  return SCIP_OKAY;
374 }
375 
376 /** output method of display column to output file stream 'file' for solving time */
377 static
378 SCIP_DECL_DISPOUTPUT(SCIPdispOutputSolvingTime)
379 { /*lint --e{715}*/
380  assert(disp != NULL);
381  assert(strcmp(SCIPdispGetName(disp), DISP_NAME_TIME) == 0);
382  assert(scip != NULL);
383 
385 
386  return SCIP_OKAY;
387 }
388 
389 /** output method of display column to output file stream 'file' for number of nodes */
390 static
391 SCIP_DECL_DISPOUTPUT(SCIPdispOutputNNodes)
392 { /*lint --e{715}*/
393  assert(disp != NULL);
394  assert(strcmp(SCIPdispGetName(disp), DISP_NAME_NNODES) == 0);
395  assert(scip != NULL);
396 
398 
399  return SCIP_OKAY;
400 }
401 
402 /** output method of display column to output file stream 'file' for number of open nodes */
403 static
404 SCIP_DECL_DISPOUTPUT(SCIPdispOutputNNodesLeft)
405 { /*lint --e{715}*/
406  assert(disp != NULL);
407  assert(strcmp(SCIPdispGetName(disp), DISP_NAME_NODESLEFT) == 0);
408  assert(scip != NULL);
409 
411 
412  return SCIP_OKAY;
413 }
414 
415 /** output method of display column to output file stream 'file' for number of LP iterations */
416 static
417 SCIP_DECL_DISPOUTPUT(SCIPdispOutputNLPIterations)
418 { /*lint --e{715}*/
419  assert(disp != NULL);
420  assert(strcmp(SCIPdispGetName(disp), DISP_NAME_LPITERATIONS) == 0);
421  assert(scip != NULL);
422 
424 
425  return SCIP_OKAY;
426 }
427 
428 /** output method of display column to output file stream 'file' for number of average LP iterations */
429 static
430 SCIP_DECL_DISPOUTPUT(SCIPdispOutputNLPAvgIters)
431 { /*lint --e{715}*/
432  assert(disp != NULL);
433  assert(strcmp(SCIPdispGetName(disp), DISP_NAME_LPAVGITERS) == 0);
434  assert(scip != NULL);
435 
436  /**@todo Currently we are using the total number of nodes to compute the average LP iterations number. The reason for
437  * that is, that for the LP iterations only the total number (over all runs) are stored in the statistics. It
438  * would be nicer if the statistic also stores the number of LP iterations for the current run similar to the
439  * nodes.
440  */
441 
442  if( SCIPgetNNodes(scip) < 2 )
443  SCIPinfoMessage(scip, file, " - ");
444  else
445  SCIPinfoMessage(scip, file, "%6.1f ",
447 
448  return SCIP_OKAY;
449 }
450 
451 
452 /** output method of display column to output file stream 'file' for estimate on LP condition */
453 static
454 SCIP_DECL_DISPOUTPUT(SCIPdispOutputLPCondition)
455 { /*lint --e{715}*/
456  SCIP_LPI* lpi;
457  SCIP_Real cond;
458 
459  assert(disp != NULL);
460  assert(strcmp(SCIPdispGetName(disp), DISP_NAME_LPCOND) == 0);
461  assert(scip != NULL);
462 
463  /* note that after diving mode, the LPI may only have the basis information, but SCIPlpiWasSolved() can be false; in
464  * this case, we will (depending on the LP solver) probably not obtain the quality measure; one solution would be to
465  * store the results of SCIPlpiGetRealSolQuality() within the SCIP_LP after each LP solve; this would have the added
466  * advantage, that we reduce direct access to the LPI, but it sounds potentially expensive
467  */
468  SCIP_CALL( SCIPgetLPI(scip, &lpi) );
469  if( lpi == NULL )
470  {
471  SCIPinfoMessage(scip, file, " - ");
472  return SCIP_OKAY;
473  }
474 
476 
477  if( cond == SCIP_INVALID ) /*lint !e777*/
478  SCIPinfoMessage(scip, file, " n/a ", cond);
479  else
480  SCIPinfoMessage(scip, file, "%.1e", cond);
481 
482  return SCIP_OKAY;
483 }
484 
485 /** output method of display column to output file stream 'file' for depth */
486 static
487 SCIP_DECL_DISPOUTPUT(SCIPdispOutputDepth)
488 { /*lint --e{715}*/
489  assert(disp != NULL);
490  assert(strcmp(SCIPdispGetName(disp), DISP_NAME_DEPTH) == 0);
491  assert(scip != NULL);
492 
494 
495  return SCIP_OKAY;
496 }
497 
498 /** output method of display column to output file stream 'file' for used memory */
499 static
500 SCIP_DECL_DISPOUTPUT(SCIPdispOutputMemUsed)
501 { /*lint --e{715}*/
502  assert(disp != NULL);
503  assert(strcmp(SCIPdispGetName(disp), DISP_NAME_MEMUSED) == 0);
504  assert(scip != NULL);
505 
507 
508  return SCIP_OKAY;
509 }
510 
511 /** output method of display column to output file stream 'file' for maximal depth */
512 static
513 SCIP_DECL_DISPOUTPUT(SCIPdispOutputMaxDepth)
514 { /*lint --e{715}*/
515  assert(disp != NULL);
516  assert(strcmp(SCIPdispGetName(disp), DISP_NAME_MAXDEPTH) == 0);
517  assert(scip != NULL);
518 
520 
521  return SCIP_OKAY;
522 }
523 
524 /** output method of display column to output file stream 'file' for plunging depth */
525 static
526 SCIP_DECL_DISPOUTPUT(SCIPdispOutputPlungeDepth)
527 { /*lint --e{715}*/
528  assert(disp != NULL);
529  assert(strcmp(SCIPdispGetName(disp), DISP_NAME_PLUNGEDEPTH) == 0);
530  assert(scip != NULL);
531 
533 
534  return SCIP_OKAY;
535 }
536 
537 /** output method of display column to output file stream 'file' for number of LP branch candidates */
538 static
539 SCIP_DECL_DISPOUTPUT(SCIPdispOutputNFrac)
540 { /*lint --e{715}*/
541  assert(disp != NULL);
542  assert(strcmp(SCIPdispGetName(disp), DISP_NAME_NFRAC) == 0);
543  assert(scip != NULL);
544 
547  else
548  SCIPinfoMessage(scip, file, " - ");
549 
550  return SCIP_OKAY;
551 }
552 
553 /** output method of display column to output file stream 'file' for number of external branch candidates */
554 static
555 SCIP_DECL_DISPOUTPUT(SCIPdispOutputNExternCands)
556 { /*lint --e{715}*/
557  assert(disp != NULL);
558  assert(strcmp(SCIPdispGetName(disp), DISP_NAME_NEXTERNCANDS) == 0);
559  assert(scip != NULL);
560 
562 
563  return SCIP_OKAY;
564 }
565 
566 /** output method of display column to output file stream 'file' for number of variables */
567 static
568 SCIP_DECL_DISPOUTPUT(SCIPdispOutputNVars)
569 { /*lint --e{715}*/
570  assert(disp != NULL);
571  assert(strcmp(SCIPdispGetName(disp), DISP_NAME_VARS) == 0);
572  assert(scip != NULL);
573 
575 
576  return SCIP_OKAY;
577 }
578 
579 /** output method of display column to output file stream 'file' for number of constraints */
580 static
581 SCIP_DECL_DISPOUTPUT(SCIPdispOutputNConss)
582 { /*lint --e{715}*/
583  assert(disp != NULL);
584  assert(strcmp(SCIPdispGetName(disp), DISP_NAME_CONSS) == 0);
585  assert(scip != NULL);
586 
588 
589  return SCIP_OKAY;
590 }
591 
592 /** output method of display column to output file stream 'file' for number of enabled constraints */
593 static
594 SCIP_DECL_DISPOUTPUT(SCIPdispOutputNCurConss)
595 { /*lint --e{715}*/
596  assert(disp != NULL);
597  assert(strcmp(SCIPdispGetName(disp), DISP_NAME_CURCONSS) == 0);
598  assert(scip != NULL);
599 
601 
602  return SCIP_OKAY;
603 }
604 
605 /** output method of display column to output file stream 'file' for number of columns in the LP */
606 static
607 SCIP_DECL_DISPOUTPUT(SCIPdispOutputNCurCols)
608 { /*lint --e{715}*/
609  assert(disp != NULL);
610  assert(strcmp(SCIPdispGetName(disp), DISP_NAME_CURCOLS) == 0);
611  assert(scip != NULL);
612 
614 
615  return SCIP_OKAY;
616 }
617 
618 /** output method of display column to output file stream 'file' for number of rows in the LP */
619 static
620 SCIP_DECL_DISPOUTPUT(SCIPdispOutputNCurRows)
621 { /*lint --e{715}*/
622  assert(disp != NULL);
623  assert(strcmp(SCIPdispGetName(disp), DISP_NAME_CURROWS) == 0);
624  assert(scip != NULL);
625 
627 
628  return SCIP_OKAY;
629 }
630 
631 /** output method of display column to output file stream 'file' for number of applied cuts */
632 static
633 SCIP_DECL_DISPOUTPUT(SCIPdispOutputNAppliedCuts)
634 { /*lint --e{715}*/
635  assert(disp != NULL);
636  assert(strcmp(SCIPdispGetName(disp), DISP_NAME_CUTS) == 0);
637  assert(scip != NULL);
638 
640 
641  return SCIP_OKAY;
642 }
643 
644 /** output method of display column to output file stream 'file' for number of separation rounds */
645 static
646 SCIP_DECL_DISPOUTPUT(SCIPdispOutputNSepaRounds)
647 { /*lint --e{715}*/
648  assert(disp != NULL);
649  assert(strcmp(SCIPdispGetName(disp), DISP_NAME_SEPAROUNDS) == 0);
650  assert(scip != NULL);
651 
653 
654  return SCIP_OKAY;
655 }
656 
657 /** output method of display column to output file stream 'file' for number of current rows in the cut pool */
658 static
659 SCIP_DECL_DISPOUTPUT(SCIPdispOutputCutPoolSize)
660 { /*lint --e{715}*/
661  assert(disp != NULL);
662  assert(strcmp(SCIPdispGetName(disp), DISP_NAME_POOLSIZE) == 0);
663  assert(scip != NULL);
664 
666 
667  return SCIP_OKAY;
668 }
669 
670 /** output method of display column to output file stream 'file' for number of conflicts */
671 static
672 SCIP_DECL_DISPOUTPUT(SCIPdispOutputNConflicts)
673 { /*lint --e{715}*/
674  assert(disp != NULL);
675  assert(strcmp(SCIPdispGetName(disp), DISP_NAME_CONFLICTS) == 0);
676  assert(scip != NULL);
677 
679 
680  return SCIP_OKAY;
681 }
682 
683 /** output method of display column to output file stream 'file' for number of strong branchings */
684 static
685 SCIP_DECL_DISPOUTPUT(SCIPdispOutputNStrongbranchs)
686 { /*lint --e{715}*/
687  assert(disp != NULL);
688  assert(strcmp(SCIPdispGetName(disp), DISP_NAME_STRONGBRANCHS) == 0);
689  assert(scip != NULL);
690 
692 
693  return SCIP_OKAY;
694 }
695 
696 /** output method of display column to output file stream 'file' for pseudo objective value */
697 static
698 SCIP_DECL_DISPOUTPUT(SCIPdispOutputPseudoObjval)
699 { /*lint --e{715}*/
700  SCIP_Real pseudoobj;
701 
702  assert(disp != NULL);
703  assert(strcmp(SCIPdispGetName(disp), DISP_NAME_PSEUDOOBJ) == 0);
704  assert(scip != NULL);
705 
706  pseudoobj = SCIPgetPseudoObjval(scip);
707 
708  if( SCIPisInfinity(scip, -pseudoobj) )
709  SCIPinfoMessage(scip, file, " -- ");
710  else if( SCIPisInfinity(scip, pseudoobj) )
711  SCIPinfoMessage(scip, file, " cutoff ");
712  else
713  SCIPinfoMessage(scip, file, "%13.6e ", pseudoobj);
714 
715  return SCIP_OKAY;
716 }
717 
718 /** output method of display column to output file stream 'file' for LP objective value */
719 static
720 SCIP_DECL_DISPOUTPUT(SCIPdispOutputLPObjval)
721 { /*lint --e{715}*/
722  SCIP_Real lpobj;
723 
724  assert(disp != NULL);
725  assert(strcmp(SCIPdispGetName(disp), DISP_NAME_LPOBJ) == 0);
726  assert(scip != NULL);
727 
729  SCIPinfoMessage(scip, file, " -- ");
730  else
731  {
732  lpobj = SCIPgetLPObjval(scip);
733 
734  if( SCIPisInfinity(scip, -lpobj) )
735  SCIPinfoMessage(scip, file, " -- ");
736  else if( SCIPisInfinity(scip, lpobj) )
737  SCIPinfoMessage(scip, file, " cutoff ");
738  else
739  SCIPinfoMessage(scip, file, "%13.6e ", lpobj);
740  }
741 
742  return SCIP_OKAY;
743 }
744 
745 /** output method of display column to output file stream 'file' for the current dualbound */
746 static
747 SCIP_DECL_DISPOUTPUT(SCIPdispOutputCurDualbound)
748 { /*lint --e{715}*/
749  SCIP_Real curdualbound;
750 
751  assert(disp != NULL);
752  assert(strcmp(SCIPdispGetName(disp), DISP_NAME_CURDUALBOUND) == 0);
753  assert(scip != NULL);
754 
755  curdualbound = SCIPgetLocalDualbound(scip);
756 
757  if( SCIPisInfinity(scip, (SCIP_Real) SCIPgetObjsense(scip) * curdualbound ) )
758  SCIPinfoMessage(scip, file, " cutoff ");
759  else if( SCIPisInfinity(scip, -1.0 * (SCIP_Real) SCIPgetObjsense(scip) * curdualbound ) )
760  SCIPinfoMessage(scip, file, " -- ");
761  else
762  SCIPinfoMessage(scip, file, "%13.6e ", curdualbound);
763 
764  return SCIP_OKAY;
765 }
766 
767 /** output method of display column to output file stream 'file' for estimate of best primal solution w.r.t. original
768  * problem contained in current subtree */
769 static
770 SCIP_DECL_DISPOUTPUT(SCIPdispOutputLocalOrigEstimate)
771 { /*lint --e{715}*/
772  SCIP_Real estimate;
773 
774  assert(disp != NULL);
775  assert(strcmp(SCIPdispGetName(disp), DISP_NAME_ESTIMATE) == 0);
776  assert(scip != NULL);
777 
778  estimate = SCIPgetLocalOrigEstimate(scip);
779  if( SCIPisInfinity(scip, REALABS(estimate)) )
780  SCIPinfoMessage(scip, file, " -- ");
781  else
782  SCIPinfoMessage(scip, file, "%13.6e ", estimate);
783 
784  return SCIP_OKAY;
785 }
786 
787 /** output method of display column to output file stream 'file' for average dualbound */
788 static
789 SCIP_DECL_DISPOUTPUT(SCIPdispOutputAvgDualbound)
790 { /*lint --e{715}*/
791  SCIP_Real avgdualbound;
792 
793  assert(disp != NULL);
794  assert(strcmp(SCIPdispGetName(disp), DISP_NAME_AVGDUALBOUND) == 0);
795  assert(scip != NULL);
796 
797  avgdualbound = SCIPgetAvgDualbound(scip);
798  if( SCIPisInfinity(scip, REALABS(avgdualbound)) )
799  SCIPinfoMessage(scip, file, " -- ");
800  else
801  SCIPinfoMessage(scip, file, "%13.6e ", avgdualbound);
802 
803  return SCIP_OKAY;
804 }
805 
806 /** output method of display column to output file stream 'file' for dualbound */
807 static
808 SCIP_DECL_DISPOUTPUT(SCIPdispOutputDualbound)
809 { /*lint --e{715}*/
810  SCIP_Real dualbound;
811 
812  assert(disp != NULL);
813  assert(strcmp(SCIPdispGetName(disp), DISP_NAME_DUALBOUND) == 0);
814  assert(scip != NULL);
815 
816  dualbound = SCIPgetDualbound(scip);
817 
818  if( SCIPisInfinity(scip, (SCIP_Real) SCIPgetObjsense(scip) * dualbound ) )
819  SCIPinfoMessage(scip, file, " cutoff ");
820  else if( SCIPisInfinity(scip, -1.0 * (SCIP_Real) SCIPgetObjsense(scip) * dualbound ) )
821  SCIPinfoMessage(scip, file, " -- ");
822  else
823  SCIPinfoMessage(scip, file, "%13.6e ", dualbound);
824 
825  return SCIP_OKAY;
826 }
827 
828 /** output method of display column to output file stream 'file' for primalbound */
829 static
830 SCIP_DECL_DISPOUTPUT(SCIPdispOutputPrimalbound)
831 { /*lint --e{715}*/
832  SCIP_Real primalbound;
833 
834  assert(disp != NULL);
835  assert(strcmp(SCIPdispGetName(disp), DISP_NAME_PRIMALBOUND) == 0);
836  assert(scip != NULL);
837 
838  primalbound = SCIPgetPrimalbound(scip);
839  if( SCIPisInfinity(scip, REALABS(primalbound)) )
840  SCIPinfoMessage(scip, file, " -- ");
841  else
842  SCIPinfoMessage(scip, file, "%13.6e%c", primalbound, SCIPisPrimalboundSol(scip) ? ' ' : '*');
843 
844  return SCIP_OKAY;
845 }
846 
847 /** output method of display column to output file stream 'file' for cutoffbound */
848 static
849 SCIP_DECL_DISPOUTPUT(SCIPdispOutputCutoffbound)
850 { /*lint --e{715}*/
851  SCIP_Real cutoffbound;
852 
853  assert(disp != NULL);
854  assert(strcmp(SCIPdispGetName(disp), DISP_NAME_CUTOFFBOUND) == 0);
855  assert(scip != NULL);
856 
857  cutoffbound = SCIPgetCutoffbound(scip);
858  if( SCIPisInfinity(scip, REALABS(cutoffbound)) )
859  SCIPinfoMessage(scip, file, " -- ");
860  else
861  SCIPinfoMessage(scip, file, "%13.6e ", SCIPretransformObj(scip, cutoffbound));
862 
863  return SCIP_OKAY;
864 }
865 
866 /** output method of display column to output file stream 'file' for gap */
867 static
868 SCIP_DECL_DISPOUTPUT(SCIPdispOutputGap)
869 { /*lint --e{715}*/
870  SCIP_Real gap;
871 
872  assert(disp != NULL);
873  assert(strcmp(SCIPdispGetName(disp), DISP_NAME_GAP) == 0);
874  assert(scip != NULL);
875 
876  gap = SCIPgetGap(scip);
877 
878  if( SCIPisInfinity(scip, gap) )
879  SCIPinfoMessage(scip, file, " Inf ");
880  else if( gap >= 100.00 )
881  SCIPinfoMessage(scip, file, " Large ");
882  else
883  SCIPinfoMessage(scip, file, "%7.2f%%", 100.0*gap);
884 
885  return SCIP_OKAY;
886 }
887 
888 /** output method of display column to output file stream 'file' for primalgap */
889 static
890 SCIP_DECL_DISPOUTPUT(SCIPdispOutputPrimalgap)
891 { /*lint --e{715}*/
892  SCIP_Real primalbound;
893  SCIP_Real dualbound;
894  SCIP_Real gap;
895 
896  assert(disp != NULL);
897  assert(strcmp(SCIPdispGetName(disp), DISP_NAME_PRIMALGAP) == 0);
898  assert(scip != NULL);
899 
900  if( SCIPisInfinity(scip, SCIPgetLowerbound(scip)) )
901  {
902  /* in case we could not prove whether the problem is unbounded or infeasible, we want to terminate with
903  * gap = +inf instead of gap = 0
904  */
905  if( SCIPgetStatus(scip) == SCIP_STATUS_INFORUNBD )
906  gap = SCIPinfinity(scip);
907  else
908  gap = 0.0;
909  }
910 
911  primalbound = SCIPgetPrimalbound(scip);
912  dualbound = SCIPgetDualbound(scip);
913 
914  if( SCIPisEQ(scip, primalbound, dualbound) )
915  gap = 0.0;
916  else if( SCIPisZero(scip, primalbound)
917  || SCIPisInfinity(scip, REALABS(primalbound))
918  || primalbound * dualbound < 0.0 )
919  gap = SCIPinfinity(scip);
920  else
921  gap = REALABS((primalbound - dualbound))/REALABS(primalbound + SCIPepsilon(scip));
922 
923  if( SCIPisInfinity(scip, gap) )
924  SCIPinfoMessage(scip, file, " Inf ");
925  else if( gap >= 100.00 )
926  SCIPinfoMessage(scip, file, " Large ");
927  else
928  SCIPinfoMessage(scip, file, "%7.2f%%", 100.0*gap);
929 
930  return SCIP_OKAY;
931 }
932 
933 /** output method of display column to output file stream 'file' for number of found solutions */
934 static
935 SCIP_DECL_DISPOUTPUT(SCIPdispOutputNSols)
936 { /*lint --e{715}*/
937  SCIPinfoMessage(scip, file, "%5"SCIP_LONGINT_FORMAT, SCIPgetNSolsFound(scip));
938 
939  return SCIP_OKAY;
940 }
941 
942 /*
943  * default display columns specific interface methods
944  */
945 
946 /** includes the default display columns in SCIP */
948  SCIP* scip /**< SCIP data structure */
949  )
950 {
951  SCIP_DISP* tmpdisp;
952 
953  tmpdisp = SCIPfindDisp(scip, DISP_NAME_SOLFOUND);
954  if( tmpdisp == NULL )
955  {
958  dispCopyDefault,
959  NULL, NULL, NULL, SCIPdispInitsolSolFound, NULL, SCIPdispOutputSolFound, NULL,
961  }
962  tmpdisp = SCIPfindDisp(scip, DISP_NAME_TIME);
963  if( tmpdisp == NULL )
964  {
967  dispCopyDefault,
968  NULL, NULL, NULL, NULL, NULL, SCIPdispOutputSolvingTime, NULL,
970  }
971  tmpdisp = SCIPfindDisp(scip, DISP_NAME_NNODES);
972  if( tmpdisp == NULL )
973  {
976  dispCopyDefault,
977  NULL, NULL, NULL, NULL, NULL, SCIPdispOutputNNodes, NULL,
979  }
980  tmpdisp = SCIPfindDisp(scip, DISP_NAME_NODESLEFT);
981  if( tmpdisp == NULL )
982  {
985  dispCopyDefault,
986  NULL, NULL, NULL, NULL, NULL, SCIPdispOutputNNodesLeft, NULL,
988  }
989  tmpdisp = SCIPfindDisp(scip, DISP_NAME_LPITERATIONS);
990  if( tmpdisp == NULL )
991  {
994  dispCopyDefault,
995  NULL, NULL, NULL, NULL, NULL, SCIPdispOutputNLPIterations, NULL,
997  }
998  tmpdisp = SCIPfindDisp(scip, DISP_NAME_LPAVGITERS);
999  if( tmpdisp == NULL )
1000  {
1003  dispCopyDefault,
1004  NULL, NULL, NULL, NULL, NULL, SCIPdispOutputNLPAvgIters, NULL,
1006  }
1007  tmpdisp = SCIPfindDisp(scip, DISP_NAME_LPCOND);
1008  if( tmpdisp == NULL )
1009  {
1012  dispCopyDefault,
1013  NULL, NULL, NULL, NULL, NULL, SCIPdispOutputLPCondition, NULL,
1015  }
1016  tmpdisp = SCIPfindDisp(scip, DISP_NAME_MEMUSED);
1017  if( tmpdisp == NULL )
1018  {
1021  dispCopyDefault,
1022  NULL, NULL, NULL, NULL, NULL, SCIPdispOutputMemUsed, NULL,
1024  }
1025  tmpdisp = SCIPfindDisp(scip, DISP_NAME_DEPTH);
1026  if( tmpdisp == NULL )
1027  {
1030  dispCopyDefault,
1031  NULL, NULL, NULL, NULL, NULL, SCIPdispOutputDepth, NULL,
1033  }
1034  tmpdisp = SCIPfindDisp(scip, DISP_NAME_MAXDEPTH);
1035  if( tmpdisp == NULL )
1036  {
1039  dispCopyDefault,
1040  NULL, NULL, NULL, NULL, NULL, SCIPdispOutputMaxDepth, NULL,
1042  }
1043  tmpdisp = SCIPfindDisp(scip, DISP_NAME_PLUNGEDEPTH);
1044  if( tmpdisp == NULL )
1045  {
1048  dispCopyDefault,
1049  NULL, NULL, NULL, NULL, NULL, SCIPdispOutputPlungeDepth, NULL,
1051  }
1052  tmpdisp = SCIPfindDisp(scip, DISP_NAME_NFRAC);
1053  if( tmpdisp == NULL )
1054  {
1057  dispCopyDefault,
1058  NULL, NULL, NULL, NULL, NULL, SCIPdispOutputNFrac, NULL,
1060  }
1061  tmpdisp = SCIPfindDisp(scip, DISP_NAME_NEXTERNCANDS);
1062  if( tmpdisp == NULL )
1063  {
1066  dispCopyDefault,
1067  NULL, NULL, NULL, NULL, NULL, SCIPdispOutputNExternCands, NULL,
1069  }
1070  tmpdisp = SCIPfindDisp(scip, DISP_NAME_VARS);
1071  if( tmpdisp == NULL )
1072  {
1075  dispCopyDefault,
1076  NULL, NULL, NULL, NULL, NULL, SCIPdispOutputNVars, NULL,
1078  }
1079  tmpdisp = SCIPfindDisp(scip, DISP_NAME_CONSS);
1080  if( tmpdisp == NULL )
1081  {
1084  dispCopyDefault,
1085  NULL, NULL, NULL, NULL, NULL, SCIPdispOutputNConss, NULL,
1087  }
1088  tmpdisp = SCIPfindDisp(scip, DISP_NAME_CURCONSS);
1089  if( tmpdisp == NULL )
1090  {
1093  dispCopyDefault,
1094  NULL, NULL, NULL, NULL, NULL, SCIPdispOutputNCurConss, NULL,
1096  }
1097  tmpdisp = SCIPfindDisp(scip, DISP_NAME_CURCOLS);
1098  if( tmpdisp == NULL )
1099  {
1102  dispCopyDefault,
1103  NULL, NULL, NULL, NULL, NULL, SCIPdispOutputNCurCols, NULL,
1105  }
1106  tmpdisp = SCIPfindDisp(scip, DISP_NAME_CURROWS);
1107  if( tmpdisp == NULL )
1108  {
1111  dispCopyDefault,
1112  NULL, NULL, NULL, NULL, NULL, SCIPdispOutputNCurRows, NULL,
1114  }
1115  tmpdisp = SCIPfindDisp(scip, DISP_NAME_CUTS);
1116  if( tmpdisp == NULL )
1117  {
1120  dispCopyDefault,
1121  NULL, NULL, NULL, NULL, NULL, SCIPdispOutputNAppliedCuts, NULL,
1123  }
1124  tmpdisp = SCIPfindDisp(scip, DISP_NAME_SEPAROUNDS);
1125  if( tmpdisp == NULL )
1126  {
1129  dispCopyDefault,
1130  NULL, NULL, NULL, NULL, NULL, SCIPdispOutputNSepaRounds, NULL,
1132  }
1133  tmpdisp = SCIPfindDisp(scip, DISP_NAME_POOLSIZE);
1134  if( tmpdisp == NULL )
1135  {
1138  dispCopyDefault,
1139  NULL, NULL, NULL, NULL, NULL, SCIPdispOutputCutPoolSize, NULL,
1141  }
1142  tmpdisp = SCIPfindDisp(scip,DISP_NAME_CONFLICTS);
1143  if( tmpdisp == NULL )
1144  {
1147  dispCopyDefault,
1148  NULL, NULL, NULL, NULL, NULL, SCIPdispOutputNConflicts, NULL,
1150  }
1151  tmpdisp = SCIPfindDisp(scip, DISP_NAME_STRONGBRANCHS);
1152  if( tmpdisp == NULL )
1153  {
1156  dispCopyDefault,
1157  NULL, NULL, NULL, NULL, NULL, SCIPdispOutputNStrongbranchs, NULL,
1159  }
1160  tmpdisp = SCIPfindDisp(scip, DISP_NAME_PSEUDOOBJ);
1161  if( tmpdisp == NULL )
1162  {
1165  dispCopyDefault,
1166  NULL, NULL, NULL, NULL, NULL, SCIPdispOutputPseudoObjval, NULL,
1168  }
1169  tmpdisp = SCIPfindDisp(scip, DISP_NAME_LPOBJ);
1170  if( tmpdisp == NULL )
1171  {
1174  dispCopyDefault,
1175  NULL, NULL, NULL, NULL, NULL, SCIPdispOutputLPObjval, NULL,
1177  }
1178  tmpdisp = SCIPfindDisp(scip, DISP_NAME_CURDUALBOUND);
1179  if( tmpdisp == NULL )
1180  {
1183  dispCopyDefault,
1184  NULL, NULL, NULL, NULL, NULL, SCIPdispOutputCurDualbound, NULL,
1186  }
1187  tmpdisp = SCIPfindDisp(scip, DISP_NAME_ESTIMATE);
1188  if( tmpdisp == NULL )
1189  {
1192  dispCopyDefault,
1193  NULL, NULL, NULL, NULL, NULL, SCIPdispOutputLocalOrigEstimate, NULL,
1195  }
1196  tmpdisp = SCIPfindDisp(scip, DISP_NAME_AVGDUALBOUND);
1197  if( tmpdisp == NULL )
1198  {
1201  dispCopyDefault,
1202  NULL, NULL, NULL, NULL, NULL, SCIPdispOutputAvgDualbound, NULL,
1204  }
1205  tmpdisp = SCIPfindDisp(scip, DISP_NAME_DUALBOUND);
1206  if( tmpdisp == NULL )
1207  {
1210  dispCopyDefault,
1211  NULL, NULL, NULL, NULL, NULL, SCIPdispOutputDualbound, NULL,
1213  }
1214  tmpdisp = SCIPfindDisp(scip, DISP_NAME_PRIMALBOUND);
1215  if( tmpdisp == NULL )
1216  {
1219  dispCopyDefault,
1220  NULL, NULL, NULL, NULL, NULL, SCIPdispOutputPrimalbound, NULL,
1222  }
1223  tmpdisp = SCIPfindDisp(scip, DISP_NAME_CUTOFFBOUND);
1224  if( tmpdisp == NULL )
1225  {
1228  dispCopyDefault,
1229  NULL, NULL, NULL, NULL, NULL, SCIPdispOutputCutoffbound, NULL,
1231  }
1232  tmpdisp = SCIPfindDisp(scip, DISP_NAME_GAP);
1233  if( tmpdisp == NULL )
1234  {
1237  dispCopyDefault,
1238  NULL, NULL, NULL, NULL, NULL, SCIPdispOutputGap, NULL,
1240  }
1241  tmpdisp = SCIPfindDisp(scip, DISP_NAME_PRIMALGAP);
1242  if( tmpdisp == NULL )
1243  {
1246  dispCopyDefault,
1247  NULL, NULL, NULL, NULL, NULL, SCIPdispOutputPrimalgap, NULL,
1249  }
1250  tmpdisp = SCIPfindDisp(scip, DISP_NAME_NSOLS);
1251  if( tmpdisp == NULL )
1252  {
1255  dispCopyDefault,
1256  NULL, NULL, NULL, NULL, NULL, SCIPdispOutputNSols, NULL,
1258  }
1259 
1260  return SCIP_OKAY;
1261 }
1262 
1263