Scippy

    SCIP

    Solving Constraint Integer Programs

    scip_exception.hpp
    Go to the documentation of this file.
    1/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
    2/* */
    3/* This file is part of the examples to */
    4/* An introduction to SCIP */
    5/* */
    6/* Copyright (C) 2007 Cornelius Schwarz */
    7/* */
    8/* 2007 University of Bayreuth */
    9/* */
    10/* */
    11/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
    12
    13/**@file scip_exception.hpp
    14 * @brief exception handling for SCIP
    15 * @author Cornelius Schwarz
    16 */
    17
    18#ifndef SCIP_EXCEPTION
    19#define SCIP_EXCEPTION
    20
    21#include <exception>
    22#include <string>
    23
    24#include <scip/scip.h>
    25#include <scip/misc.h>
    26
    27// unfortunately SCIP has no method to get the string of an error code, you can just print it to a file
    28// so we add such a method here, this has to be updated when SCIP Messages changes
    29// currently supporting SCIP-1.00
    30#define SCIP_MSG_MAX 100 ///< maximal number of characters in an error messages
    31
    32/**
    33 * @brief translates a SCIP_RETCODE into an error string
    34 *
    35 * @param[in] retcode SCIP_RETCODE you want to translate
    36 * @param[in] buffersize size of buffer
    37 * @param[out] buffer_str buffer to character array to store translated message, this must be at least of size SCIP_MSG_MAX
    38 * @return buffer_str or NULL, if retcode could not be translated
    39 */
    40inline char* SCIPgetErrorString(SCIP_RETCODE retcode, char* buffer_str, int buffersize)
    41{
    42 // the following was copied from SCIPretcodePrintError()
    43 switch(retcode)
    44 {
    45 case SCIP_OKAY:
    46 (void) SCIPsnprintf(buffer_str, buffersize, "normal termination");
    47 return buffer_str;
    48 case SCIP_ERROR:
    49 (void) SCIPsnprintf(buffer_str, buffersize, "unspecified error");
    50 return buffer_str;
    51 case SCIP_NOMEMORY:
    52 (void) SCIPsnprintf(buffer_str, buffersize, "insufficient memory error");
    53 return buffer_str;
    54 case SCIP_READERROR:
    55 (void) SCIPsnprintf(buffer_str, buffersize, "file read error");
    56 return buffer_str;
    57 case SCIP_WRITEERROR:
    58 (void) SCIPsnprintf(buffer_str, buffersize, "file write error");
    59 return buffer_str;
    61 (void) SCIPsnprintf(buffer_str, buffersize, "branch error");
    62 return buffer_str;
    63 case SCIP_NOFILE:
    64 (void) SCIPsnprintf(buffer_str, buffersize, "file not found error");
    65 return buffer_str;
    67 (void) SCIPsnprintf(buffer_str, buffersize, "cannot create file");
    68 return buffer_str;
    69 case SCIP_LPERROR:
    70 (void) SCIPsnprintf(buffer_str, buffersize, "error in LP solver");
    71 return buffer_str;
    72 case SCIP_NOPROBLEM:
    73 (void) SCIPsnprintf(buffer_str, buffersize, "no problem exists");
    74 return buffer_str;
    76 (void) SCIPsnprintf(buffer_str, buffersize, "method cannot be called at this time in solution process");
    77 return buffer_str;
    79 (void) SCIPsnprintf(buffer_str, buffersize, "method cannot be called with this type of data");
    80 return buffer_str;
    82 (void) SCIPsnprintf(buffer_str, buffersize, "method returned an invalid result code");
    83 return buffer_str;
    85 (void) SCIPsnprintf(buffer_str, buffersize, "a required plugin was not found");
    86 return buffer_str;
    88 (void) SCIPsnprintf(buffer_str, buffersize, "the parameter with the given name was not found");
    89 return buffer_str;
    91 (void) SCIPsnprintf(buffer_str, buffersize, "the parameter is not of the expected type");
    92 return buffer_str;
    94 (void) SCIPsnprintf(buffer_str, buffersize, "the value is invalid for the given parameter");
    95 return buffer_str;
    97 (void) SCIPsnprintf(buffer_str, buffersize, "the given key is already existing in table");
    98 return buffer_str;
    100 (void) SCIPsnprintf(buffer_str, buffersize, "maximal branching depth level exceeded");
    101 return buffer_str;
    103 (void) SCIPsnprintf(buffer_str, buffersize, "function not implemented");
    104 return buffer_str;
    105 }
    106 return NULL;
    107}
    108
    109
    110/** @brief exception handling class for SCIP
    111 *
    112 * this class enables you to handle the return code of SCIP functions in a C++ way
    113 */
    114class SCIPException : public std::exception
    115{
    116private:
    117 char _msg[SCIP_MSG_MAX]; ///< error message
    118 SCIP_RETCODE _retcode; ///< SCIP error code
    119
    120public:
    121
    122 /** @brief constructs a SCIPEexception from an error code
    123 *
    124 * this constructs a new SCIPException from given error code
    125 * @param[in] retcode SCIP error code
    126 */
    127 SCIPException(SCIP_RETCODE retcode) : _retcode(retcode)
    128 {
    129 if( SCIPgetErrorString(retcode, _msg, SCIP_MSG_MAX) == NULL )
    130 (void) SCIPsnprintf(_msg, SCIP_MSG_MAX, "unknown SCIP retcode %d", retcode);
    131 }
    132
    133
    134 /** @brief returns the error message
    135 *
    136 * @return error message
    137 *
    138 * this overrides the corresponding method of std::exception in order to allow you to catch all of your exceptions as std::exception
    139 */
    140 const char* what(void) const throw() {return _msg;}
    141
    142
    143 /** @brief get method for @p _retcode
    144 *
    145 * @return stored SCIP_RETCODE
    146 */
    147 SCIP_RETCODE getRetcode(void) const {return _retcode;}
    148
    149 /** destructor */
    151}; /*lint !e1712*/
    152
    153
    154/** @brief macro to call scip function with exception handling
    155 *
    156 * this macro calls a SCIP function and throws an instance of SCIPException if anything went wrong
    157 *
    158 */
    159#define SCIP_CALL_EXC(x) \
    160 { \
    161 SCIP_RETCODE retcode; \
    162 if( (retcode = (x)) != SCIP_OKAY) \
    163 { \
    164 throw SCIPException(retcode); \
    165 } \
    166 }
    167
    168
    169#endif
    exception handling class for SCIP
    SCIPException(SCIP_RETCODE retcode)
    constructs a SCIPEexception from an error code
    const char * what(void) const
    returns the error message
    SCIP_RETCODE getRetcode(void) const
    get method for _retcode
    #define NULL
    Definition: def.h:248
    int SCIPsnprintf(char *t, int len, const char *s,...)
    Definition: misc.c:10827
    internal miscellaneous methods
    SCIP callable library.
    char * SCIPgetErrorString(SCIP_RETCODE retcode, char *buffer_str, int buffersize)
    translates a SCIP_RETCODE into an error string
    #define SCIP_MSG_MAX
    maximal number of characters in an error messages
    @ SCIP_FILECREATEERROR
    Definition: type_retcode.h:48
    @ SCIP_LPERROR
    Definition: type_retcode.h:49
    @ SCIP_BRANCHERROR
    Definition: type_retcode.h:60
    @ SCIP_INVALIDRESULT
    Definition: type_retcode.h:53
    @ SCIP_NOFILE
    Definition: type_retcode.h:47
    @ SCIP_READERROR
    Definition: type_retcode.h:45
    @ SCIP_INVALIDDATA
    Definition: type_retcode.h:52
    @ SCIP_PLUGINNOTFOUND
    Definition: type_retcode.h:54
    @ SCIP_PARAMETERUNKNOWN
    Definition: type_retcode.h:55
    @ SCIP_WRITEERROR
    Definition: type_retcode.h:46
    @ SCIP_PARAMETERWRONGVAL
    Definition: type_retcode.h:57
    @ SCIP_PARAMETERWRONGTYPE
    Definition: type_retcode.h:56
    @ SCIP_KEYALREADYEXISTING
    Definition: type_retcode.h:58
    @ SCIP_NOMEMORY
    Definition: type_retcode.h:44
    @ SCIP_NOPROBLEM
    Definition: type_retcode.h:50
    @ SCIP_OKAY
    Definition: type_retcode.h:42
    @ SCIP_INVALIDCALL
    Definition: type_retcode.h:51
    @ SCIP_ERROR
    Definition: type_retcode.h:43
    @ SCIP_NOTIMPLEMENTED
    Definition: type_retcode.h:61
    @ SCIP_MAXDEPTHLEVEL
    Definition: type_retcode.h:59
    enum SCIP_Retcode SCIP_RETCODE
    Definition: type_retcode.h:63