dees/include/lp_types.h
Yann Esposito (Yogsototh) 919d4a1006 Initial git init
in the future I may add the SVN history
2011-05-17 22:24:18 +02:00

327 lines
9.5 KiB
C

#ifndef HEADER_lp_types
#define HEADER_lp_types
/* Define data types */
/* ------------------------------------------------------------------------- */
#ifndef LLONG
#if defined __BORLANDC__
#define LLONG __int64
#elif !defined _MSC_VER || _MSC_VER >= 1310
#define LLONG long long
#else
#define LLONG __int64
#endif
#endif
#ifndef COUNTER
#define COUNTER LLONG
#endif
#ifndef REAL
#define REAL double
#endif
#ifndef REALXP
#if 1
#define REALXP long double /* Set local accumulation variable as long double */
#else
#define REALXP REAL /* Set local accumulation as default precision */
#endif
#endif
#ifndef LREAL
#if 0
#define LREAL long double /* Set global solution update variable as long double */
#else
#define LREAL REAL /* Set global solution update variable as default precision */
#endif
#endif
#define RESULTVALUEMASK "%18.12g" /* Set fixed-format real-valued output precision;
suggested width: ABS(exponent of DEF_EPSVALUE)+6. */
#define INDEXVALUEMASK "%8d" /* Set fixed-format integer-valued output width */
#ifndef DEF_STRBUFSIZE
#define DEF_STRBUFSIZE 512
#endif
#ifndef MAXINT32
#define MAXINT32 2147483647
#endif
#ifndef MAXUINT32
#define MAXUINT32 4294967295
#endif
#ifndef MAXINT64
#if defined _LONGLONG || defined __LONG_LONG_MAX__ || defined LLONG_MAX
#define MAXINT64 9223372036854775807ll
#else
#define MAXINT64 9223372036854775807l
#endif
#endif
#ifndef MAXUINT64
#if defined _LONGLONG || defined __LONG_LONG_MAX__ || defined LLONG_MAX
#define MAXUINT64 18446744073709551616ll
#else
#define MAXUINT64 18446744073709551616l
#endif
#endif
#ifndef CHAR_BIT
#define CHAR_BIT 8
#endif
#ifndef MYBOOL
#define MYBOOL unsigned char /* Conserve memory, could be unsigned int */
#endif
/* Constants */
/* ------------------------------------------------------------------------- */
#ifndef NULL
#define NULL 0
#endif
/* Byte-sized Booleans and extended options */
#define FALSE 0
#define TRUE 1
#define AUTOMATIC 2
#define DYNAMIC 4
/* Sorting and comparison constants */
#define COMP_PREFERCANDIDATE 1
#define COMP_PREFERNONE 0
#define COMP_PREFERINCUMBENT -1
/* Library load status values */
#define LIB_LOADED 0
#define LIB_NOTFOUND 1
#define LIB_NOINFO 2
#define LIB_NOFUNCTION 3
#define LIB_VERINVALID 4
#define LIB_STR_LOADED "Successfully loaded"
#define LIB_STR_NOTFOUND "File not found"
#define LIB_STR_NOINFO "No version data"
#define LIB_STR_NOFUNCTION "Missing function header"
#define LIB_STR_VERINVALID "Incompatible version"
#define LIB_STR_MAXLEN 23
/* Compiler/target settings */
/* ------------------------------------------------------------------------- */
#if (defined _WIN32) || (defined WIN32) || (defined _WIN64) || (defined WIN64)
# define __WINAPI WINAPI
#else
# define __WINAPI
#endif
#if (defined _WIN32) || (defined WIN32) || (defined _WIN64) || (defined WIN64)
# define __VACALL __cdecl
#else
# define __VACALL
#endif
#ifndef __BORLANDC__
#ifdef _USRDLL
#if 1
#define __EXPORT_TYPE __declspec(dllexport)
#else
/* Set up for the Microsoft compiler */
#ifdef LP_SOLVE_EXPORTS
#define __EXPORT_TYPE __declspec(dllexport)
#else
#define __EXPORT_TYPE __declspec(dllimport)
#endif
#endif
#else
#define __EXPORT_TYPE
#endif
#ifdef __cplusplus
#define __EXTERN_C extern "C"
#else
#define __EXTERN_C
#endif
#else /* Otherwise set up for the Borland compiler */
#ifdef __DLL__
#define _USRDLL
#define __EXTERN_C extern "C"
#ifdef __READING_THE_DLL
#define __EXPORT_TYPE __import
#else
#define __EXPORT_TYPE __export
#endif
#else
#define __EXPORT_TYPE
#define __EXTERN_C extern "C"
#endif
#endif
#if 0
#define STATIC static
#else
#define STATIC
#endif
#if !defined INLINE
#if defined __cplusplus
#define INLINE inline
#elif (defined _WIN32) || (defined WIN32) || (defined _WIN64) || (defined WIN64)
#define INLINE __inline
#else
#define INLINE static
#endif
#endif
/* Function macros */
/* ------------------------------------------------------------------------- */
#define my_limitrange(x, lo, hi) ((x) < (lo) ? (lo) : ((x) > (hi) ? (hi) : (x)))
#ifndef my_mod
#define my_mod(n, m) ((n) % (m))
#endif
#define my_if(t, x, y) ((t) ? (x) : (y))
#define my_sign(x) ((x) < 0 ? -1 : 1)
#if 0
#define my_chsign(t, x) ( ((t) && ((x) != 0)) ? -(x) : (x))
#else
#define my_chsign(t, x) ( (2*((t) == 0) - 1) * (x) ) /* "Pipelined" */
#endif
#define my_flipsign(x) ( fabs((REAL) (x)) == 0 ? 0 : -(x) )
#define my_roundzero(val, eps) if (fabs((REAL) (val)) < eps) val = 0
#define my_avoidtiny(val, eps) (fabs((REAL) (val)) < eps ? 0 : val)
#if 1
#define my_infinite(lp, val) ( (MYBOOL) (fabs(val) >= lp->infinite) )
#else
#define my_infinite(lp, val) is_infinite(lp, val)
#endif
#define my_inflimit(lp, val) ( my_infinite(lp, val) ? lp->infinite * my_sign(val) : (val) )
#if 0
#define my_precision(val, eps) ((fabs((REAL) (val))) < (eps) ? 0 : (val))
#else
#define my_precision(val, eps) restoreINT(val, eps)
#endif
#define my_reldiff(x, y) (((x) - (y)) / (1.0 + fabs((REAL) (y))))
#define my_boundstr(x) (fabs(x) < lp->infinite ? sprintf("%g",x) : ((x) < 0 ? "-Inf" : "Inf") )
#ifndef my_boolstr
#define my_boolstr(x) (!(x) ? "FALSE" : "TRUE")
#endif
#define my_basisstr(isbasic) ((isbasic) ? "BASIC" : "NON-BASIC")
#define my_simplexstr(isdual) ((isdual) ? "DUAL" : "PRIMAL")
#define my_plural_std(count) (count == 1 ? "" : "s")
#define my_plural_y(count) (count == 1 ? "y" : "ies")
#define my_lowbound(x) ((FULLYBOUNDEDSIMPLEX) ? (x) : 0)
/* Bound macros usable for both the standard and fully bounded simplex */
/* ------------------------------------------------------------------------- */
/*
#define my_lowbo(lp, varnr) ( lp->isfullybounded ? lp->lowbo[varnr] : 0.0 )
#define my_upbo(lp, varnr) ( lp->isfullybounded ? lp->upbo[varnr] : lp->lowbo[varnr] + lp->upbo[varnr] )
#define my_rangebo(lp, varnr) ( lp->isfullybounded ? lp->upbo[varnr] - lp->lowbo[varnr] : lp->upbo[varnr] )
*/
#define my_lowbo(lp, varnr) ( 0.0 )
#define my_upbo(lp, varnr) ( lp->lowbo[varnr] + lp->upbo[varnr] )
#define my_rangebo(lp, varnr) ( lp->upbo[varnr] )
#define my_unbounded(lp, varnr) ((lp->upbo[varnr] >= lp->infinite) && (lp->lowbo[varnr] <= -lp->infinite))
#define my_bounded(lp, varnr) ((lp->upbo[varnr] < lp->infinite) && (lp->lowbo[varnr] > -lp->infinite))
/* Forward declarations */
/* ------------------------------------------------------------------------- */
typedef struct _lprec lprec;
typedef struct _INVrec INVrec;
union QSORTrec;
#ifndef UNIONTYPE
#ifdef __cplusplus
#define UNIONTYPE
#else
#define UNIONTYPE union
#endif
#endif
/* B4 factorization optimization data */
typedef struct _B4rec
{
int *B4_var; /* Position of basic columns in the B4 basis */
int *var_B4; /* Variable in the B4 basis */
int *B4_row; /* B4 position of the i'th row */
int *row_B4; /* Original position of the i'th row */
REAL *wcol;
int *nzwcol;
} B4rec;
#define OBJ_STEPS 5
typedef struct _OBJmonrec {
lprec *lp;
int oldpivstrategy,
oldpivrule, pivrule, ruleswitches,
limitstall[2], limitruleswitches,
idxstep[OBJ_STEPS], countstep, startstep, currentstep,
Rcycle, Ccycle, Ncycle, Mcycle, Icount;
REAL thisobj, prevobj,
objstep[OBJ_STEPS],
thisinfeas, previnfeas,
epsvalue;
char spxfunc[10];
MYBOOL pivdynamic;
MYBOOL isdual;
MYBOOL active;
} OBJmonrec;
typedef struct _edgerec
{
REAL *edgeVector;
} edgerec;
typedef struct _pricerec
{
REAL theta;
REAL pivot;
REAL epspivot;
int varno;
lprec *lp;
MYBOOL isdual;
} pricerec;
typedef struct _multirec
{
lprec *lp;
int size; /* The maximum number of multiply priced rows/columns */
int used; /* The current / active number of multiply priced rows/columns */
int limit; /* The active/used count at which a full update is triggered */
pricerec *items; /* Array of best multiply priced rows/columns */
int *freeList; /* The indeces of available positions in "items" */
UNIONTYPE QSORTrec *sortedList; /* List of pointers to "pricerec" items in sorted order */
REAL *stepList; /* Working array (values in sortedList order) */
REAL *valueList; /* Working array (values in sortedList order) */
int *indexSet; /* The final exported index list of pivot variables */
int active; /* Index of currently active multiply priced row/column */
int retries;
REAL step_base;
REAL step_last;
REAL obj_base;
REAL obj_last;
REAL epszero;
REAL maxpivot;
REAL maxbound;
MYBOOL sorted;
MYBOOL truncinf;
MYBOOL objcheck;
MYBOOL dirty;
} multirec;
#endif /* HEADER_lp_types */