scip_branch.h
Go to the documentation of this file.
38/*---+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8----+----9----+----0----+----1----+----2*/
67 * @note method has all branching rule callbacks as arguments and is thus changed every time a new
68 * callback is added in future releases; consider using SCIPincludeBranchruleBasic() and setter functions
77 int maxdepth, /**< maximal depth level, up to which this branching rule should be used (or -1) */
78 SCIP_Real maxbounddist, /**< maximal relative distance from current node's dual bound to primal bound
81 SCIP_DECL_BRANCHCOPY ((*branchcopy)), /**< copy method of branching rule or NULL if you don't want to copy your plugin into sub-SCIPs */
85 SCIP_DECL_BRANCHINITSOL((*branchinitsol)),/**< solving process initialization method of branching rule */
86 SCIP_DECL_BRANCHEXITSOL((*branchexitsol)),/**< solving process deinitialization method of branching rule */
87 SCIP_DECL_BRANCHEXECLP((*branchexeclp)), /**< branching execution method for fractional LP solutions */
88 SCIP_DECL_BRANCHEXECEXT((*branchexecext)),/**< branching execution method for external candidates */
89 SCIP_DECL_BRANCHEXECPS((*branchexecps)), /**< branching execution method for not completely fixed pseudo solutions */
93/** creates a branching rule and includes it in SCIP. All non-fundamental (or optional) callbacks will be set to NULL.
94 * Optional callbacks can be set via specific setter functions, see SCIPsetBranchruleInit(), SCIPsetBranchruleExit(),
95 * SCIPsetBranchruleCopy(), SCIPsetBranchruleFree(), SCIPsetBranchruleInitsol(), SCIPsetBranchruleExitsol(),
102 * @note if you want to set all callbacks with a single method call, consider using SCIPincludeBranchrule() instead
111 int maxdepth, /**< maximal depth level, up to which this branching rule should be used (or -1) */
112 SCIP_Real maxbounddist, /**< maximal relative distance from current node's dual bound to primal bound
123 SCIP_DECL_BRANCHCOPY ((*branchcopy)) /**< copy method of branching rule or NULL if you don't want to copy your plugin into sub-SCIPs */
155 SCIP_DECL_BRANCHINITSOL((*branchinitsol)) /**< solving process initialization method of branching rule */
163 SCIP_DECL_BRANCHEXITSOL((*branchexitsol)) /**< solving process deinitialization method of branching rule */
171 SCIP_DECL_BRANCHEXECLP((*branchexeclp)) /**< branching execution method for fractional LP solutions */
179 SCIP_DECL_BRANCHEXECEXT((*branchexecext)) /**< branching execution method for external candidates */
187 SCIP_DECL_BRANCHEXECPS((*branchexecps)) /**< branching execution method for not completely fixed pseudo solutions */
217/** sets maximal depth level, up to which this branching rule should be used (-1 for no limit) */
225/** sets maximal relative distance from current node's dual bound to primal bound for applying branching rule */
240/** gets branching candidates for LP solution branching (fractional variables) along with solution values,
241 * fractionalities, and number of branching candidates; the number of branching candidates does not
242 * account for fractional continuous implied integral variables, which should not be used for branching
244 * fractional continuous implied integral variables are stored from *nlpcands to *nlpcands + *nfracimplvars - 1
246 * branching rules should always select the branching candidate among the first npriolpcands of the candidate
249 * @return \ref SCIP_OKAY is returned if everything worked. Otherwise a suitable error code is passed. See \ref
261 SCIP_Real** lpcandssol, /**< pointer to store the array of LP candidate solution values, or NULL */
262 SCIP_Real** lpcandsfrac, /**< pointer to store the array of LP candidate fractionalities, or NULL */
264 int* npriolpcands, /**< pointer to store the number of candidates with maximal priority, or NULL */
265 int* nfracimplvars /**< pointer to store the number of fractional continuous implied integral variables, or NULL */
268/** gets number of branching candidates for LP solution branching (number of fractional variables); implied integral
271 * @return the number of branching candidates for LP solution branching (number of fractional variables).
297/** gets external branching candidates along with solution values, scores, and number of branching candidates;
299 * branching rules should always select the branching candidate among the first nprioexterncands of the candidate
302 * @return \ref SCIP_OKAY is returned if everything worked. Otherwise a suitable error code is passed. See \ref
310 * @note Candidate variables with maximal priority are ordered: binaries first, then integers, implicit integers and
316 SCIP_VAR*** externcands, /**< pointer to store the array of extern branching candidates, or NULL */
317 SCIP_Real** externcandssol, /**< pointer to store the array of extern candidate solution values, or NULL */
318 SCIP_Real** externcandsscore, /**< pointer to store the array of extern candidate scores, or NULL */
320 int* nprioexterncands, /**< pointer to store the number of candidates with maximal priority, or NULL */
321 int* nprioexternbins, /**< pointer to store the number of binary candidates with maximal priority, or NULL */
322 int* nprioexternints, /**< pointer to store the number of integer candidates with maximal priority, or NULL */
323 int* nprioexternimpls /**< pointer to store the number of implicit integer candidates with maximal priority,
385 * @return the number of implicit integer external branching candidates with maximal branch priority.
411/** insert variable, its score and its solution value into the external branching candidate storage
412 * the relative difference of the current lower and upper bounds of a continuous variable must be at least epsilon
414 * @return \ref SCIP_OKAY is returned if everything worked. Otherwise a suitable error code is passed. See \ref
442/** checks whether the given variable is contained in the candidate storage for external branching
444 * @return whether the given variable is contained in the candidate storage for external branching.
457/** gets branching candidates for pseudo solution branching (non-fixed variables) along with the number of candidates
459 * @return \ref SCIP_OKAY is returned if everything worked. Otherwise a suitable error code is passed. See \ref
471 SCIP_VAR*** pseudocands, /**< pointer to store the array of pseudo branching candidates, or NULL */
473 int* npriopseudocands /**< pointer to store the number of candidates with maximal priority, or NULL */
491/** gets number of branching candidates with maximal branch priority for pseudo solution branching
493 * @return the number of branching candidates with maximal branch priority for pseudo solution branching.
506/** gets number of binary branching candidates with maximal branch priority for pseudo solution branching
508 * @return the number of binary branching candidates with maximal branch priority for pseudo solution branching.
520/** gets number of integer branching candidates with maximal branch priority for pseudo solution branching
522 * @return the number of integer branching candidates with maximal branch priority for pseudo solution branching.
534/** gets number of implicit integer branching candidates with maximal branch priority for pseudo solution branching
536 * @return the number of implicit integer branching candidates with maximal branch priority for pseudo solution branching.
565/** calculates the branching score out of the gain predictions for a branching with arbitrary many children
567 * @return the branching score out of the gain predictions for a branching with arbitrary many children.
600/** calculates the node selection priority for moving the given variable's LP value to the given target value;
603 * @return the node selection priority for moving the given variable's LP value to the given target value.
614 SCIP_BRANCHDIR branchdir, /**< type of branching that was performed: upwards, downwards, or fixed;
620/** calculates an estimate for the objective of the best feasible solution contained in the subtree after applying the given
623 * @return the estimate for the objective of the best feasible solution contained in the subtree after applying the given
638/** calculates the increase of the estimate for the objective of the best feasible solution contained in the subtree
641 * @return the increase of the estimate for the objective of the best feasible solution contained in the subtree after
659 * @return \ref SCIP_OKAY is returned if everything worked. Otherwise a suitable error code is passed. See \ref
672 SCIP_Real estimate /**< estimate for (transformed) objective value of best feasible solution in subtree */
684 * @return \ref SCIP_OKAY is returned if everything worked. Otherwise a suitable error code is passed. See \ref
696 SCIP_NODE** downchild, /**< pointer to return the left child with variable rounded down, or NULL */
701/** branches a variable x using a given domain hole; two child nodes (x <= left, x >= right) are created
703 * @return \ref SCIP_OKAY is returned if everything worked. Otherwise a suitable error code is passed. See \ref
722 * for continuous variables with relative domain width larger epsilon, x' must not be one of the bounds;
729 * @return \ref SCIP_OKAY is returned if everything worked. Otherwise a suitable error code is passed. See \ref
742 SCIP_NODE** downchild, /**< pointer to return the left child with variable rounded down, or NULL */
749 * Branches on variable x such that up to n/2 children are created on each side of the usual branching value.
751 * The parameters minwidth and widthfactor determine the domain width of the branching variable in the child nodes.
752 * If n is odd, one child with domain width 'width' and having the branching value in the middle is created.
753 * Otherwise, two children with domain width 'width' and being left and right of the branching value are created.
754 * Next further nodes to the left and right are created, where width is multiplied by widthfactor with increasing distance
756 * The initial width is calculated such that n/2 nodes are created to the left and to the right of the branching value.
757 * If this value is below minwidth, the initial width is set to minwidth, which may result in creating less than n nodes.
759 * Giving a large value for widthfactor results in creating children with small domain when close to the branching value
760 * and large domain when closer to the current variable bounds. That is, setting widthfactor to a very large value and n to 3
761 * results in a ternary branching where the branching variable is mostly fixed in the middle child.
762 * Setting widthfactor to 1.0 results in children where the branching variable always has the same domain width
765 * @return \ref SCIP_OKAY is returned if everything worked. Otherwise a suitable error code is passed. See \ref
780 SCIP_Real widthfactor, /**< multiplier for children domain width with increasing distance from val, must be >= 1.0 */
784/** calls branching rules to branch on an LP solution; if no fractional variables exist, the result is SCIP_DIDNOTRUN;
785 * if the branch priority of an unfixed variable is larger than the maximal branch priority of the fractional
786 * variables, pseudo solution branching is applied on the unfixed variables with maximal branch priority
788 * @return \ref SCIP_OKAY is returned if everything worked. Otherwise a suitable error code is passed. See \ref
802/** calls branching rules to branch on a external candidates; if no such candidates exist, the result is SCIP_DIDNOTRUN
804 * @return \ref SCIP_OKAY is returned if everything worked. Otherwise a suitable error code is passed. See \ref
818/** calls branching rules to branch on a pseudo solution; if no unfixed variables exist, the result is SCIP_DIDNOTRUN
820 * @return \ref SCIP_OKAY is returned if everything worked. Otherwise a suitable error code is passed. See \ref
common defines and data types used in all packages of SCIP
SCIP_RETCODE SCIPsetBranchruleExecExt(SCIP *scip, SCIP_BRANCHRULE *branchrule, SCIP_DECL_BRANCHEXECEXT((*branchexecext)))
Definition: scip_branch.c:272
SCIP_RETCODE SCIPsetBranchruleExit(SCIP *scip, SCIP_BRANCHRULE *branchrule, SCIP_DECL_BRANCHEXIT((*branchexit)))
Definition: scip_branch.c:208
SCIP_RETCODE SCIPsetBranchruleExecLp(SCIP *scip, SCIP_BRANCHRULE *branchrule, SCIP_DECL_BRANCHEXECLP((*branchexeclp)))
Definition: scip_branch.c:256
SCIP_BRANCHRULE * SCIPfindBranchrule(SCIP *scip, const char *name)
Definition: scip_branch.c:304
SCIP_RETCODE SCIPsetBranchruleCopy(SCIP *scip, SCIP_BRANCHRULE *branchrule, SCIP_DECL_BRANCHCOPY((*branchcopy)))
Definition: scip_branch.c:160
SCIP_RETCODE SCIPincludeBranchruleBasic(SCIP *scip, SCIP_BRANCHRULE **branchruleptr, const char *name, const char *desc, int priority, int maxdepth, SCIP_Real maxbounddist, SCIP_BRANCHRULEDATA *branchruledata)
Definition: scip_branch.c:123
SCIP_RETCODE SCIPsetBranchruleExecPs(SCIP *scip, SCIP_BRANCHRULE *branchrule, SCIP_DECL_BRANCHEXECPS((*branchexecps)))
Definition: scip_branch.c:288
SCIP_RETCODE SCIPsetBranchruleFree(SCIP *scip, SCIP_BRANCHRULE *branchrule, SCIP_DECL_BRANCHFREE((*branchfree)))
Definition: scip_branch.c:176
SCIP_RETCODE SCIPsetBranchruleExitsol(SCIP *scip, SCIP_BRANCHRULE *branchrule, SCIP_DECL_BRANCHEXITSOL((*branchexitsol)))
Definition: scip_branch.c:240
SCIP_RETCODE SCIPsetBranchruleInit(SCIP *scip, SCIP_BRANCHRULE *branchrule, SCIP_DECL_BRANCHINIT((*branchinit)))
Definition: scip_branch.c:192
SCIP_RETCODE SCIPsetBranchrulePriority(SCIP *scip, SCIP_BRANCHRULE *branchrule, int priority)
Definition: scip_branch.c:341
SCIP_RETCODE SCIPincludeBranchrule(SCIP *scip, const char *name, const char *desc, int priority, int maxdepth, SCIP_Real maxbounddist, SCIP_DECL_BRANCHCOPY((*branchcopy)), SCIP_DECL_BRANCHFREE((*branchfree)), SCIP_DECL_BRANCHINIT((*branchinit)), SCIP_DECL_BRANCHEXIT((*branchexit)), SCIP_DECL_BRANCHINITSOL((*branchinitsol)), SCIP_DECL_BRANCHEXITSOL((*branchexitsol)), SCIP_DECL_BRANCHEXECLP((*branchexeclp)), SCIP_DECL_BRANCHEXECEXT((*branchexecext)), SCIP_DECL_BRANCHEXECPS((*branchexecps)), SCIP_BRANCHRULEDATA *branchruledata)
Definition: scip_branch.c:71
SCIP_RETCODE SCIPsetBranchruleInitsol(SCIP *scip, SCIP_BRANCHRULE *branchrule, SCIP_DECL_BRANCHINITSOL((*branchinitsol)))
Definition: scip_branch.c:224
SCIP_RETCODE SCIPsetBranchruleMaxbounddist(SCIP *scip, SCIP_BRANCHRULE *branchrule, SCIP_Real maxbounddist)
Definition: scip_branch.c:371
SCIP_RETCODE SCIPsetBranchruleMaxdepth(SCIP *scip, SCIP_BRANCHRULE *branchrule, int maxdepth)
Definition: scip_branch.c:356
int SCIPgetNPrioExternBranchConts(SCIP *scip)
Definition: scip_branch.c:651
SCIP_RETCODE SCIPgetExternBranchCands(SCIP *scip, SCIP_VAR ***externcands, SCIP_Real **externcandssol, SCIP_Real **externcandsscore, int *nexterncands, int *nprioexterncands, int *nprioexternbins, int *nprioexternints, int *nprioexternimpls)
Definition: scip_branch.c:519
SCIP_Real SCIPcalcNodeselPriority(SCIP *scip, SCIP_VAR *var, SCIP_BRANCHDIR branchdir, SCIP_Real targetvalue)
Definition: scip_branch.c:928
SCIP_RETCODE SCIPaddExternBranchCand(SCIP *scip, SCIP_VAR *var, SCIP_Real score, SCIP_Real solval)
Definition: scip_branch.c:673
int SCIPgetNPrioPseudoBranchInts(SCIP *scip)
Definition: scip_branch.c:821
SCIP_Real SCIPgetBranchingPoint(SCIP *scip, SCIP_VAR *var, SCIP_Real suggestion)
Definition: scip_branch.c:905
SCIP_Real SCIPcalcChildEstimate(SCIP *scip, SCIP_VAR *var, SCIP_Real targetvalue)
Definition: scip_branch.c:955
SCIP_Real SCIPcalcChildEstimateIncrease(SCIP *scip, SCIP_VAR *var, SCIP_Real varsol, SCIP_Real targetvalue)
Definition: scip_branch.c:979
int SCIPgetNPrioPseudoBranchBins(SCIP *scip)
Definition: scip_branch.c:803
SCIP_RETCODE SCIPbranchExtern(SCIP *scip, SCIP_RESULT *result)
Definition: scip_branch.c:1264
SCIP_RETCODE SCIPbranchVarValNary(SCIP *scip, SCIP_VAR *var, SCIP_Real val, int n, SCIP_Real minwidth, SCIP_Real widthfactor, int *nchildren)
Definition: scip_branch.c:1196
int SCIPgetNPrioPseudoBranchImpls(SCIP *scip)
Definition: scip_branch.c:839
SCIP_RETCODE SCIPbranchVarVal(SCIP *scip, SCIP_VAR *var, SCIP_Real val, SCIP_NODE **downchild, SCIP_NODE **eqchild, SCIP_NODE **upchild)
Definition: scip_branch.c:1134
SCIP_RETCODE SCIPbranchVarHole(SCIP *scip, SCIP_VAR *var, SCIP_Real left, SCIP_Real right, SCIP_NODE **downchild, SCIP_NODE **upchild)
Definition: scip_branch.c:1099
int SCIPgetNPrioPseudoBranchCands(SCIP *scip)
Definition: scip_branch.c:785
int SCIPgetNPrioExternBranchInts(SCIP *scip)
Definition: scip_branch.c:611
SCIP_RETCODE SCIPgetLPBranchCands(SCIP *scip, SCIP_VAR ***lpcands, SCIP_Real **lpcandssol, SCIP_Real **lpcandsfrac, int *nlpcands, int *npriolpcands, int *nfracimplvars)
Definition: scip_branch.c:402
int SCIPgetNPrioExternBranchBins(SCIP *scip)
Definition: scip_branch.c:591
SCIP_RETCODE SCIPbranchVar(SCIP *scip, SCIP_VAR *var, SCIP_NODE **downchild, SCIP_NODE **eqchild, SCIP_NODE **upchild)
Definition: scip_branch.c:1058
int SCIPgetNPrioExternBranchCands(SCIP *scip)
Definition: scip_branch.c:571
int SCIPgetNPrioExternBranchImpls(SCIP *scip)
Definition: scip_branch.c:631
SCIP_RETCODE SCIPbranchLP(SCIP *scip, SCIP_RESULT *result)
Definition: scip_branch.c:1240
SCIP_RETCODE SCIPgetPseudoBranchCands(SCIP *scip, SCIP_VAR ***pseudocands, int *npseudocands, int *npriopseudocands)
Definition: scip_branch.c:741
SCIP_Real SCIPgetBranchScoreMultiple(SCIP *scip, SCIP_VAR *var, int nchildren, SCIP_Real *gains)
Definition: scip_branch.c:880
SCIP_RETCODE SCIPcreateChild(SCIP *scip, SCIP_NODE **node, SCIP_Real nodeselprio, SCIP_Real estimate)
Definition: scip_branch.c:1025
SCIP_Real SCIPgetBranchScore(SCIP *scip, SCIP_VAR *var, SCIP_Real downgain, SCIP_Real upgain)
Definition: scip_branch.c:857
SCIP_RETCODE SCIPbranchPseudo(SCIP *scip, SCIP_RESULT *result)
Definition: scip_branch.c:1288
SCIP_Bool SCIPcontainsExternBranchCand(SCIP *scip, SCIP_VAR *var)
Definition: scip_branch.c:717
Definition: multiprecision.hpp:66
Definition: struct_branch.h:80
Definition: struct_tree.h:142
Definition: struct_var.h:262
Definition: struct_scip.h:72
type definitions for branching rules
type definitions for branching and inference history
result codes for SCIP callback methods
type definitions for return codes for SCIP methods
type definitions for SCIP's main datastructure
type definitions for branch and bound tree
type definitions for problem variables