1 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ 2 /* */ 3 /* This file is part of the program and library */ 4 /* SCIP --- Solving Constraint Integer Programs */ 5 /* */ 6 /* Copyright (c) 2002-2023 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_message.c 26 * @ingroup OTHER_CFILES 27 * @brief public methods for message handling 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 45 #include "scip/debug.h" 46 #include "scip/pub_message.h" 47 #include "scip/scip_message.h" 48 #include "scip/struct_scip.h" 49 #include "scip/struct_set.h" 50 #include "scip/struct_stat.h" 51 52 /** installs the given message handler, such that all messages are passed to this handler. A messages handler can be 53 * created via SCIPmessagehdlrCreate(). 54 * 55 * @return \ref SCIP_OKAY is returned if everything worked. Otherwise a suitable error code is passed. See \ref 56 * SCIP_Retcode "SCIP_RETCODE" for a complete list of error codes. 57 * 58 * @pre this method can be called in one of the following stages of the SCIP solving process: 59 * - \ref SCIP_STAGE_INIT 60 * - \ref SCIP_STAGE_PROBLEM 61 * 62 * @note The currently installed messages handler gets freed if this SCIP instance is its last user (w.r.t. capture/release). 63 */ 64 SCIP_RETCODE SCIPsetMessagehdlr( 65 SCIP* scip, /**< SCIP data structure */ 66 SCIP_MESSAGEHDLR* messagehdlr /**< message handler to install, or NULL to suppress all output */ 67 ) 68 { 69 SCIP_CALL( SCIPcheckStage(scip, "SCIPsetMessagehdlr", TRUE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE) ); 70 71 assert(scip != NULL); 72 assert(scip->set != NULL); 73 74 SCIPmessagehdlrCapture(messagehdlr); 75 76 SCIP_CALL( SCIPmessagehdlrRelease(&scip->messagehdlr) ); 77 assert(scip->messagehdlr == NULL); 78 79 scip->messagehdlr = messagehdlr; 80 81 return SCIP_OKAY; 82 } 83 84 /** returns the currently installed message handler 85 * 86 * @return the currently installed message handler, or NULL if messages are currently suppressed 87 */ 88 SCIP_MESSAGEHDLR* SCIPgetMessagehdlr( 89 SCIP* scip /**< SCIP data structure */ 90 ) 91 { 92 return scip->messagehdlr; 93 } 94 95 /** sets the log file name for the currently installed message handler */ 96 void SCIPsetMessagehdlrLogfile( 97 SCIP* scip, /**< SCIP data structure */ 98 const char* filename /**< name of log file, or NULL (no log) */ 99 ) 100 { 101 if( scip->messagehdlr != NULL ) 102 { 103 SCIPmessagehdlrSetLogfile(scip->messagehdlr, filename); 104 } 105 } 106 107 /** sets the currently installed message handler to be quiet (or not) */ 108 void SCIPsetMessagehdlrQuiet( 109 SCIP* scip, /**< SCIP data structure */ 110 SCIP_Bool quiet /**< should screen messages be suppressed? */ 111 ) 112 { 113 if( scip->messagehdlr != NULL ) 114 { 115 SCIPmessagehdlrSetQuiet(scip->messagehdlr, quiet); 116 } 117 } 118 119 /** prints a warning message via the message handler */ 120 void SCIPwarningMessage( 121 SCIP* scip, /**< SCIP data structure */ 122 const char* formatstr, /**< format string like in printf() function */ 123 ... /**< format arguments line in printf() function */ 124 ) 125 { 126 va_list ap; 127 128 assert(scip != NULL); 129 130 va_start(ap, formatstr); /*lint !e838*/ 131 SCIPmessageVFPrintWarning(scip->messagehdlr, formatstr, ap); 132 va_end(ap); 133 } 134 135 /** prints a debug message */ 136 void SCIPprintDebugMessage( 137 SCIP* scip, /**< SCIP data structure */ 138 const char* sourcefile, /**< name of the source file that called the function */ 139 int sourceline, /**< line in the source file where the function was called */ 140 const char* formatstr, /**< format string like in printf() function */ 141 ... /**< format arguments line in printf() function */ 142 ) 143 { 144 const char* filename; 145 int subscipdepth = 0; 146 va_list ap; 147 148 assert( sourcefile != NULL ); 149 assert( scip != NULL ); 150 151 /* strip directory from filename */ 152 #if defined(_WIN32) || defined(_WIN64) 153 filename = strrchr(sourcefile, '\\'); 154 #else 155 filename = strrchr(sourcefile, '/'); 156 #endif 157 if ( filename == NULL ) 158 filename = sourcefile; 159 else 160 ++filename; 161 162 if ( scip->stat != NULL ) 163 subscipdepth = scip->stat->subscipdepth; 164 if ( subscipdepth > 0 ) 165 SCIPmessageFPrintInfo(scip->messagehdlr, NULL, "%d: [%s:%d] debug: ", subscipdepth, filename, sourceline); 166 else 167 SCIPmessageFPrintInfo(scip->messagehdlr, NULL, "[%s:%d] debug: ", filename, sourceline); 168 169 va_start(ap, formatstr); /*lint !e838*/ 170 SCIPmessageVFPrintInfo(scip->messagehdlr, NULL, formatstr, ap); 171 va_end(ap); 172 } 173 174 /** prints a debug message without precode */ 175 void SCIPdebugMessagePrint( 176 SCIP* scip, /**< SCIP data structure */ 177 const char* formatstr, /**< format string like in printf() function */ 178 ... /**< format arguments line in printf() function */ 179 ) 180 { 181 va_list ap; 182 183 assert( scip != NULL ); 184 185 va_start(ap, formatstr); /*lint !e838*/ 186 SCIPmessageVFPrintInfo(scip->messagehdlr, NULL, formatstr, ap); 187 va_end(ap); 188 } 189 190 /** prints a dialog message that requests user interaction or is a direct response to a user interactive command */ 191 void SCIPdialogMessage( 192 SCIP* scip, /**< SCIP data structure */ 193 FILE* file, /**< file stream to print into, or NULL for stdout */ 194 const char* formatstr, /**< format string like in printf() function */ 195 ... /**< format arguments line in printf() function */ 196 ) 197 { 198 va_list ap; 199 200 assert(scip != NULL); 201 202 va_start(ap, formatstr); /*lint !e838*/ 203 SCIPmessageVFPrintDialog(scip->messagehdlr, file, formatstr, ap); 204 va_end(ap); 205 } 206 207 /** prints a message */ 208 void SCIPinfoMessage( 209 SCIP* scip, /**< SCIP data structure */ 210 FILE* file, /**< file stream to print into, or NULL for stdout */ 211 const char* formatstr, /**< format string like in printf() function */ 212 ... /**< format arguments line in printf() function */ 213 ) 214 { 215 va_list ap; 216 217 assert(scip != NULL); 218 219 va_start(ap, formatstr); /*lint !e838*/ 220 SCIPmessageVFPrintInfo(scip->messagehdlr, file, formatstr, ap); 221 va_end(ap); 222 } 223 224 /** prints a message depending on the verbosity level */ 225 void SCIPverbMessage( 226 SCIP* scip, /**< SCIP data structure */ 227 SCIP_VERBLEVEL msgverblevel, /**< verbosity level of this message */ 228 FILE* file, /**< file stream to print into, or NULL for stdout */ 229 const char* formatstr, /**< format string like in printf() function */ 230 ... /**< format arguments line in printf() function */ 231 ) 232 { 233 va_list ap; 234 235 assert(scip != NULL); 236 assert(scip->set != NULL); 237 238 va_start(ap, formatstr); /*lint !e838*/ 239 SCIPmessageVFPrintVerbInfo(scip->messagehdlr, scip->set->disp_verblevel, msgverblevel, file, formatstr, ap); 240 va_end(ap); 241 } 242 243 /** returns the current message verbosity level 244 * 245 * @return message verbosity level of SCIP 246 * 247 * @see \ref SCIP_VerbLevel "SCIP_VERBLEVEL" for a list of all verbosity levels 248 */ 249 SCIP_VERBLEVEL SCIPgetVerbLevel( 250 SCIP* scip /**< SCIP data structure */ 251 ) 252 { 253 assert(scip != NULL); 254 assert(scip->set != NULL); 255 256 return scip->set->disp_verblevel; 257 } 258