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) (P->NbRays==0)
00118
00119
00120 #define universeQ(P) (P->Dimension==P->NbBid)
00121
00122 typedef struct _Param_Vertex {
00123 Matrix *Vertex;
00124
00125
00126
00127 Matrix *Domain;
00128 struct _Param_Vertex *next;
00129 } Param_Vertices;
00130
00131 typedef struct _Param_Domain {
00132 unsigned *F;
00133 Polyhedron *Domain;
00134 struct _Param_Domain *next;
00135 } Param_Domain;
00136
00137 typedef struct _Param_Polyhedron {
00138 int nbV;
00139 Param_Vertices *V;
00140 Param_Domain *D;
00141 } Param_Polyhedron;
00142
00143 #define FORALL_PVertex_in_ParamPolyhedron(_V, _D, _P) \
00144 { int _i, _ix; \
00145 unsigned _bx; \
00146 for( _i=0, _ix=0, _bx=MSB, _V=_P->V ; \
00147 _V && (_i<_P->nbV) ; _i++, _V=_V->next ) \
00148 { if (_D->F[_ix] & _bx) \
00149 {
00150
00151 #define END_FORALL_PVertex_in_ParamPolyhedron \
00152 } \
00153 NEXT(_ix, _bx); \
00154 } \
00155 }
00156
00157
00158
00159 typedef enum { polynomial, periodic, evector } enode_type;
00160
00161 #ifdef CLN
00162 #define POLY_UNION_OR_STRUCT struct
00163 #else
00164 #define POLY_UNION_OR_STRUCT union
00165 #endif
00166
00167 typedef struct _evalue {
00168 Value d;
00169 POLY_UNION_OR_STRUCT {
00170 Value n;
00171 struct _enode *p;
00172 } x;
00173 } evalue;
00174
00175 typedef struct _enode {
00176 enode_type type;
00177 int size;
00178 int pos;
00179 evalue arr[1];
00180 } enode;
00181
00182 typedef struct _enumeration {
00183
00184 Polyhedron *ValidityDomain;
00185 evalue EP;
00186 struct _enumeration *next;
00187
00188
00189 } Enumeration;
00190
00191
00192
00193
00194
00195
00196
00197
00198
00199
00200
00201
00202
00203
00204
00205
00206
00207
00208
00209
00210
00211
00212 typedef enum {False = 0, True = 1} Bool;
00213 typedef Matrix Lattice;
00214 typedef struct LatticeUnion {
00215 Lattice *M;
00216 struct LatticeUnion *next;
00217 } LatticeUnion;
00218
00219 typedef struct ZPolyhedron {
00220 Lattice *Lat ;
00221 Polyhedron *P;
00222 struct ZPolyhedron *next;
00223 } ZPolyhedron;
00224
00225 #ifndef FOREVER
00226 #define FOREVER for(;;)
00227 #endif
00228
00229 #endif
00230
00231
00232
00233
00234
00235
00236
00237
00238
00239
00240
00241