1 #ifndef HEADER_lp_SOS
2 #define HEADER_lp_SOS
3 
4 /* Specially Ordered Sets (SOS) prototypes and settings                      */
5 /* ------------------------------------------------------------------------- */
6 
7 #include "lp_types.h"
8 #include "lp_utils.h"
9 #include "lp_matrix.h"
10 
11 
12 /* SOS constraint defines                                                    */
13 /* ------------------------------------------------------------------------- */
14 #define SOS1                     1
15 #define SOS2                     2
16 #define SOS3                    -1
17 #define SOSn                      MAXINT32
18 #define SOS_START_SIZE          10  /* Start size of SOS_list array; realloced if needed */
19 
20 /* Define SOS_is_feasible() return values                                    */
21 /* ------------------------------------------------------------------------- */
22 #define SOS3_INCOMPLETE         -2
23 #define SOS_INCOMPLETE          -1
24 #define SOS_COMPLETE             0
25 #define SOS_INFEASIBLE           1
26 #define SOS_INTERNALERROR        2
27 
28 
29 typedef struct _SOSgroup SOSgroup;
30 
31 typedef struct _SOSrec
32 {
33   SOSgroup  *parent;
34   int       tagorder;
35   char      *name;
36   int       type;
37   MYBOOL    isGUB;
38   int       size;
39   int       priority;
40   int       *members;
41   REAL      *weights;
42   int       *membersSorted;
43   int       *membersMapped;
44 } SOSrec;
45 
46 /* typedef */ struct _SOSgroup
47 {
48   lprec     *lp;                /* Pointer to owner */
49   SOSrec    **sos_list;         /* Array of pointers to SOS lists */
50   int       sos_alloc;          /* Size allocated to specially ordered sets (SOS1, SOS2...) */
51   int       sos_count;          /* Number of specially ordered sets (SOS1, SOS2...) */
52   int       maxorder;           /* The highest-order SOS in the group */
53   int       sos1_count;         /* Number of the lowest order SOS in the group */
54   int       *membership;        /* Array of variable-sorted indeces to SOSes that the variable is member of */
55   int       *memberpos;         /* Starting positions of the each column's membership list */
56 } /* SOSgroup */;
57 
58 
59 #ifdef __cplusplus
60 extern "C" {
61 #endif
62 
63 /* SOS storage structure */
64 STATIC SOSgroup *create_SOSgroup(lprec *lp);
65 STATIC void resize_SOSgroup(SOSgroup *group);
66 STATIC int append_SOSgroup(SOSgroup *group, SOSrec *SOS);
67 STATIC int clean_SOSgroup(SOSgroup *group, MYBOOL forceupdatemap);
68 STATIC void free_SOSgroup(SOSgroup **group);
69 
70 STATIC SOSrec *create_SOSrec(SOSgroup *group, char *name, int type, int priority, int size, int *variables, REAL *weights);
71 STATIC MYBOOL delete_SOSrec(SOSgroup *group, int sosindex);
72 STATIC int append_SOSrec(SOSrec *SOS, int size, int *variables, REAL *weights);
73 STATIC void free_SOSrec(SOSrec *SOS);
74 
75 /* SOS utilities */
76 STATIC int make_SOSchain(lprec *lp, MYBOOL forceresort);
77 STATIC int SOS_member_updatemap(SOSgroup *group);
78 STATIC MYBOOL SOS_member_sortlist(SOSgroup *group, int sosindex);
79 STATIC MYBOOL SOS_shift_col(SOSgroup *group, int sosindex, int column, int delta, LLrec *usedmap, MYBOOL forceresort);
80 int SOS_member_delete(SOSgroup *group, int sosindex, int member);
81 int SOS_get_type(SOSgroup *group, int sosindex);
82 int SOS_infeasible(SOSgroup *group, int sosindex);
83 int SOS_member_index(SOSgroup *group, int sosindex, int member);
84 int SOS_member_count(SOSgroup *group, int sosindex);
85 int SOS_memberships(SOSgroup *group, int column);
86 int *SOS_get_candidates(SOSgroup *group, int sosindex, int column, MYBOOL excludetarget, REAL *upbound, REAL *lobound);
87 int SOS_is_member(SOSgroup *group, int sosindex, int column);
88 MYBOOL SOS_is_member_of_type(SOSgroup *group, int column, int sostype);
89 MYBOOL SOS_set_GUB(SOSgroup *group, int sosindex, MYBOOL state);
90 MYBOOL SOS_is_GUB(SOSgroup *group, int sosindex);
91 MYBOOL SOS_is_marked(SOSgroup *group, int sosindex, int column);
92 MYBOOL SOS_is_active(SOSgroup *group, int sosindex, int column);
93 MYBOOL SOS_is_full(SOSgroup *group, int sosindex, int column, MYBOOL activeonly);
94 MYBOOL SOS_can_activate(SOSgroup *group, int sosindex, int column);
95 MYBOOL SOS_set_marked(SOSgroup *group, int sosindex, int column, MYBOOL asactive);
96 MYBOOL SOS_unmark(SOSgroup *group, int sosindex, int column);
97 int SOS_fix_unmarked(SOSgroup *group, int sosindex, int variable, REAL *bound, REAL value,
98                      MYBOOL isupper, int *diffcount, DeltaVrec *changelog);
99 int SOS_fix_list(SOSgroup *group, int sosindex, int variable, REAL *bound,
100                   int *varlist, MYBOOL isleft, DeltaVrec *changelog);
101 int SOS_is_satisfied(SOSgroup *group, int sosindex, REAL *solution);
102 MYBOOL SOS_is_feasible(SOSgroup *group, int sosindex, REAL *solution);
103 
104 #ifdef __cplusplus
105  }
106 #endif
107 
108 #endif /* HEADER_lp_SOS */
109