/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
/*                                                                           */
/*                  This file is part of the program and library             */
/*         SCIP --- Solving Constraint Integer Programs                      */
/*                                                                           */
/*    Copyright (C) 2002-2022 Konrad-Zuse-Zentrum                            */
/*                            fuer Informationstechnik Berlin                */
/*                                                                           */
/*  SCIP is distributed under the terms of the ZIB Academic License.         */
/*                                                                           */
/*  You should have received a copy of the ZIB Academic License              */
/*  along with SCIP; see the file COPYING. If not visit scipopt.org.         */
/*                                                                           */
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */

/**@file   type_cutsel.h
 * @ingroup TYPEDEFINITIONS
 * @brief  type definitions for cut selectors
 * @author Felipe Serrano
 * @author Mark Turner
 */

/** @defgroup DEFPLUGINS_CUTSEL Default cut selectors
 *  @ingroup DEFPLUGINS
 *  @brief implementation files (.c files) of the default cut selectors of SCIP
 */

/*---+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8----+----9----+----0----+----1----+----2*/

#ifndef __SCIP_TYPE_CUTSEL_H__
#define __SCIP_TYPE_CUTSEL_H__

#include "scip/def.h"
#include "scip/type_retcode.h"
#include "scip/type_scip.h"
#include "scip/type_lp.h"
#include "scip/type_result.h"

#ifdef __cplusplus
extern "C" {
#endif

typedef struct SCIP_Cutsel SCIP_CUTSEL;         /**< cut selector data structure */
typedef struct SCIP_CutselData SCIP_CUTSELDATA; /**< cut selector specific data */


/** copy method for cut selector plugins (called when SCIP copies plugins)
 *
 *  input:
 *  - scip            : SCIP main data structure
 *  - cutsel          : the cut selector itself
 */
#define SCIP_DECL_CUTSELCOPY(x) SCIP_RETCODE x (SCIP* scip, SCIP_CUTSEL* cutsel)

/** destructor of cut selector to free user data (called when SCIP is exiting)
 *
 *  input:
 *  - scip            : SCIP main data structure
 *  - cutsel          : the cut selector itself
 */
#define SCIP_DECL_CUTSELFREE(x) SCIP_RETCODE x (SCIP* scip, SCIP_CUTSEL* cutsel)

/** initialization method of cut selector (called after problem was transformed)
 *
 *  input:
 *  - scip            : SCIP main data structure
 *  - cutsel          : the cut selector itself
 */
#define SCIP_DECL_CUTSELINIT(x) SCIP_RETCODE x (SCIP* scip, SCIP_CUTSEL* cutsel)

/** deinitialization method of cut selector (called before transformed problem is freed)
 *
 *  input:
 *  - scip            : SCIP main data structure
 *  - cutsel          : the cut selector itself
 */
#define SCIP_DECL_CUTSELEXIT(x) SCIP_RETCODE x (SCIP* scip, SCIP_CUTSEL* cutsel)

/** solving process initialization method of cut selector (called when branch and bound process is about to begin)
 *
 *  This method is called when the presolving was finished and the branch and bound process is about to begin.
 *  The cut selector may use this call to initialize its branch and bound specific data.
 *
 *  input:
 *  - scip            : SCIP main data structure
 *  - cutsel          : the cut selector itself
 */
#define SCIP_DECL_CUTSELINITSOL(x) SCIP_RETCODE x (SCIP* scip, SCIP_CUTSEL* cutsel)

/** solving process deinitialization method of cut selector (called before branch and bound process data is freed)
 *
 *  This method is called before the branch and bound process is freed.
 *  The cut selector should use this call to clean up its branch and bound data.
 *
 *  input:
 *  - scip            : SCIP main data structure
 *  - cutsel          : the cut selector itself
 */
#define SCIP_DECL_CUTSELEXITSOL(x) SCIP_RETCODE x (SCIP* scip, SCIP_CUTSEL* cutsel)

/** cut selection method of cut selector
 *
 *  This method is called to select the cuts to be added to the LP.
 *  Forcedcuts must not be changed, and cuts should only be resorted, with the first nselectedcuts of cuts being chosen.
 *  These nselectededcuts are used in addition to the forcedcuts (do not delete nor modify elements, simply resort).
 *
 *  input:
 *  - scip            : SCIP main data structure
 *  - cutsel          : the cut selector itself
 *  - cuts            : cutting planes to select from
 *  - ncuts           : number of cutting planes to select from (length of cuts)
 *  - forcedcuts      : list of cuts that are forced to be applied (i.e they are going to be selected no matter what)
 *  - nforcedcuts     : number of forced cuts
 *  - root            : are we at the root node?
 *  - maxselectedcuts : maximum number of cuts that can be selected (upper bound for nselectedcuts)
 *  - nselectedcuts   : the first nselectedcuts from cuts are selected
 *  - result          : pointer to store the result of the cut selection call
 *
 *  possible return values for *result (if more than one applies, the first in the list should be used):
 *  - SCIP_SUCCESS    : the cut selection succeeded
 *  - SCIP_DIDNOTFIND : the cut selection did not find good enough cuts to select
 */
#define SCIP_DECL_CUTSELSELECT(x) SCIP_RETCODE x (SCIP* scip, SCIP_CUTSEL* cutsel, SCIP_ROW** cuts, int ncuts, \
      SCIP_ROW** forcedcuts, int nforcedcuts, SCIP_Bool root, int maxnselectedcuts, int* nselectedcuts, SCIP_RESULT* result)

#ifdef __cplusplus
}
#endif

#endif
