#ifndef HEADER_lp_LUSOL
#define HEADER_lp_LUSOL

/* Include libraries for this inverse system */
#include "lp_types.h"
#include "lusol.h"

/* LUSOL defines */
#ifdef WIN32
# define LUSOL_UseBLAS
#endif
/*#define MAPSINGULARCOLUMN*/
#define MATINDEXBASE LUSOL_ARRAYOFFSET /* Inversion engine index start for arrays */
#define LU_START_SIZE           10000  /* Start size of LU; realloc'ed if needed */
#define DEF_MAXPIVOT              250  /* Maximum number of pivots before refactorization */
#define MAX_DELTAFILLIN           2.0  /* Do refactorizations based on sparsity considerations */
#define TIGHTENAFTER               10  /* Tighten LU pivot criteria only after this number of singularities */

/* typedef */ struct _INVrec
{
  int       status;                 /* Last operation status code */
  int       dimcount;               /* The actual number of LU rows/columns */
  int       dimalloc;               /* The allocated LU rows/columns size */
  int       user_colcount;          /* The number of user LU columns */
  LUSOLrec  *LUSOL;
  int       col_enter;              /* The full index of the entering column */
  int       col_leave;              /* The full index of the leaving column */
  int       col_pos;                /* The B column to be changed at the next update using data in value[.]*/
  LPSREAL      *value;
  LPSREAL      *pcol;                  /* Reference to the elimination vector */
  LPSREAL      theta_enter;            /* Value of the entering column theta */

  int       max_Bsize;              /* The largest B matrix of user variables */
  int       max_colcount;           /* The maximum number of user columns in LU */
  int       max_LUsize;             /* The largest NZ-count of LU-files generated */
  int       num_refact;             /* Number of times the basis was refactored */
  int       num_timed_refact;
  int       num_dense_refact;
  double    time_refactstart;       /* Time since start of last refactorization-pivots cyle */
  double    time_refactnext;        /* Time estimated to next refactorization */
  int       num_pivots;             /* Number of pivots since last refactorization */
  int       num_singular;           /* The total number of singular updates */
  char      *opts;
  MYBOOL    is_dirty;               /* Specifies if a column is incompletely processed */
  MYBOOL    force_refact;           /* Force refactorization at the next opportunity */
  MYBOOL    timed_refact;           /* Set if timer-driven refactorization should be active */
  MYBOOL    set_Bidentity;          /* Force B to be the identity matrix at the next refactorization */
} /* INVrec */;


#ifdef __cplusplus
/* namespace LUSOL */
extern "C" {
#endif

/* Put function headers here */
#include "lp_BFP.h"

#ifdef __cplusplus
 }
#endif

#endif /* HEADER_lp_LUSOL */
