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>
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
Definition at line 77 of file reader_diff.c.
◆ LPEXPTYPE
Definition at line 83 of file reader_diff.c.
◆ 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()
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 120 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 147 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 158 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 179 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 203 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 247 of file reader_diff.c.
References BMSclearMemoryArray, commentchars, FALSE, NULL, SCIP_CALL_ABORT, SCIPcalcMemGrowSize(), SCIPfgets(), SCIPreallocBlockMemoryArray, and TRUE.
Referenced by getNextToken().
◆ swapPointers()
|
static |
swaps the addresses of two pointers
- Parameters
-
pointer1 first pointer pointer2 second pointer
Definition at line 305 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 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 |
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 427 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 440 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 453 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 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()
returns whether the current token is a sign
- Parameters
-
lpinput LP reading data sign pointer to update the sign
Definition at line 542 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 567 of file reader_diff.c.
References FALSE, NULL, SCIPinfinity(), SCIPstrcasecmp(), 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 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 |
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 630 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 649 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 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 |
reads the objective section
- Parameters
-
scip SCIP data structure lpinput LP 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 |
reads a diff file
- Parameters
-
scip SCIP data structure lpinput LP reading data filename name 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 |
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 |
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 |
problem reading method of reader
Definition at line 980 of file reader_diff.c.
References SCIP_CALL, SCIP_OKAY, and SCIPreadDiff().
Variable Documentation
◆ commentchars
|
static |
Definition at line 111 of file reader_diff.c.
Referenced by getNextLine().