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;