Scippy

    SCIP

    Solving Constraint Integer Programs

    Detailed Description

    DIFF file reader.

    Author
    Jakob Witzig

    This reader allows to parse a new objective function in the style of CPLEX .lp files.

    The lp format is defined within the CPLEX documentation.

    An example of a *.diff file looks like this:

    Minimize obj: - STM6 + STM7

    Here is the objective sense set to minimize the function -STM6 + STM7.

    Definition in file reader_diff.c.

    #include <ctype.h>
    #include "scip/pub_fileio.h"
    #include "scip/pub_message.h"
    #include "scip/pub_misc.h"
    #include "scip/pub_reader.h"
    #include "scip/pub_var.h"
    #include "scip/reader_diff.h"
    #include "scip/scip_general.h"
    #include "scip/scip_mem.h"
    #include "scip/scip_message.h"
    #include "scip/scip_numerics.h"
    #include "scip/scip_prob.h"
    #include "scip/scip_reader.h"
    #include "scip/scip_solve.h"
    #include <stdlib.h>
    #include <string.h>

    Go to the source code of this file.

    Macros

    #define READER_NAME   "diffreader"
     
    #define READER_DESC   "file reader for changes in the LP file"
     
    #define READER_EXTENSION   "diff"
     
    #define LP_MAX_LINELEN   65536
     
    #define LP_MAX_PUSHEDTOKENS   2
     
    #define LP_INIT_COEFSSIZE   8192
     

    Typedefs

    typedef enum LpSection LPSECTION
     
    typedef enum LpExpType LPEXPTYPE
     
    typedef enum LpSense LPSENSE
     
    typedef struct LpInput LPINPUT
     

    Enumerations

    enum  LpSection {
      LP_START ,
      LP_OBJECTIVE ,
      LP_END ,
      LP_START ,
      LP_OBJECTIVE ,
      LP_CONSTRAINTS ,
      LP_BOUNDS ,
      LP_GENERALS ,
      LP_BINARIES ,
      LP_SEMICONTINUOUS ,
      LP_SOS ,
      LP_END
    }
     
    enum  LpExpType {
      LP_EXP_NONE ,
      LP_EXP_UNSIGNED ,
      LP_EXP_SIGNED ,
      LP_EXP_NONE ,
      LP_EXP_UNSIGNED ,
      LP_EXP_SIGNED
    }
     
    enum  LpSense {
      LP_SENSE_LE ,
      LP_SENSE_GE ,
      LP_SENSE_EQ ,
      LP_SENSE_NOTHING ,
      LP_SENSE_LE ,
      LP_SENSE_GE ,
      LP_SENSE_EQ
    }
     

    Functions

    static void syntaxError (SCIP *scip, LPINPUT *lpinput, const char *msg)
     
    static SCIP_Bool hasError (LPINPUT *lpinput)
     
    static SCIP_Bool isDelimChar (char c)
     
    static SCIP_Bool isTokenChar (char c)
     
    static SCIP_Bool isValueChar (char c, char nextc, SCIP_Bool firstchar, SCIP_Bool *hasdot, LPEXPTYPE *exptype)
     
    static SCIP_Bool getNextLine (SCIP *scip, LPINPUT *lpinput)
     
    static void swapPointers (char **pointer1, char **pointer2)
     
    static SCIP_Bool getNextToken (SCIP *scip, LPINPUT *lpinput)
     
    static void pushToken (LPINPUT *lpinput)
     
    static void pushBufferToken (LPINPUT *lpinput)
     
    static void swapTokenBuffer (LPINPUT *lpinput)
     
    static SCIP_Bool isNewSection (SCIP *scip, LPINPUT *lpinput)
     
    static SCIP_Bool isSign (LPINPUT *lpinput, int *sign)
     
    static SCIP_Bool isValue (SCIP *scip, LPINPUT *lpinput, SCIP_Real *value)
     
    static SCIP_Bool isSense (LPINPUT *lpinput, LPSENSE *sense)
     
    static SCIP_RETCODE getVariable (SCIP *scip, char *name, SCIP_VAR **var)
     
    static SCIP_RETCODE readStart (SCIP *scip, LPINPUT *lpinput)
     
    static SCIP_RETCODE readCoefficients (SCIP *scip, LPINPUT *lpinput, SCIP_Bool isobjective, char *name, int *coefssize, SCIP_VAR ***vars, SCIP_Real **coefs, int *ncoefs, SCIP_Bool *newsection)
     
    static SCIP_RETCODE readObjective (SCIP *scip, LPINPUT *lpinput)
     
    static SCIP_RETCODE readDiffFile (SCIP *scip, LPINPUT *lpinput, const char *filename)
     
    static SCIP_DECL_READERCOPY (readerCopyDiff)
     
    static SCIP_DECL_READERFREE (readerFreeDiff)
     
    static SCIP_DECL_READERREAD (readerReadDiff)
     
    SCIP_RETCODE SCIPincludeReaderDiff (SCIP *scip)
     
    SCIP_RETCODE SCIPreadDiff (SCIP *scip, SCIP_READER *reader, const char *filename, SCIP_RESULT *result)
     

    Variables

    static const char commentchars [] = "\\"
     

    Macro Definition Documentation

    ◆ READER_NAME

    #define READER_NAME   "diffreader"

    Definition at line 61 of file reader_diff.c.

    ◆ READER_DESC

    #define READER_DESC   "file reader for changes in the LP file"

    Definition at line 62 of file reader_diff.c.

    ◆ READER_EXTENSION

    #define READER_EXTENSION   "diff"

    Definition at line 63 of file reader_diff.c.

    ◆ LP_MAX_LINELEN

    #define LP_MAX_LINELEN   65536

    Definition at line 68 of file reader_diff.c.

    ◆ LP_MAX_PUSHEDTOKENS

    #define LP_MAX_PUSHEDTOKENS   2

    Definition at line 69 of file reader_diff.c.

    ◆ LP_INIT_COEFSSIZE

    #define LP_INIT_COEFSSIZE   8192

    Definition at line 70 of file reader_diff.c.

    Typedef Documentation

    ◆ LPSECTION

    typedef enum LpSection LPSECTION

    Definition at line 77 of file reader_diff.c.

    ◆ LPEXPTYPE

    typedef enum LpExpType LPEXPTYPE

    Definition at line 83 of file reader_diff.c.

    ◆ LPSENSE

    typedef enum LpSense LPSENSE

    Definition at line 89 of file reader_diff.c.

    ◆ LPINPUT

    typedef struct LpInput LPINPUT

    Definition at line 109 of file reader_diff.c.

    Enumeration Type Documentation

    ◆ LpSection

    enum LpSection

    Section in LP File

    Enumerator
    LP_START 
    LP_OBJECTIVE 
    LP_END 
    LP_START 
    LP_OBJECTIVE 
    LP_CONSTRAINTS 
    LP_BOUNDS 
    LP_GENERALS 
    LP_BINARIES 
    LP_SEMICONTINUOUS 
    LP_SOS 
    LP_END 

    Definition at line 73 of file reader_diff.c.

    ◆ LpExpType

    enum LpExpType
    Enumerator
    LP_EXP_NONE 
    LP_EXP_UNSIGNED 
    LP_EXP_SIGNED 
    LP_EXP_NONE 
    LP_EXP_UNSIGNED 
    LP_EXP_SIGNED 

    Definition at line 79 of file reader_diff.c.

    ◆ LpSense

    enum LpSense
    Enumerator
    LP_SENSE_LE 
    LP_SENSE_GE 
    LP_SENSE_EQ 
    LP_SENSE_NOTHING 
    LP_SENSE_LE 
    LP_SENSE_GE 
    LP_SENSE_EQ 

    Definition at line 85 of file reader_diff.c.

    Function Documentation

    ◆ syntaxError()

    static void syntaxError ( SCIP scip,
    LPINPUT lpinput,
    const char *  msg 
    )
    static

    issues an error message and marks the LP data to have errors

    Parameters
    scipSCIP data structure
    lpinputLP reading data
    msgerror message

    Definition at line 120 of file reader_diff.c.

    References LP_END, NULL, SCIP_VERBLEVEL_MINIMAL, SCIPerrorMessage, SCIPsnprintf(), SCIPverbMessage(), and TRUE.

    Referenced by readCoefficients().

    ◆ hasError()

    static SCIP_Bool hasError ( LPINPUT lpinput)
    static

    returns whether a syntax error was detected

    Parameters
    lpinputLP reading data

    Definition at line 147 of file reader_diff.c.

    References NULL.

    Referenced by readDiffFile().

    ◆ isDelimChar()

    static SCIP_Bool isDelimChar ( char  c)
    static

    returns whether the given character is a token delimiter

    Parameters
    cinput character

    Definition at line 158 of file reader_diff.c.

    References FALSE, and TRUE.

    Referenced by getNextToken().

    ◆ isTokenChar()

    static SCIP_Bool isTokenChar ( char  c)
    static

    returns whether the given character is a single token

    Parameters
    cinput character

    Definition at line 179 of file reader_diff.c.

    References FALSE, and TRUE.

    Referenced by getNextToken().

    ◆ isValueChar()

    static SCIP_Bool isValueChar ( char  c,
    char  nextc,
    SCIP_Bool  firstchar,
    SCIP_Bool hasdot,
    LPEXPTYPE exptype 
    )
    static

    returns whether the current character is member of a value string

    Parameters
    cinput character
    nextcnext input character
    firstcharis the given character the first char of the token?
    hasdotpointer to update the dot flag
    exptypepointer to update the exponent type

    Definition at line 203 of file reader_diff.c.

    References FALSE, LP_EXP_NONE, LP_EXP_SIGNED, LP_EXP_UNSIGNED, NULL, and TRUE.

    Referenced by getNextToken().

    ◆ getNextLine()

    static SCIP_Bool getNextLine ( SCIP scip,
    LPINPUT lpinput 
    )
    static

    reads the next line from the input file into the line buffer; skips comments; returns whether a line could be read

    Parameters
    scipSCIP data structure
    lpinputLP reading data

    Definition at line 247 of file reader_diff.c.

    References BMSclearMemoryArray, commentchars, FALSE, NULL, SCIP_CALL_ABORT, SCIPcalcMemGrowSize(), SCIPfgets(), SCIPreallocBlockMemoryArray, and TRUE.

    Referenced by getNextToken().

    ◆ swapPointers()

    static void swapPointers ( char **  pointer1,
    char **  pointer2 
    )
    static

    swaps the addresses of two pointers

    Parameters
    pointer1first pointer
    pointer2second pointer

    Definition at line 305 of file reader_diff.c.

    Referenced by getNextToken(), pushBufferToken(), pushToken(), and swapTokenBuffer().

    ◆ getNextToken()

    static SCIP_Bool getNextToken ( SCIP scip,
    LPINPUT lpinput 
    )
    static

    reads the next token from the input file into the token buffer; returns whether a token was read

    Parameters
    scipSCIP data structure
    lpinputLP reading data

    Definition at line 319 of file reader_diff.c.

    References FALSE, getNextLine(), isDelimChar(), isTokenChar(), isValueChar(), LP_END, LP_EXP_NONE, LP_MAX_LINELEN, NULL, SCIP_Bool, SCIPdebugMsg, swapPointers(), and TRUE.

    Referenced by isNewSection(), readCoefficients(), and readStart().

    ◆ pushToken()

    static void pushToken ( LPINPUT lpinput)
    static

    puts the current token on the token stack, such that it is read at the next call to getNextToken()

    Parameters
    lpinputLP reading data

    Definition at line 427 of file reader_diff.c.

    References LP_MAX_PUSHEDTOKENS, NULL, and swapPointers().

    Referenced by isNewSection(), and readCoefficients().

    ◆ pushBufferToken()

    static void pushBufferToken ( LPINPUT lpinput)
    static

    puts the buffered token on the token stack, such that it is read at the next call to getNextToken()

    Parameters
    lpinputLP reading data

    Definition at line 440 of file reader_diff.c.

    References LP_MAX_PUSHEDTOKENS, NULL, and swapPointers().

    Referenced by readCoefficients().

    ◆ swapTokenBuffer()

    static void swapTokenBuffer ( LPINPUT lpinput)
    static

    swaps the current token with the token buffer

    Parameters
    lpinputLP reading data

    Definition at line 453 of file reader_diff.c.

    References NULL, and swapPointers().

    Referenced by isNewSection(), and readCoefficients().

    ◆ isNewSection()

    static SCIP_Bool isNewSection ( SCIP scip,
    LPINPUT lpinput 
    )
    static

    checks whether the current token is a section identifier, and if yes, switches to the corresponding section

    Parameters
    scipSCIP data structure
    lpinputLP reading data

    Definition at line 464 of file reader_diff.c.

    References FALSE, getNextToken(), LP_END, LP_MAX_LINELEN, LP_OBJECTIVE, NULL, pushToken(), SCIP_Bool, SCIP_OBJSENSE_MAXIMIZE, SCIP_OBJSENSE_MINIMIZE, SCIPdebugMsg, swapTokenBuffer(), and TRUE.

    Referenced by readCoefficients(), and readStart().

    ◆ isSign()

    static SCIP_Bool isSign ( LPINPUT lpinput,
    int *  sign 
    )
    static

    returns whether the current token is a sign

    Parameters
    lpinputLP reading data
    signpointer to update the sign

    Definition at line 542 of file reader_diff.c.

    References FALSE, NULL, and TRUE.

    Referenced by readCoefficients().

    ◆ isValue()

    static SCIP_Bool isValue ( SCIP scip,
    LPINPUT lpinput,
    SCIP_Real value 
    )
    static

    returns whether the current token is a value

    Parameters
    scipSCIP data structure
    lpinputLP reading data
    valuepointer to store the value (unchanged, if token is no value)

    Definition at line 567 of file reader_diff.c.

    References FALSE, NULL, SCIPinfinity(), SCIPstrcasecmp(), and TRUE.

    Referenced by readCoefficients().

    ◆ isSense()

    static SCIP_Bool isSense ( LPINPUT lpinput,
    LPSENSE sense 
    )
    static

    returns whether the current token is an equation sense

    Parameters
    lpinputLP reading data
    sensepointer to store the equation sense, or NULL

    Definition at line 599 of file reader_diff.c.

    References FALSE, LP_SENSE_EQ, LP_SENSE_GE, LP_SENSE_LE, NULL, and TRUE.

    Referenced by readCoefficients().

    ◆ getVariable()

    static SCIP_RETCODE getVariable ( SCIP scip,
    char *  name,
    SCIP_VAR **  var 
    )
    static

    returns the variable with the given name, or creates a new variable if it does not exist

    Parameters
    scipSCIP data structure
    namename of the variable
    varpointer to store the variable

    Definition at line 630 of file reader_diff.c.

    References NULL, SCIP_OKAY, SCIP_READERROR, and SCIPfindVar().

    Referenced by readCoefficients().

    ◆ readStart()

    static SCIP_RETCODE readStart ( SCIP scip,
    LPINPUT lpinput 
    )
    static

    reads the header of the file

    Parameters
    scipSCIP data structure
    lpinputLP reading data

    Definition at line 649 of file reader_diff.c.

    References getNextToken(), isNewSection(), NULL, and SCIP_OKAY.

    Referenced by readDiffFile().

    ◆ readCoefficients()

    static SCIP_RETCODE readCoefficients ( SCIP scip,
    LPINPUT lpinput,
    SCIP_Bool  isobjective,
    char *  name,
    int *  coefssize,
    SCIP_VAR ***  vars,
    SCIP_Real **  coefs,
    int *  ncoefs,
    SCIP_Bool newsection 
    )
    static

    reads an objective or constraint with name and coefficients

    Parameters
    scipSCIP data structure
    lpinputLP reading data
    isobjectiveindicates whether we are currently reading the coefficients of the objective
    namepointer to store the name of the line; must be at least of size LP_MAX_LINELEN
    coefssizesize of vars and coefs arrays
    varspointer to store the array with variables (must be freed by caller)
    coefspointer to store the array with coefficients (must be freed by caller)
    ncoefspointer to store the number of coefficients
    newsectionpointer to store whether a new section was encountered

    Definition at line 670 of file reader_diff.c.

    References FALSE, getNextToken(), getVariable(), isNewSection(), isSense(), isSign(), isValue(), LP_INIT_COEFSSIZE, LP_MAX_LINELEN, MAX, NULL, pushBufferToken(), pushToken(), SCIP_Bool, SCIP_CALL, SCIP_OKAY, SCIP_READERROR, SCIP_Real, SCIPallocBlockMemoryArray, SCIPdebugMsg, SCIPisZero(), SCIPmemccpy(), SCIPreallocBlockMemoryArray, SCIPvarGetName(), SCIPwarningMessage(), swapTokenBuffer(), syntaxError(), and TRUE.

    Referenced by readObjective().

    ◆ readObjective()

    static SCIP_RETCODE readObjective ( SCIP scip,
    LPINPUT lpinput 
    )
    static

    reads the objective section

    Parameters
    scipSCIP data structure
    lpinputLP reading data

    Definition at line 870 of file reader_diff.c.

    References LP_MAX_LINELEN, NULL, readCoefficients(), SCIP_Bool, SCIP_CALL, SCIP_OKAY, SCIP_Real, SCIPchgReoptObjective(), SCIPfreeBlockMemoryArrayNull, and TRUE.

    Referenced by readDiffFile().

    ◆ readDiffFile()

    static SCIP_RETCODE readDiffFile ( SCIP scip,
    LPINPUT lpinput,
    const char *  filename 
    )
    static

    reads a diff file

    Parameters
    scipSCIP data structure
    lpinputLP reading data
    filenamename of the input file

    Definition at line 899 of file reader_diff.c.

    References hasError(), LP_END, LP_OBJECTIVE, LP_START, NULL, readObjective(), readStart(), SCIP_CALL, SCIP_INVALIDDATA, SCIP_NOFILE, SCIP_OKAY, SCIP_STAGE_PROBLEM, SCIPerrorMessage, SCIPfclose(), SCIPfopen(), SCIPfreeReoptSolve(), SCIPfreeTransform(), SCIPgetStage(), SCIPisReoptEnabled(), and SCIPprintSysError().

    Referenced by SCIPreadDiff().

    ◆ SCIP_DECL_READERCOPY()

    static SCIP_DECL_READERCOPY ( readerCopyDiff  )
    static

    copy method for reader plugins (called when SCIP copies plugins)

    Definition at line 959 of file reader_diff.c.

    References NULL, READER_NAME, SCIP_CALL, SCIP_OKAY, SCIPincludeReaderDiff(), and SCIPreaderGetName().

    ◆ SCIP_DECL_READERFREE()

    static SCIP_DECL_READERFREE ( readerFreeDiff  )
    static

    destructor of reader to free user data (called when SCIP is exiting)

    Definition at line 973 of file reader_diff.c.

    References SCIP_OKAY.

    ◆ SCIP_DECL_READERREAD()

    static SCIP_DECL_READERREAD ( readerReadDiff  )
    static

    problem reading method of reader

    Definition at line 980 of file reader_diff.c.

    References SCIP_CALL, SCIP_OKAY, and SCIPreadDiff().

    Variable Documentation

    ◆ commentchars

    const char commentchars[] = "\\"
    static

    Definition at line 111 of file reader_diff.c.

    Referenced by getNextLine().