Scippy

    SCIP

    Solving Constraint Integer Programs

    scip_concurrent.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_concurrent.c
    26 * @ingroup OTHER_CFILES
    27 * @brief public methods for concurrent solving mode
    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/concsolver.h"
    46#include "scip/debug.h"
    47#include "scip/pub_message.h"
    49#include "scip/set.h"
    50#include "scip/struct_mem.h"
    51#include "scip/struct_scip.h"
    52#include "scip/struct_set.h"
    53#include "scip/syncstore.h"
    54
    55/** creates a concurrent solver type and includes it in SCIP.
    56 *
    57 * @return \ref SCIP_OKAY is returned if everything worked. otherwise a suitable error code is passed. see \ref
    58 * SCIP_Retcode "SCIP_RETCODE" for a complete list of error codes.
    59 *
    60 * @pre This method can be called if @p scip is in one of the following stages:
    61 * - \ref SCIP_STAGE_INIT
    62 * - \ref SCIP_STAGE_PROBLEM
    63 */
    65 SCIP* scip, /**< SCIP data structure */
    66 const char* name, /**< name of concurrent_solver */
    67 SCIP_Real prefpriodefault, /**< the default preferred priority of this concurrent solver type */
    68 SCIP_DECL_CONCSOLVERCREATEINST ((*concsolvercreateinst)), /**< data copy method of concurrent solver */
    69 SCIP_DECL_CONCSOLVERDESTROYINST ((*concsolverdestroyinst)), /**< data copy method of concurrent solver */
    70 SCIP_DECL_CONCSOLVERINITSEEDS ((*concsolverinitseeds)), /**< initialize random seeds of concurrent solver */
    71 SCIP_DECL_CONCSOLVEREXEC ((*concsolverexec)), /**< execution method of concurrent solver */
    72 SCIP_DECL_CONCSOLVERCOPYSOLVINGDATA ((*concsolvercopysolvdata)),/**< method to copy solving data */
    73 SCIP_DECL_CONCSOLVERSTOP ((*concsolverstop)), /**< terminate solving in concurrent solver */
    74 SCIP_DECL_CONCSOLVERSYNCWRITE ((*concsolversyncwrite)), /**< synchronization method of concurrent solver */
    75 SCIP_DECL_CONCSOLVERSYNCREAD ((*concsolversyncread)), /**< synchronization method of concurrent solver */
    76 SCIP_DECL_CONCSOLVERTYPEFREEDATA ((*concsolvertypefreedata)),/**< method to free data of concurrent solver type */
    77 SCIP_CONCSOLVERTYPEDATA* data /**< the concurent solver type's data */
    78 )
    79{
    80 SCIP_CONCSOLVERTYPE* concsolvertype;
    81
    82 SCIP_CALL( SCIPcheckStage(scip, "SCIPincludeConcsolverType", TRUE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE) );
    83
    84 /* check whether concurrent solver type is already present */
    85 if( SCIPfindConcsolverType(scip, name) != NULL )
    86 {
    87 SCIPerrorMessage("concurrent solver type <%s> already included.\n", name);
    88 return SCIP_INVALIDDATA;
    89 }
    90
    91 SCIP_CALL( SCIPconcsolverTypeCreate(&concsolvertype, scip->set, scip->messagehdlr, scip->mem->setmem,
    92 name, prefpriodefault, concsolvercreateinst, concsolverdestroyinst,
    93 concsolverinitseeds, concsolverexec, concsolvercopysolvdata,
    94 concsolverstop, concsolversyncwrite, concsolversyncread,
    95 concsolvertypefreedata, data) );
    96
    97 SCIP_CALL( SCIPsetIncludeConcsolverType(scip->set, concsolvertype) );
    98
    99 return SCIP_OKAY;
    100}
    101
    102/** returns the concurrent solver type with the given name, or NULL if not existing */
    104 SCIP* scip, /**< SCIP data structure */
    105 const char* name /**< name of concurrent_solver */
    106 )
    107{
    108 assert(scip != NULL);
    109 assert(scip->set != NULL);
    110 assert(name != NULL);
    111
    112 return SCIPsetFindConcsolverType(scip->set, name);
    113}
    114
    115/** returns the array of included concurrent solver types */
    117 SCIP* scip /**< SCIP data structure */
    118 )
    119{
    120 assert(scip != NULL);
    121 assert(scip->set != NULL);
    122
    123 return scip->set->concsolvertypes;
    124}
    125
    126/** returns the number of included concurrent solver types */
    128 SCIP* scip /**< SCIP data structure */
    129 )
    130{
    131 assert(scip != NULL);
    132 assert(scip->set != NULL);
    133
    134 return scip->set->nconcsolvertypes;
    135}
    136
    137/** Constructs the parallel interface to execute processes concurrently.
    138 *
    139 * @return \ref SCIP_OKAY is returned if everything worked. Otherwise a suitable error code is passed. See \ref
    140 * SCIP_Retcode "SCIP_RETCODE" for a complete list of error codes.
    141 *
    142 * @pre This method can be called if @p scip is in one of the following stages:
    143 * - \ref SCIP_STAGE_PROBLEM
    144 * - \ref SCIP_STAGE_TRANSFORMING
    145 * - \ref SCIP_STAGE_TRANSFORMED
    146 * - \ref SCIP_STAGE_INITPRESOLVE
    147 * - \ref SCIP_STAGE_PRESOLVING
    148 * - \ref SCIP_STAGE_EXITPRESOLVE
    149 * - \ref SCIP_STAGE_PRESOLVED
    150 * - \ref SCIP_STAGE_INITSOLVE
    151 * - \ref SCIP_STAGE_SOLVING
    152 * - \ref SCIP_STAGE_SOLVED
    153 * - \ref SCIP_STAGE_EXITSOLVE
    154 * - \ref SCIP_STAGE_FREETRANS
    155 *
    156 * See \ref SCIP_Stage "SCIP_STAGE" for a complete list of all possible solving stages.
    157 */
    159 SCIP* scip /**< SCIP data structure */
    160 )
    161{
    162 SCIP_CALL( SCIPcheckStage(scip, "SCIPconstructSyncstore", FALSE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, FALSE) );
    163
    164 SCIP_CALL( SCIPsyncstoreCreate(&scip->syncstore) );
    165
    166 return SCIP_OKAY;
    167}
    168
    169/** releases the current parallel interface
    170 *
    171 * @return \ref SCIP_OKAY is returned if everything worked. Otherwise a suitable error code is passed. See \ref
    172 * SCIP_Retcode "SCIP_RETCODE" for a complete list of error codes.
    173 *
    174 * @pre This method can be called if @p scip is in one of the following stages:
    175 * - \ref SCIP_STAGE_PROBLEM
    176 * - \ref SCIP_STAGE_TRANSFORMING
    177 * - \ref SCIP_STAGE_TRANSFORMED
    178 * - \ref SCIP_STAGE_INITPRESOLVE
    179 * - \ref SCIP_STAGE_PRESOLVING
    180 * - \ref SCIP_STAGE_EXITPRESOLVE
    181 * - \ref SCIP_STAGE_PRESOLVED
    182 * - \ref SCIP_STAGE_INITSOLVE
    183 * - \ref SCIP_STAGE_SOLVING
    184 * - \ref SCIP_STAGE_SOLVED
    185 * - \ref SCIP_STAGE_EXITSOLVE
    186 * - \ref SCIP_STAGE_FREETRANS
    187 * - \ref SCIP_STAGE_FREE
    188 *
    189 * See \ref SCIP_Stage "SCIP_STAGE" for a complete list of all possible solving stages.
    190 */
    192 SCIP* scip /**< SCIP data structure */
    193 )
    194{
    195 SCIP_CALL( SCIPcheckStage(scip, "SCIPfreeSyncstore", FALSE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE) );
    196
    197 SCIP_CALL( SCIPsyncstoreRelease(&(scip->syncstore)) );
    198
    199 return SCIP_OKAY;
    200}
    201
    202/** Gets the parallel interface to execute processes concurrently.
    203 *
    204 * @return the \ref SCIP_SYNCSTORE parallel interface pointer to submit jobs for concurrent processing.
    205 *
    206 * @pre This method can be called if @p scip is in one of the following stages:
    207 * - \ref SCIP_STAGE_INIT
    208 * - \ref SCIP_STAGE_PROBLEM
    209 * - \ref SCIP_STAGE_TRANSFORMING
    210 * - \ref SCIP_STAGE_TRANSFORMED
    211 * - \ref SCIP_STAGE_INITPRESOLVE
    212 * - \ref SCIP_STAGE_PRESOLVING
    213 * - \ref SCIP_STAGE_EXITPRESOLVE
    214 * - \ref SCIP_STAGE_PRESOLVED
    215 * - \ref SCIP_STAGE_INITSOLVE
    216 * - \ref SCIP_STAGE_SOLVING
    217 * - \ref SCIP_STAGE_SOLVED
    218 * - \ref SCIP_STAGE_EXITSOLVE
    219 * - \ref SCIP_STAGE_FREETRANS
    220 *
    221 * See \ref SCIP_Stage "SCIP_STAGE" for a complete list of all possible solving stages.
    222 */
    224 SCIP* scip /**< SCIP data structure */
    225 )
    226{
    227 SCIP_CALL_ABORT( SCIPcheckStage(scip, "SCIPgetSyncstore", TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, FALSE) );
    228
    229 return scip->syncstore;
    230}
    SCIP_RETCODE SCIPconcsolverTypeCreate(SCIP_CONCSOLVERTYPE **concsolvertype, SCIP_SET *set, SCIP_MESSAGEHDLR *messagehdlr, BMS_BLKMEM *blkmem, const char *name, SCIP_Real prefpriodefault, SCIP_DECL_CONCSOLVERCREATEINST((*concsolvercreateinst)), SCIP_DECL_CONCSOLVERDESTROYINST((*concsolverdestroyinst)), SCIP_DECL_CONCSOLVERINITSEEDS((*concsolverinitseeds)), SCIP_DECL_CONCSOLVEREXEC((*concsolverexec)), SCIP_DECL_CONCSOLVERCOPYSOLVINGDATA((*concsolvercopysolvdata)), SCIP_DECL_CONCSOLVERSTOP((*concsolverstop)), SCIP_DECL_CONCSOLVERSYNCWRITE((*concsolversyncwrite)), SCIP_DECL_CONCSOLVERSYNCREAD((*concsolversyncread)), SCIP_DECL_CONCSOLVERTYPEFREEDATA((*concsolvertypefreedata)), SCIP_CONCSOLVERTYPEDATA *data)
    Definition: concsolver.c:113
    datastructures for concurrent solvers
    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 SCIP_Real
    Definition: def.h:156
    #define TRUE
    Definition: def.h:93
    #define FALSE
    Definition: def.h:94
    #define SCIP_CALL_ABORT(x)
    Definition: def.h:334
    #define SCIP_CALL(x)
    Definition: def.h:355
    SCIP_CONCSOLVERTYPE ** SCIPgetConcsolverTypes(SCIP *scip)
    SCIP_RETCODE SCIPincludeConcsolverType(SCIP *scip, const char *name, SCIP_Real prefpriodefault, SCIP_DECL_CONCSOLVERCREATEINST((*concsolvercreateinst)), SCIP_DECL_CONCSOLVERDESTROYINST((*concsolverdestroyinst)), SCIP_DECL_CONCSOLVERINITSEEDS((*concsolverinitseeds)), SCIP_DECL_CONCSOLVEREXEC((*concsolverexec)), SCIP_DECL_CONCSOLVERCOPYSOLVINGDATA((*concsolvercopysolvdata)), SCIP_DECL_CONCSOLVERSTOP((*concsolverstop)), SCIP_DECL_CONCSOLVERSYNCWRITE((*concsolversyncwrite)), SCIP_DECL_CONCSOLVERSYNCREAD((*concsolversyncread)), SCIP_DECL_CONCSOLVERTYPEFREEDATA((*concsolvertypefreedata)), SCIP_CONCSOLVERTYPEDATA *data)
    SCIP_CONCSOLVERTYPE * SCIPfindConcsolverType(SCIP *scip, const char *name)
    int SCIPgetNConcsolverTypes(SCIP *scip)
    SCIP_SYNCSTORE * SCIPgetSyncstore(SCIP *scip)
    SCIP_RETCODE SCIPfreeSyncstore(SCIP *scip)
    SCIP_RETCODE SCIPconstructSyncstore(SCIP *scip)
    public methods for message output
    #define SCIPerrorMessage
    Definition: pub_message.h:64
    public methods for concurrent solving mode
    SCIP_RETCODE SCIPsetIncludeConcsolverType(SCIP_SET *set, SCIP_CONCSOLVERTYPE *concsolvertype)
    Definition: set.c:4752
    SCIP_CONCSOLVERTYPE * SCIPsetFindConcsolverType(SCIP_SET *set, const char *name)
    Definition: set.c:4774
    internal methods for global SCIP settings
    datastructures for block memory pools and memory buffers
    SCIP main data structure.
    datastructures for global SCIP settings
    SCIP_RETCODE SCIPsyncstoreRelease(SCIP_SYNCSTORE **syncstore)
    Definition: syncstore.c:89
    SCIP_RETCODE SCIPsyncstoreCreate(SCIP_SYNCSTORE **syncstore)
    Definition: syncstore.c:67
    the function declarations for the synchronization store
    #define SCIP_DECL_CONCSOLVERSTOP(x)
    #define SCIP_DECL_CONCSOLVERINITSEEDS(x)
    #define SCIP_DECL_CONCSOLVERTYPEFREEDATA(x)
    #define SCIP_DECL_CONCSOLVERSYNCWRITE(x)
    #define SCIP_DECL_CONCSOLVERDESTROYINST(x)
    #define SCIP_DECL_CONCSOLVERCOPYSOLVINGDATA(x)
    struct SCIP_ConcSolverTypeData SCIP_CONCSOLVERTYPEDATA
    #define SCIP_DECL_CONCSOLVEREXEC(x)
    #define SCIP_DECL_CONCSOLVERCREATEINST(x)
    #define SCIP_DECL_CONCSOLVERSYNCREAD(x)
    @ SCIP_INVALIDDATA
    Definition: type_retcode.h:52
    @ SCIP_OKAY
    Definition: type_retcode.h:42
    enum SCIP_Retcode SCIP_RETCODE
    Definition: type_retcode.h:63