00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012 #include <stdio.h>
00013 #include <math.h>
00014 #include <assert.h>
00015 #include <stdlib.h>
00016
00017 #include <polylib/polylib.h>
00018
00019
00020
00021
00022
00023
00024
00025
00026 int in_domain(Polyhedron *P, Value *list_args) {
00027
00028 int col,row;
00029 Value v;
00030
00031 Value tmp;
00032
00033 value_init(v);
00034 value_init(tmp);
00035
00036
00037 for(row=0;row<P->NbConstraints;row++) {
00038 value_assign(v,P->Constraint[row][P->Dimension+1]);
00039 for(col=1;col<P->Dimension+1;col++) {
00040 value_multiply(tmp,P->Constraint[row][col],list_args[col-1]);
00041 value_addto(v,v,tmp);
00042 }
00043 if (value_notzero_p(P->Constraint[row][0])) {
00044
00045
00046 if (value_neg_p(v)) {
00047 value_clear(v);
00048 value_clear(tmp);
00049 return 0;
00050 }
00051 }
00052 else {
00053
00054
00055 if (value_notzero_p(v)) {
00056 value_clear(v);
00057 value_clear(tmp);
00058 return 0;
00059 }
00060 }
00061 }
00062
00063
00064
00065 value_clear(v);
00066 value_clear(tmp);
00067 return 1;
00068 }
00069
00070
00071
00072
00073
00074
00075
00076
00077 static double compute_enode(enode *p, Value *list_args) {
00078
00079 int i;
00080 Value m, param;
00081 double res=0.0;
00082
00083 if (!p)
00084 return(0.);
00085
00086 value_init(m);
00087 value_init(param);
00088
00089 if (p->type == polynomial) {
00090 if (p->size > 1)
00091 value_assign(param,list_args[p->pos-1]);
00092
00093
00094 for (i=p->size-1;i>0;i--) {
00095 res +=compute_evalue(&p->arr[i],list_args);
00096 res *=VALUE_TO_DOUBLE(param);
00097 }
00098 res +=compute_evalue(&p->arr[0],list_args);
00099 }
00100 else if (p->type == periodic) {
00101 value_assign(param,list_args[p->pos-1]);
00102
00103
00104 value_absolute(m,param);
00105 value_set_si(param,p->size);
00106 value_modulus(m,m,param);
00107 res = compute_evalue(&p->arr[VALUE_TO_INT(m)],list_args);
00108 }
00109 value_clear(m);
00110 value_clear(param);
00111 return res;
00112 }
00113
00114
00115
00116
00117
00118
00119
00120
00121 double compute_evalue(evalue *e,Value *list_args) {
00122
00123 double res;
00124
00125 if (value_notzero_p(e->d)) {
00126 if (value_notone_p(e->d))
00127 res = VALUE_TO_DOUBLE(e->x.n) / VALUE_TO_DOUBLE(e->d);
00128 else
00129 res = VALUE_TO_DOUBLE(e->x.n);
00130 }
00131 else
00132 res = compute_enode(e->x.p,list_args);
00133 return res;
00134 }
00135
00136
00137
00138
00139
00140
00141
00142
00143
00144 Value *compute_poly(Enumeration *en,Value *list_args) {
00145
00146 Value *tmp;
00147
00148
00149 tmp = (Value *) malloc (sizeof(Value));
00150 assert(tmp != NULL);
00151 value_init(*tmp);
00152 value_set_si(*tmp,0);
00153
00154 if(!en)
00155 return(tmp);
00156 if(en->ValidityDomain) {
00157 if(!en->ValidityDomain->Dimension) {
00158 value_set_double(*tmp,compute_evalue(&en->EP,list_args)+.25);
00159 return(tmp);
00160 }
00161 }
00162 else
00163 return(tmp);
00164 while(en) {
00165 if(in_domain(en->ValidityDomain,list_args)) {
00166
00167 #ifdef EVAL_EHRHART_DEBUG
00168 Print_Domain(stdout,en->ValidityDomain);
00169 print_evalue(stdout,&en->EP);
00170 #endif
00171
00172
00173
00174
00175 value_set_double(*tmp,compute_evalue(&en->EP,list_args)+.25);
00176 return(tmp);
00177 }
00178 else
00179 en=en->next;
00180 }
00181 value_set_si(*tmp,0);
00182 return(tmp);
00183 }
00184
00185
00186
00187