Scippy

    SCIP

    Solving Constraint Integer Programs

    scip_reader.c
    Go to the documentation of this file.
    1/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
    2/* */
    3/* This file is part of the program and library */
    4/* SCIP --- Solving Constraint Integer Programs */
    5/* */
    6/* Copyright (c) 2002-2025 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_reader.c
    26 * @ingroup OTHER_CFILES
    27 * @brief public methods for reader plugins
    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/reader.h"
    48#include "scip/scip_reader.h"
    49#include "scip/set.h"
    50#include "scip/struct_scip.h"
    51#include "scip/struct_set.h"
    52
    53/** creates a reader and includes it in SCIP
    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 if SCIP is in one of the following stages:
    59 * - \ref SCIP_STAGE_INIT
    60 * - \ref SCIP_STAGE_PROBLEM
    61 *
    62 * @note method has all reader callbacks as arguments and is thus changed every time a new callback is added
    63 * in future releases; consider using SCIPincludeReaderBasic() and setter functions
    64 * if you seek for a method which is less likely to change in future releases
    65 */
    67 SCIP* scip, /**< SCIP data structure */
    68 const char* name, /**< name of reader */
    69 const char* desc, /**< description of reader */
    70 const char* extension, /**< file extension that reader processes */
    71 SCIP_DECL_READERCOPY ((*readercopy)), /**< copy method of reader or NULL if you don't want to copy your plugin into sub-SCIPs */
    72 SCIP_DECL_READERFREE ((*readerfree)), /**< destructor of reader */
    73 SCIP_DECL_READERREAD ((*readerread)), /**< read method */
    74 SCIP_DECL_READERWRITE ((*readerwrite)), /**< write method */
    75 SCIP_READERDATA* readerdata /**< reader data */
    76 )
    77{
    78 SCIP_READER* reader;
    79
    81
    82 /* check whether reader is already present */
    83 if( SCIPfindReader(scip, name) != NULL )
    84 {
    85 SCIPerrorMessage("reader <%s> already included.\n", name);
    86 return SCIP_INVALIDDATA;
    87 }
    88
    89 SCIP_CALL( SCIPreaderCreate(&reader, scip->set, name, desc, extension, readercopy, readerfree, readerread,
    90 readerwrite, readerdata) );
    91 SCIP_CALL( SCIPsetIncludeReader(scip->set, reader) );
    92
    93 return SCIP_OKAY;
    94}
    95
    96/** creates a reader and includes it in SCIP. All non-fundamental (or optional) callbacks will be set to NULL.
    97 * Optional callbacks can be set via specific setter functions, see
    98 * SCIPsetReaderCopy(), SCIPsetReaderFree(), SCIPsetReaderRead(), SCIPsetReaderWrite().
    99 *
    100 * @return \ref SCIP_OKAY is returned if everything worked. Otherwise a suitable error code is passed. See \ref
    101 * SCIP_Retcode "SCIP_RETCODE" for a complete list of error codes.
    102 *
    103 * @pre This method can be called if SCIP is in one of the following stages:
    104 * - \ref SCIP_STAGE_INIT
    105 * - \ref SCIP_STAGE_PROBLEM
    106 *
    107 * @note if you want to set all callbacks with a single method call, consider using SCIPincludeReader() instead
    108 */
    110 SCIP* scip, /**< SCIP data structure */
    111 SCIP_READER** readerptr, /**< reference to reader pointer, or NULL */
    112 const char* name, /**< name of reader */
    113 const char* desc, /**< description of reader */
    114 const char* extension, /**< file extension that reader processes */
    115 SCIP_READERDATA* readerdata /**< reader data */
    116 )
    117{
    118 SCIP_READER* reader;
    119
    120 SCIP_CALL( SCIPcheckStage(scip, "SCIPincludeReaderBasic", TRUE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE) );
    121
    122 /* check whether reader is already present */
    123 if( SCIPfindReader(scip, name) != NULL )
    124 {
    125 SCIPerrorMessage("reader <%s> already included.\n", name);
    126 return SCIP_INVALIDDATA;
    127 }
    128
    129 SCIP_CALL( SCIPreaderCreate(&reader, scip->set, name, desc, extension, NULL, NULL, NULL, NULL, readerdata) );
    130 SCIP_CALL( SCIPsetIncludeReader(scip->set, reader) );
    131
    132 if( readerptr != NULL )
    133 *readerptr = reader;
    134
    135 return SCIP_OKAY;
    136}
    137
    138/** set copy method of reader
    139 *
    140 * @return \ref SCIP_OKAY is returned if everything worked. Otherwise a suitable error code is passed. See \ref
    141 * SCIP_Retcode "SCIP_RETCODE" for a complete list of error codes.
    142 *
    143 * @pre This method can be called if SCIP is in one of the following stages:
    144 * - \ref SCIP_STAGE_INIT
    145 * - \ref SCIP_STAGE_PROBLEM
    146 */
    148 SCIP* scip, /**< SCIP data structure */
    149 SCIP_READER* reader, /**< reader */
    150 SCIP_DECL_READERCOPY ((*readercopy)) /**< copy method of reader or NULL if you don't want to copy your plugin into sub-SCIPs */
    151 )
    152{
    153 assert(scip != NULL);
    154
    156
    157 SCIPreaderSetCopy(reader, readercopy);
    158
    159 return SCIP_OKAY;
    160}
    161
    162/** set deinitialization method of reader
    163 *
    164 * @return \ref SCIP_OKAY is returned if everything worked. Otherwise a suitable error code is passed. See \ref
    165 * SCIP_Retcode "SCIP_RETCODE" for a complete list of error codes.
    166 *
    167 * @pre This method can be called if SCIP is in one of the following stages:
    168 * - \ref SCIP_STAGE_INIT
    169 * - \ref SCIP_STAGE_PROBLEM
    170 */
    172 SCIP* scip, /**< SCIP data structure */
    173 SCIP_READER* reader, /**< reader */
    174 SCIP_DECL_READERFREE ((*readerfree)) /**< destructor of reader */
    175 )
    176{
    177 assert(scip != NULL);
    178
    180
    181 SCIPreaderSetFree(reader, readerfree);
    182
    183 return SCIP_OKAY;
    184}
    185
    186/** set read method of reader
    187 *
    188 * @return \ref SCIP_OKAY is returned if everything worked. Otherwise a suitable error code is passed. See \ref
    189 * SCIP_Retcode "SCIP_RETCODE" for a complete list of error codes.
    190 *
    191 * @pre This method can be called if SCIP is in one of the following stages:
    192 * - \ref SCIP_STAGE_INIT
    193 * - \ref SCIP_STAGE_PROBLEM
    194 */
    196 SCIP* scip, /**< SCIP data structure */
    197 SCIP_READER* reader, /**< reader */
    198 SCIP_DECL_READERREAD ((*readerread)) /**< read method of reader */
    199 )
    200{
    201 assert(scip != NULL);
    202
    204
    205 SCIPreaderSetRead(reader, readerread);
    206
    207 return SCIP_OKAY;
    208}
    209
    210/** set write method of reader
    211 *
    212 * @return \ref SCIP_OKAY is returned if everything worked. Otherwise a suitable error code is passed. See \ref
    213 * SCIP_Retcode "SCIP_RETCODE" for a complete list of error codes.
    214 *
    215 * @pre This method can be called if SCIP is in one of the following stages:
    216 * - \ref SCIP_STAGE_INIT
    217 * - \ref SCIP_STAGE_PROBLEM
    218 */
    220 SCIP* scip, /**< SCIP data structure */
    221 SCIP_READER* reader, /**< reader */
    222 SCIP_DECL_READERWRITE ((*readerwrite)) /**< write method of reader */
    223 )
    224{
    225 assert(scip != NULL);
    226
    228
    229 SCIPreaderSetWrite(reader, readerwrite);
    230
    231 return SCIP_OKAY;
    232}
    233
    234/** returns the reader of the given name, or NULL if not existing */
    236 SCIP* scip, /**< SCIP data structure */
    237 const char* name /**< name of reader */
    238 )
    239{
    240 assert(scip != NULL);
    241 assert(scip->set != NULL);
    242 assert(name != NULL);
    243
    244 return SCIPsetFindReader(scip->set, name);
    245}
    246
    247/** returns the array of currently available readers */
    249 SCIP* scip /**< SCIP data structure */
    250 )
    251{
    252 assert(scip != NULL);
    253 assert(scip->set != NULL);
    254
    255 return scip->set->readers;
    256}
    257
    258/** returns the number of currently available readers */
    260 SCIP* scip /**< SCIP data structure */
    261 )
    262{
    263 assert(scip != NULL);
    264 assert(scip->set != NULL);
    265
    266 return scip->set->nreaders;
    267}
    SCIP_DECL_READERREAD(ReaderTSP::scip_read)
    Definition: ReaderTSP.cpp:211
    SCIP_DECL_READERWRITE(ReaderTSP::scip_write)
    Definition: ReaderTSP.cpp:546
    SCIP_DECL_READERFREE(ReaderTSP::scip_free)
    Definition: ReaderTSP.cpp:198
    methods for debugging
    #define SCIPcheckStage(scip, method, init, problem, transforming, transformed, initpresolve, presolving, exitpresolve, presolved, initsolve, solving, solved, exitsolve, freetrans, freescip)
    Definition: debug.h:364
    #define NULL
    Definition: def.h:248
    #define TRUE
    Definition: def.h:93
    #define FALSE
    Definition: def.h:94
    #define SCIP_CALL(x)
    Definition: def.h:355
    SCIP_RETCODE SCIPincludeReader(SCIP *scip, const char *name, const char *desc, const char *extension, SCIP_DECL_READERCOPY((*readercopy)), SCIP_DECL_READERFREE((*readerfree)), SCIP_DECL_READERREAD((*readerread)), SCIP_DECL_READERWRITE((*readerwrite)), SCIP_READERDATA *readerdata)
    Definition: scip_reader.c:66
    SCIP_RETCODE SCIPincludeReaderBasic(SCIP *scip, SCIP_READER **readerptr, const char *name, const char *desc, const char *extension, SCIP_READERDATA *readerdata)
    Definition: scip_reader.c:109
    SCIP_RETCODE SCIPsetReaderCopy(SCIP *scip, SCIP_READER *reader, SCIP_DECL_READERCOPY((*readercopy)))
    Definition: scip_reader.c:147
    SCIP_READER * SCIPfindReader(SCIP *scip, const char *name)
    Definition: scip_reader.c:235
    SCIP_RETCODE SCIPsetReaderFree(SCIP *scip, SCIP_READER *reader, SCIP_DECL_READERFREE((*readerfree)))
    Definition: scip_reader.c:171
    int SCIPgetNReaders(SCIP *scip)
    Definition: scip_reader.c:259
    SCIP_RETCODE SCIPsetReaderRead(SCIP *scip, SCIP_READER *reader, SCIP_DECL_READERREAD((*readerread)))
    Definition: scip_reader.c:195
    SCIP_READER ** SCIPgetReaders(SCIP *scip)
    Definition: scip_reader.c:248
    SCIP_RETCODE SCIPsetReaderWrite(SCIP *scip, SCIP_READER *reader, SCIP_DECL_READERWRITE((*readerwrite)))
    Definition: scip_reader.c:219
    public methods for message output
    #define SCIPerrorMessage
    Definition: pub_message.h:64
    void SCIPreaderSetFree(SCIP_READER *reader, SCIP_DECL_READERFREE((*readerfree)))
    Definition: reader.c:637
    void SCIPreaderSetCopy(SCIP_READER *reader, SCIP_DECL_READERCOPY((*readercopy)))
    Definition: reader.c:626
    void SCIPreaderSetWrite(SCIP_READER *reader, SCIP_DECL_READERWRITE((*readerwrite)))
    Definition: reader.c:659
    SCIP_RETCODE SCIPreaderCreate(SCIP_READER **reader, SCIP_SET *set, const char *name, const char *desc, const char *extension, SCIP_DECL_READERCOPY((*readercopy)), SCIP_DECL_READERFREE((*readerfree)), SCIP_DECL_READERREAD((*readerread)), SCIP_DECL_READERWRITE((*readerwrite)), SCIP_READERDATA *readerdata)
    Definition: reader.c:113
    void SCIPreaderSetRead(SCIP_READER *reader, SCIP_DECL_READERREAD((*readerread)))
    Definition: reader.c:648
    internal methods for input file readers
    public methods for reader plugins
    SCIP_RETCODE SCIPsetIncludeReader(SCIP_SET *set, SCIP_READER *reader)
    Definition: set.c:3917
    SCIP_READER * SCIPsetFindReader(SCIP_SET *set, const char *name)
    Definition: set.c:3939
    internal methods for global SCIP settings
    SCIP main data structure.
    datastructures for global SCIP settings
    struct SCIP_ReaderData SCIP_READERDATA
    Definition: type_reader.h:54
    #define SCIP_DECL_READERCOPY(x)
    Definition: type_reader.h:63
    @ SCIP_INVALIDDATA
    Definition: type_retcode.h:52
    @ SCIP_OKAY
    Definition: type_retcode.h:42
    enum SCIP_Retcode SCIP_RETCODE
    Definition: type_retcode.h:63