branch_generic.c
Go to the documentation of this file.
36 /*---+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8----+----9----+----0----+----1----+----2*/
77 #define EVENTHDLR_DESC "event handler for adding a new generated mastervar into the right branching constraints by using Vanderbecks generic branching scheme"
82 GCG_COMPSEQUENCE** C; /**< S[k] bound sequence for block k */ /* !!! sort of each C[i] = S is important !!! */
84 SCIP_CONS* mastercons; /**< constraint enforcing the branching restriction in the master problem */
85 GCG_COMPSEQUENCE* consS; /**< component bound sequence which induce the current branching constraint */
88 int consblocknr; /**< id of the pricing problem (or block) to which this branching constraint belongs */
165 if( GCGvarGetBlock(mastervar) == -1 || GCGbranchGenericBranchdataGetConsblocknr(branchdata) == -3 || !GCGisMasterVarInBlock(mastervar, GCGbranchGenericBranchdataGetConsblocknr(branchdata)) )
174 generatorentry = getGeneratorEntry(mastervar, GCGbranchGenericBranchdataGetConsS(branchdata)[p].component);
197 SCIP_CALL( SCIPaddCoefLinear(scip, GCGbranchGenericBranchdataGetMastercons(branchdata), mastervar, 1.0) );
219 (void) SCIPsnprintf(name, SCIP_MAXSTRLEN, "directchild(%d, %g) sense = %d", branchdata->consSsize, branchdata->consS[0].bound, branchdata->consS[0].sense);
224 SCIP_CALL( SCIPcreateConsLinear(scip, &(branchdata->mastercons), name, 0, NULL, NULL, branchdata->consS[0].bound, SCIPinfinity(scip), TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, FALSE, FALSE, TRUE) );
227 SCIP_CALL( SCIPcreateConsLinear(scip, &(branchdata->mastercons), name, 0, NULL, NULL, -SCIPinfinity(scip), branchdata->consS[0].bound-1, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, FALSE, FALSE, TRUE) );
230 SCIP_CALL( SCIPaddCoefLinear(scip, branchdata->mastercons, branchdata->consS[0].component, 1.0) );
252 (void) SCIPsnprintf(name, SCIP_MAXSTRLEN, "child(%d, %g)", branchdata->consSsize, branchdata->lhs);
258 branchdata->lhs, SCIPinfinity(scip), TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, FALSE, FALSE, TRUE) );
264 /** solving process initialization method of event handler (called when branch and bound process is about to begin) */
278 /** solving process deinitialization method of event handler (called before branch and bound process data is freed) */
340 && GCGbranchGenericBranchdataGetConsS(branchdata) != NULL && GCGbranchGenericBranchdataGetConsSsize(branchdata) > 0 )
342 if( GCGconsMasterbranchGetBranchrule(parentcons) == NULL || strcmp(SCIPbranchruleGetName(GCGconsMasterbranchGetBranchrule(parentcons)), "generic") != 0 )
348 if( (GCGbranchGenericBranchdataGetConsblocknr(branchdata) != GCGvarGetBlock(mastervar) && GCGvarGetBlock(mastervar) != -1 )
404 /* TODO: allocate memory for norigvars although there might be slots for continuous variables which are not needed? */
566 if( SCIPisFeasGT(origprob, getGeneratorEntry(mastervar1, origvars[i]), getGeneratorEntry(mastervar2, origvars[i])) )
569 if( SCIPisFeasLT(origprob, getGeneratorEntry(mastervar1, origvars[i]), getGeneratorEntry(mastervar2, origvars[i])) )
681 if( SCIPisGE(scip, getGeneratorEntry(mastervar1, origvar), ivalue) && SCIPisGE(scip, getGeneratorEntry(mastervar2, origvar), ivalue) )
726 if( SCIPisLT(scip, getGeneratorEntry(mastervar1, origvar), ivalue) && SCIPisLT(scip, getGeneratorEntry(mastervar2, origvar), ivalue) )
771 if( SCIPisGT(scip, getGeneratorEntry(mastervar1, origvar), getGeneratorEntry(mastervar2, origvar)) )
788 returnvalue = ILOcomp(strip1->scip, strip1->mastervar, strip2->mastervar, strip1->C, strip1->Csize, strip1->sequencesizes, 1);
839 SCIP_VAR** origvar, /**< pointer to store the variable which belongs to a discriminating component with maximum priority */
923 SCIP_CALL( SCIPreallocBlockMemoryArray(scip, &(record->sequencesizes), record->recordcapacity, i) );
924 SCIP_CALL( SCIPreallocBlockMemoryArray(scip, &(record->capacities), record->recordcapacity, i) );
930 SCIP_CALL( SCIPallocBlockMemoryArray(scip, &(record->record[record->recordsize]), i) ); /*lint !e866*/
1009 SCIPdebugPrintf("Fsize = %d; Ssize = %d, IndexSetSize = %d, nuF=%.6g \n", Fsize, Ssize, IndexSetSize, muF);
1089 SCIPdebugMessage("new median is %g, comp=%s, Ssize=%d\n", median, SCIPvarGetName(origvar), Ssize);
1259 int minSizeOfMaxPriority; /* needed if the last comp priority is equal to the one in other bound sequences */
1321 /** updates the new set of sequences C in CopyC and the corresponding size array newsequencesizes
1394 SCIP_VAR** IndexSet, /**< array of original variables which belong to the fractional master columns */
1395 int IndexSetSize, /**< number of original variables which belong to fractional master columns. Note that IndexSetSize >= Fsize */
1436 SCIPdebugMessage("with Fsize = %d, Csize = %d, Ssize = %d, p = %d\n", Fsize, Csize, *Ssize, p);
1625 k = computeNewSequence(Csize, p, origvar, sequencesizes, C, CopyC, newsequencesizes, GCG_COMPSENSE_GE);
1637 SCIP_CALL( Explore( scip, CopyC, Cupper, newsequencesizes, p+1, copyF, Fupper, IndexSet, IndexSetSize, S, Ssize, record) );
1661 k = computeNewSequence(Csize, p, origvar, sequencesizes, C, CopyC, newsequencesizes, GCG_COMPSENSE_LT);
1673 SCIP_CALL( Explore( scip, CopyC, Clower, newsequencesizes, p+1, copyF, Flower, IndexSet, IndexSetSize, &lowerS, &lowerSsize, record) );
1754 SCIP_CALL( Explore( scip, C, Csize, CompSizes, 1, F, Fsize, IndexSet, IndexSetSize, &exploreS, &exploreSsize, record) );
1763 SCIP_CALL( SCIPgetVarsData(GCGgetMasterprob(scip), &mastervars, &nmastervars, NULL, NULL, NULL, NULL) );
1808 SCIP_CALL( SCIPallocBufferArray(scip, &((*checkedblockssortstrips)[(*ncheckedblocks)-1]), nstrips) ); /*lint !e866*/
1816 SCIP_CALL( SCIPallocBuffer(scip, &(*checkedblockssortstrips[*ncheckedblocks-1][i])) ); /*lint !e866*/
1829 SCIP_CALL( GCGbranchGenericInitbranch(GCGgetMasterprob(scip), branchrule, result, checkedblocks, ncheckedblocks, checkedblockssortstrips, checkedblocksnsortstrips) );
1889 SCIPdebugMessage("branchDataDeleteGeneric: child blocknr %d, %s\n", (*branchdata)->consblocknr,
1894 SCIPdebugMessage("branchDataDeleteGeneric: child blocknr %d, empty mastercons\n", (*branchdata)->consblocknr);
1947 if( GCGconsMasterbranchGetBranchrule(childcons) != NULL && strcmp(SCIPbranchruleGetName(GCGconsMasterbranchGetBranchrule(childcons)), "generic") != 0 )
1953 if( childBlocknr != branchdata->consblocknr || childSsize != branchdata->consSsize || !SCIPisEQ(scip, lhs, branchdata->lhs) )
2088 SCIPdebugMessage("Vanderbeck branching rule Node creation for blocknr %d with %.1f identical blocks \n", blocknr, pL);
2099 SCIP_CALL( SCIPgetLPBranchCands(masterscip, &branchcands, NULL, NULL, &nbranchcands, NULL, NULL) );
2119 SCIP_CALL( SCIPallocBlockMemoryArray(scip, &(branchchilddata->consS), branchchilddata->maxconsS) );
2125 SCIP_CALL( SCIPallocBlockMemoryArray(scip, &(branchchilddata->consS), branchchilddata->maxconsS) );
2222 if( masterbranchcons == NULL || !pruneChildNodeByDominanceGeneric(scip, lhs, branchchilddata->consS, branchchilddata->consSsize, masterbranchcons, blocknr) )
2232 (void) SCIPsnprintf(childname, SCIP_MAXSTRLEN, "node(%d, %d) (last comp=%s %s %g) >= %g", blocknr, p+1,
2314 bound = (int) (SCIPceil( scip, SCIPgetSolVal(masterscip, NULL, mastervar)) + 0.5); /*lint -e524*/
2321 SCIP_CALL( SCIPallocBlockMemoryArray(scip, &(branchupchilddata->consS), branchupchilddata->maxconsS) ); /*lint !e506*/
2325 SCIP_CALL( SCIPallocBlockMemoryArray(scip, &(branchdownchilddata->consS), branchdownchilddata->maxconsS) ); /*lint !e506*/
2340 (void) SCIPsnprintf(upchildname, SCIP_MAXSTRLEN, "node(-3, %f) direct up on comp=%s", branchupchilddata->consS[0].bound,
2342 (void) SCIPsnprintf(downchildname, SCIP_MAXSTRLEN, "node(-3, %f) direct up on comp=%s", branchdownchilddata->consS[0].bound,
2345 SCIP_CALL( SCIPcreateChild(masterscip, &upchild, 0.0, SCIPgetLocalTransEstimate(masterscip)) );
2350 SCIP_CALL( SCIPcreateChild(masterscip, &downchild, 0.0, SCIPgetLocalTransEstimate(masterscip)) );
2420 SCIP_CALL( SCIPgetLPBranchCands(masterscip, &branchcands, NULL, NULL, &nbranchcands, NULL, NULL) );
2475 assert(i <= nbranchcands); /* else all blocks has been checked and we can observe an integer solution */
2477 /* in case of continuous origvar look for "fractional" blocks using the representation (currentorigsol) in the original problem */
2501 if( SCIPisIntegral(origscip, SCIPgetSolVal(origscip, GCGrelaxGetCurrentOrigSol(origscip), origvar)) )
2506 SCIPdebugMessage("Variable %s belonging to block %d with representative %d is not integral!\n", SCIPvarGetName(origvar), GCGvarGetBlock(origvar), blocknr);
2546 SCIPwarningMessage(masterscip, "Generic branching is not compatible with unbounded problems!\n");
2592 && strcmp(SCIPbranchruleGetName(GCGconsMasterbranchGetBranchrule(parentcons)), "generic") == 0)
2638 if( branchdata->consS[i].component != C[c][i].component || branchdata->consS[i].sense != C[c][i].sense || !SCIPisEQ(origscip, branchdata->consS[i].bound, C[c][i].bound) )
2655 SCIP_CALL( SCIPallocBufferArray(origscip, &(C[Csize-1]), branchdata->consSsize) ); /*lint !e866*/
2684 SCIP_CALL( ChooseSeparateMethod(origscip, F, Fsize, &S, &Ssize, C, Csize, sequencesizes, blocknr, branchrule, result, checkedblocks,
2691 SCIP_CALL( ChooseSeparateMethod( origscip, F, Fsize, &S, &Ssize, NULL, 0, NULL, blocknr, branchrule, result,
2714 SCIP_CALL( ChooseSeparateMethod( origscip, F, Fsize, &S, &Ssize, NULL, 0, NULL, blocknr, branchrule, result, checkedblocks,
2721 SCIP_CALL( createChildNodesGeneric(origscip, branchrule, S, Ssize, blocknr, masterbranchcons, result) );
2777 SCIPdebugMessage("branchActiveMasterGeneric: Block %d, Ssize %d\n", branchdata->consblocknr, branchdata->consSsize);
2797 SCIPdebugMessage("%d/%d vars added with lhs=%g\n", nvarsadded, nmastervars-branchdata->nvars, branchdata->lhs);
2812 SCIPdebugMessage("branchDeactiveMasterGeneric: Block %d, Ssize %d\n", branchdata->consblocknr, branchdata->consSsize);
2830 /* SCIPdebugMessage("branchPropMasterGeneric: Block %d ,Ssize %d)\n", branchdata->consblocknr, branchdata->consSsize); */
2869 SCIPdebugMessage("Generic branching executed on a set covering or set partitioning problem\n");
2888 SCIP_CALL( GCGbranchGenericInitbranch(scip, branchrule, result, &checkedblocks, &ncheckedblocks, &checkedblockssortstrips, &checkedblocksnsortstrips) );
2920 SCIPwarningMessage(scip, "No branching could be created, solving process cannot be restarted...\n" );
2929 SCIPdialogMessage(scip, NULL, "You can try to disable discretization and aggregation and resolve the problem.\n");
3049 return (branchrule != NULL) && (strcmp(BRANCHRULE_NAME, SCIPbranchruleGetName(branchrule)) == 0);
type definitions for branching rules in GCG projects
int GCGgetBlockRepresentative(SCIP *scip, int pricingprobnr)
Definition: relax_gcg.c:4023
static SCIP_RETCODE Explore(SCIP *scip, GCG_COMPSEQUENCE **C, int Csize, int *sequencesizes, int p, SCIP_VAR **F, int Fsize, SCIP_VAR **IndexSet, int IndexSetSize, GCG_COMPSEQUENCE **S, int *Ssize, GCG_RECORD *record)
Definition: branch_generic.c:1386
SCIP_CONS * GCGconsMasterbranchGetChildcons(SCIP_CONS *cons, int childnr)
Definition: cons_masterbranch.c:2449
static SCIP_RETCODE Separate(SCIP *scip, SCIP_VAR **F, int Fsize, SCIP_VAR **IndexSet, int IndexSetSize, GCG_COMPSEQUENCE *S, int Ssize, GCG_RECORD *record)
Definition: branch_generic.c:948
static SCIP_RETCODE createDirectBranchingCons(SCIP *scip, SCIP_NODE *node, GCG_BRANCHDATA *branchdata)
Definition: branch_generic.c:206
GCG interface methods.
SCIP_Bool GCGrelaxIsOrigSolFeasible(SCIP *scip)
Definition: relax_gcg.c:4202
static int ILOcomp(SCIP *scip, SCIP_VAR *mastervar1, SCIP_VAR *mastervar2, GCG_COMPSEQUENCE **C, int NBoundsequences, int *sequencesizes, int p)
Definition: branch_generic.c:600
GCG_BRANCHDATA * GCGconsMasterbranchGetBranchdata(SCIP_CONS *cons)
Definition: cons_masterbranch.c:2498
SCIP_VAR ** GCGoriginalVarGetMastervars(SCIP_VAR *var)
Definition: gcgvar.c:587
static SCIP_RETCODE addToRecord(SCIP *scip, GCG_RECORD *record, GCG_COMPSEQUENCE *S, int Ssize)
Definition: branch_generic.c:908
int GCGbranchGenericBranchdataGetConsSsize(GCG_BRANCHDATA *branchdata)
Definition: branch_generic.c:3018
SCIP_RETCODE GCGcreateConsMasterbranch(SCIP *scip, SCIP_CONS **cons, const char *name, SCIP_NODE *node, SCIP_CONS *parentcons, SCIP_BRANCHRULE *branchrule, GCG_BRANCHDATA *branchdata, SCIP_CONS **origbranchconss, int norigbranchconss, int maxorigbranchconss)
Definition: cons_masterbranch.c:2278
SCIP_RETCODE GCGbranchGenericInitbranch(SCIP *masterscip, SCIP_BRANCHRULE *branchrule, SCIP_RESULT *result, int **checkedblocks, int *ncheckedblocks, GCG_STRIP ****checkedblockssortstrips, int **checkedblocksnsortstrips)
Definition: branch_generic.c:2367
static SCIP_DECL_EVENTEXITSOL(eventExitsolGenericbranchvaradd)
Definition: branch_generic.c:280
Definition: branch_generic.h:52
static SCIP_RETCODE GCGincludeMasterCopyPlugins(SCIP *scip)
Definition: branch_generic.c:2733
int GCGconsMasterbranchGetNChildconss(SCIP_CONS *cons)
Definition: cons_masterbranch.c:2434
static SCIP_RETCODE initNodeBranchdata(SCIP *scip, GCG_BRANCHDATA **nodebranchdata, int blocknr)
Definition: branch_generic.c:2030
GCG variable pricer.
SCIP_RETCODE GCGbranchGenericCreateBranchdata(SCIP *scip, GCG_BRANCHDATA **branchdata)
Definition: branch_generic.c:2989
static SCIP_Bool pruneChildNodeByDominanceGeneric(SCIP *scip, SCIP_Real lhs, GCG_COMPSEQUENCE *childS, int childSsize, SCIP_CONS *masterbranchcons, int childBlocknr)
Definition: branch_generic.c:1981
static SCIP_RETCODE addVarToMasterbranch(SCIP *scip, SCIP_VAR *mastervar, GCG_BRANCHDATA *branchdata, SCIP_Bool *added)
Definition: branch_generic.c:147
static SCIP_RETCODE createBranchingCons(SCIP *scip, SCIP_NODE *node, GCG_BRANCHDATA *branchdata)
Definition: branch_generic.c:240
static SCIP_RETCODE partition(SCIP *scip, SCIP_VAR **J, int *Jsize, SCIP_Longint *priority, SCIP_VAR **F, int Fsize, SCIP_VAR **origvar, SCIP_Real *median)
Definition: branch_generic.c:832
constraint handler for the integrality constraint
static SCIP_RETCODE InducedLexicographicSort(SCIP *scip, GCG_STRIP **array, int arraysize, GCG_COMPSEQUENCE **C, int NBoundsequences, int *sequencesizes)
Definition: branch_generic.c:795
SCIP_EXPORT void GCGsortPtr(void **ptrarray, GCG_DECL_SORTPTRCOMP((*ptrcomp)), void *userdata, int len)
SCIP_BRANCHRULE * GCGconsMasterbranchGetBranchrule(SCIP_CONS *cons)
Definition: cons_masterbranch.c:2511
constraint handler for storing the branching decisions at each node of the tree
static SCIP_RETCODE createChildNodesGeneric(SCIP *scip, SCIP_BRANCHRULE *branchrule, GCG_COMPSEQUENCE *S, int Ssize, int blocknr, SCIP_CONS *masterbranchcons, SCIP_RESULT *result)
Definition: branch_generic.c:2051
static SCIP_RETCODE LexicographicSort(SCIP *scip, GCG_STRIP **array, int arraysize)
Definition: branch_generic.c:580
static SCIP_DECL_BRANCHEXECPS(branchExecpsGeneric)
Definition: branch_generic.c:2909
Definition: branch_generic.c:93
branching rule based on vanderbeck's generic branching scheme
constraint handler for storing the branching decisions at each node of the tree
static SCIP_RETCODE InitIndexSet(SCIP *scip, SCIP_VAR **F, int Fsize, SCIP_VAR ***IndexSet, int *IndexSetSize)
Definition: branch_generic.c:376
int GCGbranchGenericBranchdataGetConsblocknr(GCG_BRANCHDATA *branchdata)
Definition: branch_generic.c:3027
int GCGgetNIdenticalBlocks(SCIP *scip, int pricingprobnr)
Definition: relax_gcg.c:4053
static SCIP_Real getGeneratorEntry(SCIP_VAR *mastervar, SCIP_VAR *origvar)
Definition: branch_generic.c:117
static GCG_DECL_BRANCHPROPMASTER(branchPropMasterGeneric)
Definition: branch_generic.c:2823
static SCIP_DECL_BRANCHEXECEXT(branchExecextGeneric)
Definition: branch_generic.c:2895
static SCIP_DECL_EVENTEXEC(eventExecGenericbranchvaradd)
Definition: branch_generic.c:294
SCIP_RETCODE GCGpricerExistRays(SCIP *scip, SCIP_Bool *exist)
Definition: pricer_gcg.cpp:4650
GCG_COMPSEQUENCE * GCGbranchGenericBranchdataGetConsS(GCG_BRANCHDATA *branchdata)
Definition: branch_generic.c:3009
static int computeNewSequence(int Csize, int p, SCIP_VAR *origvar, int *sequencesizes, GCG_COMPSEQUENCE **C, GCG_COMPSEQUENCE **CopyC, int *newsequencesizes, GCG_COMPSENSE sense)
Definition: branch_generic.c:1324
SCIP_SOL * GCGrelaxGetCurrentOrigSol(SCIP *scip)
Definition: relax_gcg.c:4183
SCIP_RETCODE SCIPincludeBranchruleGeneric(SCIP *scip)
Definition: branch_generic.c:2955
static GCG_DECL_BRANCHDEACTIVEMASTER(branchDeactiveMasterGeneric)
Definition: branch_generic.c:2805
SCIP_CONS * GCGconsMasterbranchGetParentcons(SCIP_CONS *cons)
Definition: cons_masterbranch.c:2419
static SCIP_DECL_EVENTINITSOL(eventInitsolGenericbranchvaradd)
Definition: branch_generic.c:266
static SCIP_DECL_BRANCHEXECLP(branchExeclpGeneric)
Definition: branch_generic.c:2837
SCIP_CONS * GCGbranchGenericBranchdataGetMastercons(GCG_BRANCHDATA *branchdata)
Definition: branch_generic.c:3036
static SCIP_RETCODE ChoseS(SCIP *scip, GCG_RECORD **record, GCG_COMPSEQUENCE **S, int *Ssize)
Definition: branch_generic.c:1252
SCIP_Bool GCGisBranchruleGeneric(SCIP_BRANCHRULE *branchrule)
Definition: branch_generic.c:3045
GCG relaxator.
static SCIP_RETCODE ChooseSeparateMethod(SCIP *scip, SCIP_VAR **F, int Fsize, GCG_COMPSEQUENCE **S, int *Ssize, GCG_COMPSEQUENCE **C, int Csize, int *CompSizes, int blocknr, SCIP_BRANCHRULE *branchrule, SCIP_RESULT *result, int **checkedblocks, int *ncheckedblocks, GCG_STRIP ****checkedblockssortstrips, int **checkedblocksnsortstrips)
Definition: branch_generic.c:1695
SCIP_CONS * GCGconsMasterbranchGetActiveCons(SCIP *scip)
Definition: cons_masterbranch.c:2628
static GCG_DECL_BRANCHDATADELETE(branchDataDeleteGeneric)
Definition: branch_generic.c:1875
Definition: branch_bpstrong.c:109
Definition: branch_generic.h:61
static SCIP_RETCODE branchDirectlyOnMastervar(SCIP *scip, SCIP_VAR *mastervar, SCIP_BRANCHRULE *branchrule)
Definition: branch_generic.c:2294
static SCIP_Real GetMedian(SCIP *scip, SCIP_Real *array, int arraysize, SCIP_Real min)
Definition: branch_generic.c:458
sorting functions, adapted from SCIP's sorttpl to include userdata
SCIP_Bool GCGisMasterSetPartitioning(SCIP *scip)
Definition: relax_gcg.c:4240
SCIP_Bool GCGisMasterVarInBlock(SCIP_VAR *mastervar, int block)
Definition: gcgvar.c:1084
static GCG_DECL_BRANCHACTIVEMASTER(branchActiveMasterGeneric)
Definition: branch_generic.c:2764
SCIP_RETCODE GCGrelaxIncludeBranchrule(SCIP *scip, SCIP_BRANCHRULE *branchrule, GCG_DECL_BRANCHACTIVEMASTER((*branchactivemaster)), GCG_DECL_BRANCHDEACTIVEMASTER((*branchdeactivemaster)), GCG_DECL_BRANCHPROPMASTER((*branchpropmaster)), GCG_DECL_BRANCHMASTERSOLVED((*branchmastersolved)), GCG_DECL_BRANCHDATADELETE((*branchdatadelete)))
Definition: relax_gcg.c:3545
static SCIP_Bool checkchildconsS(SCIP *scip, SCIP_Real lhs, GCG_COMPSEQUENCE *childS, int childSsize, SCIP_CONS *parentcons, int childBlocknr)
Definition: branch_generic.c:1920
static double computeAlpha(SCIP *scip, int Fsize, GCG_COMPSENSE isense, double ivalue, SCIP_VAR *origvar, SCIP_VAR **F)
Definition: branch_generic.c:1356
SCIP_RETCODE GCGconsIntegralorigAddBranchrule(SCIP *scip, SCIP_BRANCHRULE *branchrule)
Definition: cons_integralorig.c:67