Detailed Description
DIFF file reader.
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>
#include <strings.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 56 of file reader_diff.c.
Referenced by SCIP_DECL_READERCOPY(), and SCIPincludeReaderDiff().
◆ READER_DESC
#define READER_DESC "file reader for changes in the LP file" |
Definition at line 57 of file reader_diff.c.
Referenced by SCIPincludeReaderDiff().
◆ READER_EXTENSION
#define READER_EXTENSION "diff" |
Definition at line 58 of file reader_diff.c.
Referenced by SCIPincludeReaderDiff().
◆ LP_MAX_LINELEN
#define LP_MAX_LINELEN 65536 |
Definition at line 63 of file reader_diff.c.
Referenced by getNextLine(), getNextToken(), isNewSection(), readCoefficients(), readObjective(), and SCIPreadDiff().
◆ LP_MAX_PUSHEDTOKENS
#define LP_MAX_PUSHEDTOKENS 2 |
Definition at line 64 of file reader_diff.c.
Referenced by pushBufferToken(), pushToken(), and SCIPreadDiff().
◆ LP_INIT_COEFSSIZE
#define LP_INIT_COEFSSIZE 8192 |
Definition at line 65 of file reader_diff.c.
Referenced by readCoefficients().
Typedef Documentation
◆ LPSECTION
Definition at line 72 of file reader_diff.c.
◆ LPEXPTYPE
Definition at line 78 of file reader_diff.c.
◆ LPSENSE
Definition at line 84 of file reader_diff.c.
◆ LPINPUT
typedef struct LpInput LPINPUT |
Definition at line 105 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 68 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 74 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 80 of file reader_diff.c.
Function Documentation
◆ syntaxError()
issues an error message and marks the LP data to have errors
- Parameters
-
scip SCIP data structure lpinput LP reading data msg error message
Definition at line 116 of file reader_diff.c.
References LP_END, NULL, SCIP_VERBLEVEL_MINIMAL, SCIPerrorMessage, SCIPsnprintf(), SCIPverbMessage(), and TRUE.
Referenced by readCoefficients().
◆ hasError()
returns whether a syntax error was detected
- Parameters
-
lpinput LP reading data
Definition at line 143 of file reader_diff.c.
References NULL.
Referenced by readDiffFile().
◆ isDelimChar()
|
static |
returns whether the given character is a token delimiter
- Parameters
-
c input character
Definition at line 154 of file reader_diff.c.
Referenced by getNextToken().
◆ isTokenChar()
|
static |
returns whether the given character is a single token
- Parameters
-
c input character
Definition at line 175 of file reader_diff.c.
Referenced by getNextToken().
◆ isValueChar()
|
static |
returns whether the current character is member of a value string
- Parameters
-
c input character nextc next input character firstchar is the given character the first char of the token? hasdot pointer to update the dot flag exptype pointer to update the exponent type
Definition at line 199 of file reader_diff.c.
References FALSE, LP_EXP_NONE, LP_EXP_SIGNED, LP_EXP_UNSIGNED, NULL, and TRUE.
Referenced by getNextToken().
◆ getNextLine()
reads the next line from the input file into the line buffer; skips comments; returns whether a line could be read
- Parameters
-
scip SCIP data structure lpinput LP reading data
Definition at line 243 of file reader_diff.c.
References BMSclearMemoryArray, commentchars, FALSE, LP_MAX_LINELEN, NULL, SCIPdebugMsg, SCIPfgets(), SCIPfseek(), SCIPwarningMessage(), and TRUE.
Referenced by getNextToken().
◆ swapPointers()
|
static |
swaps the addresses of two pointers
- Parameters
-
pointer1 first pointer pointer2 second pointer
Definition at line 334 of file reader_diff.c.
Referenced by getNextToken(), pushBufferToken(), pushToken(), and swapTokenBuffer().
◆ getNextToken()
reads the next token from the input file into the token buffer; returns whether a token was read
- Parameters
-
scip SCIP data structure lpinput LP reading data
Definition at line 348 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 |
puts the current token on the token stack, such that it is read at the next call to getNextToken()
- Parameters
-
lpinput LP reading data
Definition at line 454 of file reader_diff.c.
References LP_MAX_PUSHEDTOKENS, NULL, and swapPointers().
Referenced by isNewSection(), and readCoefficients().
◆ pushBufferToken()
|
static |
puts the buffered token on the token stack, such that it is read at the next call to getNextToken()
- Parameters
-
lpinput LP reading data
Definition at line 467 of file reader_diff.c.
References LP_MAX_PUSHEDTOKENS, NULL, and swapPointers().
Referenced by readCoefficients().
◆ swapTokenBuffer()
|
static |
swaps the current token with the token buffer
- Parameters
-
lpinput LP reading data
Definition at line 480 of file reader_diff.c.
References NULL, and swapPointers().
Referenced by isNewSection(), and readCoefficients().
◆ isNewSection()
checks whether the current token is a section identifier, and if yes, switches to the corresponding section
- Parameters
-
scip SCIP data structure lpinput LP reading data
Definition at line 491 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()
returns whether the current token is a sign
- Parameters
-
lpinput LP reading data sign pointer to update the sign
Definition at line 569 of file reader_diff.c.
References FALSE, NULL, and TRUE.
Referenced by readCoefficients().
◆ isValue()
returns whether the current token is a value
- Parameters
-
scip SCIP data structure lpinput LP reading data value pointer to store the value (unchanged, if token is no value)
Definition at line 594 of file reader_diff.c.
References FALSE, NULL, SCIPinfinity(), and TRUE.
Referenced by readCoefficients().
◆ isSense()
returns whether the current token is an equation sense
- Parameters
-
lpinput LP reading data sense pointer to store the equation sense, or NULL
Definition at line 626 of file reader_diff.c.
References FALSE, LP_SENSE_EQ, LP_SENSE_GE, LP_SENSE_LE, NULL, and TRUE.
Referenced by readCoefficients().
◆ getVariable()
|
static |
returns the variable with the given name, or creates a new variable if it does not exist
- Parameters
-
scip SCIP data structure name name of the variable var pointer to store the variable
Definition at line 657 of file reader_diff.c.
References NULL, SCIP_OKAY, SCIP_READERROR, and SCIPfindVar().
Referenced by readCoefficients().
◆ readStart()
|
static |
reads the header of the file
- Parameters
-
scip SCIP data structure lpinput LP reading data
Definition at line 676 of file reader_diff.c.
References getNextToken(), isNewSection(), NULL, and SCIP_OKAY.
Referenced by readDiffFile().
◆ readCoefficients()
|
static |
reads an objective or constraint with name and coefficients
- Parameters
-
scip SCIP data structure lpinput LP reading data isobjective indicates whether we are currently reading the coefficients of the objective name pointer to store the name of the line; must be at least of size LP_MAX_LINELEN coefssize size of vars and coefs arrays vars pointer to store the array with variables (must be freed by caller) coefs pointer to store the array with coefficients (must be freed by caller) ncoefs pointer to store the number of coefficients newsection pointer to store whether a new section was encountered
Definition at line 697 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 |
reads the objective section
- Parameters
-
scip SCIP data structure lpinput LP reading data
Definition at line 897 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 |
reads a diff file
- Parameters
-
scip SCIP data structure lpinput LP reading data filename name of the input file
Definition at line 926 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 |
copy method for reader plugins (called when SCIP copies plugins)
Definition at line 986 of file reader_diff.c.
References NULL, READER_NAME, SCIP_CALL, SCIP_OKAY, SCIPincludeReaderDiff(), and SCIPreaderGetName().
◆ SCIP_DECL_READERFREE()
|
static |
destructor of reader to free user data (called when SCIP is exiting)
Definition at line 1000 of file reader_diff.c.
References SCIP_OKAY.
◆ SCIP_DECL_READERREAD()
|
static |
problem reading method of reader
Definition at line 1007 of file reader_diff.c.
References SCIP_CALL, SCIP_OKAY, and SCIPreadDiff().
Variable Documentation
◆ commentchars
|
static |
Definition at line 107 of file reader_diff.c.
Referenced by getNextLine().