109 lines
4.5 KiB
C
109 lines
4.5 KiB
C
|
#ifndef HEADER_lp_SOS
|
||
|
#define HEADER_lp_SOS
|
||
|
|
||
|
/* Specially Ordered Sets (SOS) prototypes and settings */
|
||
|
/* ------------------------------------------------------------------------- */
|
||
|
|
||
|
#include "lp_types.h"
|
||
|
#include "lp_utils.h"
|
||
|
#include "lp_matrix.h"
|
||
|
|
||
|
|
||
|
/* SOS constraint defines */
|
||
|
/* ------------------------------------------------------------------------- */
|
||
|
#define SOS1 1
|
||
|
#define SOS2 2
|
||
|
#define SOS3 -1
|
||
|
#define SOSn MAXINT32
|
||
|
#define SOS_START_SIZE 10 /* Start size of SOS_list array; realloced if needed */
|
||
|
|
||
|
/* Define SOS_is_feasible() return values */
|
||
|
/* ------------------------------------------------------------------------- */
|
||
|
#define SOS3_INCOMPLETE -2
|
||
|
#define SOS_INCOMPLETE -1
|
||
|
#define SOS_COMPLETE 0
|
||
|
#define SOS_INFEASIBLE 1
|
||
|
#define SOS_INTERNALERROR 2
|
||
|
|
||
|
|
||
|
typedef struct _SOSgroup SOSgroup;
|
||
|
|
||
|
typedef struct _SOSrec
|
||
|
{
|
||
|
SOSgroup *parent;
|
||
|
int tagorder;
|
||
|
char *name;
|
||
|
int type;
|
||
|
MYBOOL isGUB;
|
||
|
int size;
|
||
|
int priority;
|
||
|
int *members;
|
||
|
REAL *weights;
|
||
|
int *membersSorted;
|
||
|
int *membersMapped;
|
||
|
} SOSrec;
|
||
|
|
||
|
/* typedef */ struct _SOSgroup
|
||
|
{
|
||
|
lprec *lp; /* Pointer to owner */
|
||
|
SOSrec **sos_list; /* Array of pointers to SOS lists */
|
||
|
int sos_alloc; /* Size allocated to specially ordered sets (SOS1, SOS2...) */
|
||
|
int sos_count; /* Number of specially ordered sets (SOS1, SOS2...) */
|
||
|
int maxorder; /* The highest-order SOS in the group */
|
||
|
int sos1_count; /* Number of the lowest order SOS in the group */
|
||
|
int *membership; /* Array of variable-sorted indeces to SOSes that the variable is member of */
|
||
|
int *memberpos; /* Starting positions of the each column's membership list */
|
||
|
} /* SOSgroup */;
|
||
|
|
||
|
|
||
|
#ifdef __cplusplus
|
||
|
extern "C" {
|
||
|
#endif
|
||
|
|
||
|
/* SOS storage structure */
|
||
|
STATIC SOSgroup *create_SOSgroup(lprec *lp);
|
||
|
STATIC void resize_SOSgroup(SOSgroup *group);
|
||
|
STATIC int append_SOSgroup(SOSgroup *group, SOSrec *SOS);
|
||
|
STATIC int clean_SOSgroup(SOSgroup *group, MYBOOL forceupdatemap);
|
||
|
STATIC void free_SOSgroup(SOSgroup **group);
|
||
|
|
||
|
STATIC SOSrec *create_SOSrec(SOSgroup *group, char *name, int type, int priority, int size, int *variables, REAL *weights);
|
||
|
STATIC MYBOOL delete_SOSrec(SOSgroup *group, int sosindex);
|
||
|
STATIC int append_SOSrec(SOSrec *SOS, int size, int *variables, REAL *weights);
|
||
|
STATIC void free_SOSrec(SOSrec *SOS);
|
||
|
|
||
|
/* SOS utilities */
|
||
|
STATIC int make_SOSchain(lprec *lp, MYBOOL forceresort);
|
||
|
STATIC int SOS_member_updatemap(SOSgroup *group);
|
||
|
STATIC MYBOOL SOS_member_sortlist(SOSgroup *group, int sosindex);
|
||
|
STATIC MYBOOL SOS_shift_col(SOSgroup *group, int sosindex, int column, int delta, LLrec *usedmap, MYBOOL forceresort);
|
||
|
int SOS_member_delete(SOSgroup *group, int sosindex, int member);
|
||
|
int SOS_get_type(SOSgroup *group, int sosindex);
|
||
|
int SOS_infeasible(SOSgroup *group, int sosindex);
|
||
|
int SOS_member_index(SOSgroup *group, int sosindex, int member);
|
||
|
int SOS_member_count(SOSgroup *group, int sosindex);
|
||
|
int SOS_memberships(SOSgroup *group, int column);
|
||
|
int *SOS_get_candidates(SOSgroup *group, int sosindex, int column, MYBOOL excludetarget, REAL *upbound, REAL *lobound);
|
||
|
int SOS_is_member(SOSgroup *group, int sosindex, int column);
|
||
|
MYBOOL SOS_is_member_of_type(SOSgroup *group, int column, int sostype);
|
||
|
MYBOOL SOS_set_GUB(SOSgroup *group, int sosindex, MYBOOL state);
|
||
|
MYBOOL SOS_is_GUB(SOSgroup *group, int sosindex);
|
||
|
MYBOOL SOS_is_marked(SOSgroup *group, int sosindex, int column);
|
||
|
MYBOOL SOS_is_active(SOSgroup *group, int sosindex, int column);
|
||
|
MYBOOL SOS_is_full(SOSgroup *group, int sosindex, int column, MYBOOL activeonly);
|
||
|
MYBOOL SOS_can_activate(SOSgroup *group, int sosindex, int column);
|
||
|
MYBOOL SOS_set_marked(SOSgroup *group, int sosindex, int column, MYBOOL asactive);
|
||
|
MYBOOL SOS_unmark(SOSgroup *group, int sosindex, int column);
|
||
|
int SOS_fix_unmarked(SOSgroup *group, int sosindex, int variable, REAL *bound, REAL value,
|
||
|
MYBOOL isupper, int *diffcount, DeltaVrec *changelog);
|
||
|
int SOS_fix_list(SOSgroup *group, int sosindex, int variable, REAL *bound,
|
||
|
int *varlist, MYBOOL isleft, DeltaVrec *changelog);
|
||
|
int SOS_is_satisfied(SOSgroup *group, int sosindex, REAL *solution);
|
||
|
MYBOOL SOS_is_feasible(SOSgroup *group, int sosindex, REAL *solution);
|
||
|
|
||
|
#ifdef __cplusplus
|
||
|
}
|
||
|
#endif
|
||
|
|
||
|
#endif /* HEADER_lp_SOS */
|