#ifndef HEADER_lp_mipbb
#define HEADER_lp_mipbb

#include "lp_types.h"
#include "lp_utils.h"


/* Bounds storage for B&B routines */
typedef struct _BBrec
{
  struct    _BBrec *parent;
  struct    _BBrec *child;
  lprec     *lp;
  int       varno;
  int       vartype;
  int       lastvarcus;            /* Count of non-int variables of the previous branch */
  int       lastrcf;
  int       nodesleft;
  int       nodessolved;
  int       nodestatus;
  LPSREAL      noderesult;
  LPSREAL      lastsolution;          /* Optimal solution of the previous branch */
  LPSREAL      sc_bound;
  LPSREAL      *upbo,   *lowbo;
  LPSREAL      UPbound, LObound;
  int       UBtrack, LBtrack;      /* Signals that incoming bounds were changed */
  MYBOOL    contentmode;           /* Flag indicating if we "own" the bound vectors */
  MYBOOL    sc_canset;
  MYBOOL    isSOS;
  MYBOOL    isGUB;
  int       *varmanaged;           /* Extended list of variables managed by this B&B level */
  MYBOOL    isfloor;               /* State variable indicating the active B&B bound */
  MYBOOL    UBzerobased;           /* State variable indicating if bounds have been rebased */
} BBrec;

#ifdef __cplusplus
extern "C" {
#endif

STATIC BBrec *create_BB(lprec *lp, BBrec *parentBB, MYBOOL dofullcopy);
STATIC BBrec *push_BB(lprec *lp, BBrec *parentBB, int varno, int vartype, int varcus);
STATIC MYBOOL initbranches_BB(BBrec *BB);
STATIC MYBOOL fillbranches_BB(BBrec *BB);
STATIC MYBOOL nextbranch_BB(BBrec *BB);
STATIC MYBOOL strongbranch_BB(lprec *lp, BBrec *BB, int varno, int vartype, int varcus);
STATIC MYBOOL initcuts_BB(lprec *lp);
STATIC int updatecuts_BB(lprec *lp);
STATIC MYBOOL freecuts_BB(lprec *lp);
STATIC BBrec *findself_BB(BBrec *BB);
STATIC int solve_LP(lprec *lp, BBrec *BB);
STATIC int rcfbound_BB(BBrec *BB, int varno, MYBOOL isINT, LPSREAL *newbound, MYBOOL *isfeasible);
STATIC MYBOOL findnode_BB(BBrec *BB, int *varno, int *vartype, int *varcus);
STATIC int solve_BB(BBrec *BB);
STATIC MYBOOL free_BB(BBrec **BB);
STATIC BBrec *pop_BB(BBrec *BB);

STATIC int run_BB(lprec *lp);

#ifdef __cplusplus
 }
#endif

#endif /* HEADER_lp_mipbb */

