165 lines
6.1 KiB
C
165 lines
6.1 KiB
C
|
#ifndef HEADER_lp_utils
|
||
|
#define HEADER_lp_utils
|
||
|
|
||
|
#ifdef FORTIFY
|
||
|
|
||
|
#include "lp_fortify.h"
|
||
|
|
||
|
#define allocCHAR allocCHAR_FORTIFY
|
||
|
#define allocMYBOOL allocMYBOOL_FORTIFY
|
||
|
#define allocINT allocINT_FORTIFY
|
||
|
#define allocREAL allocREAL_FORTIFY
|
||
|
#define allocLREAL allocLREAL_FORTIFY
|
||
|
|
||
|
#endif
|
||
|
|
||
|
#include "lp_types.h"
|
||
|
|
||
|
/* Temporary data storage arrays */
|
||
|
typedef struct _workarraysrec
|
||
|
{
|
||
|
lprec *lp;
|
||
|
int size;
|
||
|
int count;
|
||
|
char **vectorarray;
|
||
|
int *vectorsize;
|
||
|
} workarraysrec;
|
||
|
|
||
|
typedef struct _LLrec
|
||
|
{
|
||
|
int size; /* The allocated list size */
|
||
|
int count; /* The current entry count */
|
||
|
int firstitem;
|
||
|
int lastitem;
|
||
|
int *map; /* The list of forward and backward-mapped entries */
|
||
|
} LLrec;
|
||
|
|
||
|
typedef struct _PVrec
|
||
|
{
|
||
|
int count; /* The allocated list item count */
|
||
|
int *startpos; /* Starting index of the current value */
|
||
|
REAL *value; /* The list of forward and backward-mapped entries */
|
||
|
struct _PVrec *parent; /* The parent record in a pushed chain */
|
||
|
} PVrec;
|
||
|
|
||
|
|
||
|
#ifdef __cplusplus
|
||
|
extern "C" {
|
||
|
#endif
|
||
|
|
||
|
/* Put function headers here */
|
||
|
STATIC MYBOOL allocCHAR(lprec *lp, char **ptr, int size, MYBOOL clear);
|
||
|
STATIC MYBOOL allocMYBOOL(lprec *lp, MYBOOL **ptr, int size, MYBOOL clear);
|
||
|
STATIC MYBOOL allocINT(lprec *lp, int **ptr, int size, MYBOOL clear);
|
||
|
STATIC MYBOOL allocREAL(lprec *lp, REAL **ptr, int size, MYBOOL clear);
|
||
|
STATIC MYBOOL allocLREAL(lprec *lp, LREAL **ptr, int size, MYBOOL clear);
|
||
|
STATIC MYBOOL allocFREE(lprec *lp, void **ptr);
|
||
|
REAL *cloneREAL(lprec *lp, REAL *origlist, int size);
|
||
|
MYBOOL *cloneMYBOOL(lprec *lp, MYBOOL *origlist, int size);
|
||
|
int *cloneINT(lprec *lp, int *origlist, int size);
|
||
|
|
||
|
#if defined INLINE
|
||
|
INLINE void set_biton(MYBOOL *bitarray, int item)
|
||
|
{
|
||
|
bitarray[item / 8] |= (1 << (item % 8));
|
||
|
}
|
||
|
INLINE void set_bitoff(MYBOOL *bitarray, int item)
|
||
|
{
|
||
|
bitarray[item / 8] &= ~(1 << (item % 8));
|
||
|
}
|
||
|
INLINE MYBOOL is_biton(MYBOOL *bitarray, int item)
|
||
|
{
|
||
|
return( (MYBOOL) ((bitarray[item / 8] & (1 << (item % 8))) != 0) );
|
||
|
}
|
||
|
#else
|
||
|
void set_biton(MYBOOL *bitarray, int item);
|
||
|
MYBOOL set_bitoff(MYBOOL *bitarray, int item);
|
||
|
MYBOOL is_biton(MYBOOL *bitarray, int item);
|
||
|
#endif
|
||
|
int comp_bits(MYBOOL *bitarray1, MYBOOL *bitarray2, int items);
|
||
|
|
||
|
STATIC workarraysrec *mempool_create(lprec *lp);
|
||
|
STATIC char *mempool_obtainVector(workarraysrec *mempool, int count, int unitsize);
|
||
|
STATIC MYBOOL mempool_releaseVector(workarraysrec *mempool, char *memvector, MYBOOL forcefree);
|
||
|
STATIC MYBOOL mempool_free(workarraysrec **mempool);
|
||
|
|
||
|
STATIC void roundVector(LREAL *myvector, int endpos, LREAL roundzero);
|
||
|
STATIC REAL normalizeVector(REAL *myvector, int endpos);
|
||
|
|
||
|
STATIC void swapINT(int *item1, int *item2);
|
||
|
STATIC void swapREAL(REAL *item1, REAL *item2);
|
||
|
STATIC void swapPTR(void **item1, void **item2);
|
||
|
STATIC REAL restoreINT(REAL valREAL, REAL epsilon);
|
||
|
STATIC REAL roundToPrecision(REAL value, REAL precision);
|
||
|
|
||
|
STATIC int searchFor(int target, int *attributes, int size, int offset, MYBOOL absolute);
|
||
|
|
||
|
STATIC MYBOOL isINT(lprec *lp, REAL value);
|
||
|
STATIC MYBOOL isOrigFixed(lprec *lp, int varno);
|
||
|
STATIC void chsign_bounds(REAL *lobound, REAL *upbound);
|
||
|
STATIC REAL rand_uniform(lprec *lp, REAL range);
|
||
|
|
||
|
/* Doubly linked list routines */
|
||
|
STATIC int createLink(int size, LLrec **linkmap, MYBOOL *usedpos);
|
||
|
STATIC MYBOOL freeLink(LLrec **linkmap);
|
||
|
STATIC int sizeLink(LLrec *linkmap);
|
||
|
STATIC MYBOOL isActiveLink(LLrec *linkmap, int itemnr);
|
||
|
STATIC int countActiveLink(LLrec *linkmap);
|
||
|
STATIC int countInactiveLink(LLrec *linkmap);
|
||
|
STATIC int firstActiveLink(LLrec *linkmap);
|
||
|
STATIC int lastActiveLink(LLrec *linkmap);
|
||
|
STATIC MYBOOL appendLink(LLrec *linkmap, int newitem);
|
||
|
STATIC MYBOOL insertLink(LLrec *linkmap, int afteritem, int newitem);
|
||
|
STATIC MYBOOL setLink(LLrec *linkmap, int newitem);
|
||
|
STATIC MYBOOL fillLink(LLrec *linkmap);
|
||
|
STATIC int nextActiveLink(LLrec *linkmap, int backitemnr);
|
||
|
STATIC int prevActiveLink(LLrec *linkmap, int forwitemnr);
|
||
|
STATIC int firstInactiveLink(LLrec *linkmap);
|
||
|
STATIC int lastInactiveLink(LLrec *linkmap);
|
||
|
STATIC int nextInactiveLink(LLrec *linkmap, int backitemnr);
|
||
|
STATIC int prevInactiveLink(LLrec *linkmap, int forwitemnr);
|
||
|
STATIC int removeLink(LLrec *linkmap, int itemnr);
|
||
|
STATIC LLrec *cloneLink(LLrec *sourcemap, int newsize, MYBOOL freesource);
|
||
|
STATIC int compareLink(LLrec *linkmap1, LLrec *linkmap2);
|
||
|
STATIC MYBOOL verifyLink(LLrec *linkmap, int itemnr, MYBOOL doappend);
|
||
|
|
||
|
/* Packed vector routines */
|
||
|
STATIC PVrec *createPackedVector(int size, REAL *values, int *workvector);
|
||
|
STATIC void pushPackedVector(PVrec *PV, PVrec *parent);
|
||
|
STATIC MYBOOL unpackPackedVector(PVrec *PV, REAL **target);
|
||
|
STATIC REAL getvaluePackedVector(PVrec *PV, int index);
|
||
|
STATIC PVrec *popPackedVector(PVrec *PV);
|
||
|
STATIC MYBOOL freePackedVector(PVrec **PV);
|
||
|
|
||
|
#ifdef __cplusplus
|
||
|
}
|
||
|
#endif
|
||
|
|
||
|
#endif /* HEADER_lp_utils */
|
||
|
|
||
|
#ifdef FORTIFY
|
||
|
|
||
|
#if defined CODE_lp_utils && !defined CODE_lp_utils_
|
||
|
int _Fortify_ret;
|
||
|
#else
|
||
|
extern int _Fortify_ret;
|
||
|
#endif
|
||
|
|
||
|
#ifdef CODE_lp_utils
|
||
|
#define CODE_lp_utils_
|
||
|
#else
|
||
|
# undef allocCHAR
|
||
|
# undef allocMYBOOL
|
||
|
# undef allocINT
|
||
|
# undef allocREAL
|
||
|
# undef allocLREAL
|
||
|
# define allocCHAR(lp, ptr, size, clear) (Fortify_LINE(__LINE__), Fortify_FILE(__FILE__), _Fortify_ret = allocCHAR_FORTIFY(lp, ptr, size, clear), Fortify_LINE(0), Fortify_FILE(NULL), _Fortify_ret)
|
||
|
# define allocMYBOOL(lp, ptr, size, clear) (Fortify_LINE(__LINE__), Fortify_FILE(__FILE__), _Fortify_ret = allocMYBOOL_FORTIFY(lp, ptr, size, clear), Fortify_LINE(0), Fortify_FILE(NULL), _Fortify_ret)
|
||
|
# define allocINT(lp, ptr, size, clear) (Fortify_LINE(__LINE__), Fortify_FILE(__FILE__), _Fortify_ret = allocINT_FORTIFY(lp, ptr, size, clear), Fortify_LINE(0), Fortify_FILE(NULL), _Fortify_ret)
|
||
|
# define allocREAL(lp, ptr, size, clear) (Fortify_LINE(__LINE__), Fortify_FILE(__FILE__), _Fortify_ret = allocREAL_FORTIFY(lp, ptr, size, clear), Fortify_LINE(0), Fortify_FILE(NULL), _Fortify_ret)
|
||
|
# define allocLREAL(lp, ptr, size, clear) (Fortify_LINE(__LINE__), Fortify_FILE(__FILE__), _Fortify_ret = allocLREAL_FORTIFY(lp, ptr, size, clear), Fortify_LINE(0), Fortify_FILE(NULL), _Fortify_ret)
|
||
|
#endif
|
||
|
|
||
|
#endif
|
||
|
|