00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015 #ifndef _types_polylib_h_
00016 #define _types_polylib_h_
00017
00018 #ifdef GNUMP
00019 #include<gmp.h>
00020 #endif
00021
00022 #include <limits.h>
00023
00024
00025
00026
00027 #define FIRST_PARAMETER_NAME 'P'
00028
00029
00030
00031
00032 #define PCHAR (FIRST_PARAMETER_NAME-1)
00033 #define MAXNOOFRAYS 200
00034
00035 #if defined(LINEAR_VALUE_IS_LONGLONG)
00036 #define P_VALUE_FMT "%4lld "
00037 #elif defined(LINEAR_VALUE_IS_LONG)
00038 #define P_VALUE_FMT "%4ld "
00039 #elif defined(LINEAR_VALUE_IS_CHARS)
00040 #define P_VALUE_FMT "%s "
00041 #elif defined(LINEAR_VALUE_IS_INT)
00042 #define P_VALUE_FMT "%4d "
00043 #else
00044 #define P_VALUE_FMT "%4s "
00045 #endif
00046
00047
00048 #define LB_INFINITY 1
00049 #define UB_INFINITY 2
00050
00051
00052
00053 #define MSB ((unsigned)(((unsigned)1)<<(sizeof(int)*8-1)))
00054
00055
00056 #define TOP ((int)(MSB-1))
00057
00058
00059 #define NEXT(j,b) { if (!((b)>>=1)) { (b)=MSB; (j)++; } }
00060
00061
00062 extern int Pol_status;
00063
00064 #define POL_HIGH_BIT (UINT_MAX - (UINT_MAX >> 1))
00065 #define POL_NO_DUAL (POL_HIGH_BIT | 0x0001)
00066 #define POL_INTEGER (POL_HIGH_BIT | 0x0002)
00067 #define POL_ISSET(flags,f) ((flags & f) == f)
00068
00069 typedef struct {
00070 unsigned Size;
00071 Value *p;
00072 } Vector;
00073
00074 typedef struct matrix {
00075 unsigned NbRows, NbColumns;
00076 Value **p;
00077 Value *p_Init;
00078 int p_Init_size;
00079 } Matrix;
00080
00081
00082 #define FL_INIT(l, f) (l) = (f)
00083 #define FL_SET(l, f) ((l) |= (f))
00084 #define FL_CLR(l, f) ((l) &= ~(f))
00085 #define FL_ISSET(l, f) ((l) & (f))
00086
00087 #define F_INIT(p, f) FL_INIT((p)->flags, f)
00088 #define F_SET(p, f) FL_SET((p)->flags, f)
00089 #define F_CLR(p, f) FL_CLR((p)->flags, f)
00090 #define F_ISSET(p, f) FL_ISSET((p)->flags, f)
00091
00092 typedef struct polyhedron {
00093 unsigned Dimension, NbConstraints, NbRays, NbEq, NbBid;
00094 Value **Constraint;
00095 Value **Ray;
00096 Value *p_Init;
00097 int p_Init_size;
00098 struct polyhedron *next;
00099 #define POL_INEQUALITIES 0x00000001
00100 #define POL_FACETS 0x00000002
00101 #define POL_POINTS 0x00000004
00102 #define POL_VERTICES 0x00000008
00103
00104
00105
00106 #define POL_VALID 0x00000010
00107 unsigned flags;
00108 } Polyhedron;
00109
00110 typedef struct interval {
00111 Value MaxN, MaxD;
00112 Value MinN, MinD;
00113 int MaxI, MinI;
00114 } Interval;
00115
00116
00117 #define emptyQ(P) \
00118 ((F_ISSET(P, POL_INEQUALITIES) && P->NbEq > P->Dimension) || \
00119 (F_ISSET(P, POL_POINTS) && P->NbRays == 0))
00120
00121
00122 #define universeQ(P) (P->Dimension==P->NbBid)
00123
00124 typedef struct _Param_Vertex {
00125 Matrix *Vertex;
00126
00127
00128
00129 Matrix *Domain;
00130 unsigned *Facets;
00131 struct _Param_Vertex *next;
00132 } Param_Vertices;
00133
00134 typedef struct _Param_Domain {
00135 unsigned *F;
00136 Polyhedron *Domain;
00137 struct _Param_Domain *next;
00138 } Param_Domain;
00139
00140 typedef struct _Param_Polyhedron {
00141 int nbV;
00142 Param_Vertices *V;
00143 Param_Domain *D;
00144 Matrix *Constraints;
00145 Matrix *Rays;
00146 } Param_Polyhedron;
00147
00148 #define FORALL_PVertex_in_ParamPolyhedron(_V, _D, _P) \
00149 { int _i, _ix; \
00150 unsigned _bx; \
00151 for( _i=0, _ix=0, _bx=MSB, _V=_P->V ; \
00152 _V && (_i<_P->nbV) ; _i++, _V=_V->next ) \
00153 { if (_D->F[_ix] & _bx) \
00154 {
00155
00156 #define END_FORALL_PVertex_in_ParamPolyhedron \
00157 } \
00158 NEXT(_ix, _bx); \
00159 } \
00160 }
00161
00162
00163
00164 typedef enum { polynomial, periodic, evector } enode_type;
00165
00166 #ifdef CLN
00167 #define POLY_UNION_OR_STRUCT struct
00168 #else
00169 #define POLY_UNION_OR_STRUCT union
00170 #endif
00171
00172 typedef struct _evalue {
00173 Value d;
00174 POLY_UNION_OR_STRUCT {
00175 Value n;
00176 struct _enode *p;
00177 } x;
00178 } evalue;
00179
00180 typedef struct _enode {
00181 enode_type type;
00182 int size;
00183 int pos;
00184 evalue arr[1];
00185 } enode;
00186
00187 typedef struct _enumeration {
00188
00189 Polyhedron *ValidityDomain;
00190 evalue EP;
00191 struct _enumeration *next;
00192
00193
00194 } Enumeration;
00195
00196
00197
00198
00199
00200
00201
00202
00203
00204
00205
00206
00207
00208
00209
00210
00211
00212
00213
00214
00215
00216
00217 typedef enum {False = 0, True = 1} Bool;
00218 typedef Matrix Lattice;
00219 typedef struct LatticeUnion {
00220 Lattice *M;
00221 struct LatticeUnion *next;
00222 } LatticeUnion;
00223
00224 typedef struct ZPolyhedron {
00225 Lattice *Lat ;
00226 Polyhedron *P;
00227 struct ZPolyhedron *next;
00228 } ZPolyhedron;
00229
00230 #ifndef FOREVER
00231 #define FOREVER for(;;)
00232 #endif
00233
00234 #endif