Here are the types (defined in cddtypes.h) that are important for the cddlib user. The most important one, dd_MatrixType, is to store a Polyhedra data in a straightforward manner. Once the user sets up a (pointer to) dd_MatrixType data, he/she can load the data to an internal data type (dd_PolyhedraType) by using functions described in the next section, and apply the double descrition method to get another representation. As an option dd_MatrixType can save a linear objective function to be used by a linear programming solver.
The two dimensional array data in the structure dd_MatrixType is
dd_Amatrix whose components are of type mytype.
The type mytype is set to be either the rational type mpq_t of
the GNU MP Library or the C double array of size
.
This abstract type allows us to write a single program that can
be compiled with the two different arithmetics, see example
programs such as simplecdd.c, testlp*.c and testcdd*.c
in the src and src-gmp subdirectories of the source
distribution.
#define dd_FALSE 0
#define dd_TRUE 1
typedef long dd_rowrange;
typedef long dd_colrange;
typedef long dd_bigrange;
typedef set_type dd_rowset; /* set_type defined in setoper.h */
typedef set_type dd_colset;
typedef long *dd_rowindex;
typedef int *dd_rowflag;
typedef long *dd_colindex;
typedef mytype **dd_Amatrix; /* mytype is either GMP mpq_t or 1-dim double array. */
typedef mytype *dd_Arow;
typedef enum {
dd_Real, dd_Rational, dd_Integer, dd_Unknown
} dd_NumberType;
typedef enum {
dd_Inequality, dd_Generator, dd_Unspecified
} dd_RepresentationType;
typedef enum {
dd_MaxIndex, dd_MinIndex, dd_MinCutoff, dd_MaxCutoff, dd_MixCutoff,
dd_LexMin, dd_LexMax, dd_RandomRow
} dd_RowOrderType;
typedef enum {
dd_InProgress, dd_AllFound, dd_RegionEmpty
} dd_CompStatusType;
typedef enum {
dd_DimensionTooLarge, dd_ImproperInputFormat,
dd_NegativeMatrixSize, dd_EmptyVrepresentation,
dd_IFileNotFound, dd_OFileNotOpen, dd_NoLPObjective, dd_NoRealNumberSupport, dd_NoError
} dd_ErrorType;
typedef enum {
dd_LPnone=0, dd_LPmax, dd_LPmin
} dd_LPObjectiveType;
typedef enum {
dd_LPSundecided, dd_Optimal, dd_Inconsistent, dd_DualInconsistent,
dd_StrucInconsistent, dd_StrucDualInconsistent,
dd_Unbounded, dd_DualUnbounded
} dd_LPStatusType;
typedef struct matrixdata *dd_MatrixPtr;
typedef struct matrixdata {
dd_rowrange rowsize;
dd_rowset linset;
/* a subset of rows of linearity (ie, generators of
linearity space for V-representation, and equations
for H-representation. */
dd_colrange colsize;
dd_RepresentationType representation;
dd_NumberType numbtype;
dd_Amatrix matrix;
dd_LPObjectiveType objective;
dd_Arow rowvec;
} dd_MatrixType;
typedef struct setfamily *dd_SetFamilyPtr;
typedef struct setfamily {
dd_bigrange famsize;
dd_bigrange setsize;
dd_SetVector set;
} dd_SetFamilyType;
typedef struct lpsolution *dd_LPSolutionPtr;
typedef struct lpsolution {
dd_DataFileType filename;
dd_LPObjectiveType objective;
dd_LPSolverType solver;
dd_rowrange m;
dd_colrange d;
dd_NumberType numbtype;
dd_LPStatusType LPS; /* the current solution status */
mytype optvalue; /* optimal value */
dd_Arow sol; /* primal solution */
dd_Arow dsol; /* dual solution */
dd_colindex nbindex; /* current basis represented by nonbasic indices */
dd_rowrange re; /* row index as a certificate in the case of inconsistency */
dd_colrange se; /* col index as a certificate in the case of dual inconsistency */
long pivots[5];
/* pivots[0]=setup (to find a basis), pivots[1]=PhaseI or Criss-Cross,
pivots[2]=Phase II, pivots[3]=Anticycling, pivots[4]=GMP postopt */
long total_pivots;
} dd_LPSolutionType;