3 #include "ev_operations.h"
5 void evalue_set_si(evalue
*ev
, int n
, int d
) {
6 value_set_si(ev
->d
, d
);
8 value_set_si(ev
->x
.n
, n
);
11 void evalue_set(evalue
*ev
, Value n
, Value d
) {
12 value_assign(ev
->d
, d
);
14 value_assign(ev
->x
.n
, n
);
17 void aep_evalue(evalue
*e
, int *ref
) {
22 if (value_notzero_p(e
->d
))
23 return; /* a rational number, its already reduced */
25 return; /* hum... an overflow probably occured */
27 /* First check the components of p */
28 for (i
=0;i
<p
->size
;i
++)
29 aep_evalue(&p
->arr
[i
],ref
);
32 if (p
->type
!= modulo
)
33 p
->pos
= ref
[p
->pos
-1]+1;
38 void addeliminatedparams_evalue(evalue
*e
,Matrix
*CT
) {
44 if (value_notzero_p(e
->d
))
45 return; /* a rational number, its already reduced */
47 return; /* hum... an overflow probably occured */
50 ref
= (int *)malloc(sizeof(int)*(CT
->NbRows
-1));
51 for(i
=0;i
<CT
->NbRows
-1;i
++)
52 for(j
=0;j
<CT
->NbColumns
;j
++)
53 if(value_notzero_p(CT
->p
[i
][j
])) {
58 /* Transform the references in e, using ref */
62 } /* addeliminatedparams_evalue */
64 void reduce_evalue (evalue
*e
) {
69 if (value_notzero_p(e
->d
))
70 return; /* a rational number, its already reduced */
72 return; /* hum... an overflow probably occured */
74 /* First reduce the components of p */
75 for (i
=0; i
<p
->size
; i
++)
76 reduce_evalue(&p
->arr
[i
]);
78 if (p
->type
==periodic
) {
80 /* Try to reduce the period */
81 for (i
=1; i
<=(p
->size
)/2; i
++) {
82 if ((p
->size
% i
)==0) {
84 /* Can we reduce the size to i ? */
86 for (k
=j
+i
; k
<e
->x
.p
->size
; k
+=i
)
87 if (!eequal(&p
->arr
[j
], &p
->arr
[k
])) goto you_lose
;
90 for (j
=i
; j
<p
->size
; j
++) free_evalue_refs(&p
->arr
[j
]);
94 you_lose
: /* OK, lets not do it */
99 /* Try to reduce its strength */
102 memcpy(e
,&p
->arr
[0],sizeof(evalue
));
106 else if (p
->type
==polynomial
) {
108 /* Try to reduce the degree */
109 for (i
=p
->size
-1;i
>=0;i
--) {
110 if (value_one_p(p
->arr
[i
].d
) && value_zero_p(p
->arr
[i
].x
.n
))
112 /* Zero coefficient */
117 if (i
==-1) p
->size
= 1;
118 else if (i
+1<p
->size
) p
->size
= i
+1;
120 /* Try to reduce its strength */
123 memcpy(e
,&p
->arr
[0],sizeof(evalue
));
127 else if (p
->type
==modulo
) {
129 /* Try to reduce the degree */
130 for (i
=p
->size
-1;i
>=1;i
--) {
131 if (value_one_p(p
->arr
[i
].d
) && value_zero_p(p
->arr
[i
].x
.n
))
133 /* Zero coefficient */
138 if (i
==0) p
->size
= 2;
139 else if (i
+1<p
->size
) p
->size
= i
+1;
141 /* Try to reduce its strength */
144 memcpy(e
,&p
->arr
[1],sizeof(evalue
));
148 } /* reduce_evalue */
150 void print_evalue(FILE *DST
,evalue
*e
,char **pname
) {
152 if(value_notzero_p(e
->d
)) {
153 if(value_notone_p(e
->d
)) {
154 value_print(DST
,VALUE_FMT
,e
->x
.n
);
156 value_print(DST
,VALUE_FMT
,e
->d
);
159 value_print(DST
,VALUE_FMT
,e
->x
.n
);
163 print_enode(DST
,e
->x
.p
,pname
);
167 void print_enode(FILE *DST
,enode
*p
,char **pname
) {
172 fprintf(DST
, "NULL");
175 if (p
->type
== evector
) {
177 for (i
=0; i
<p
->size
; i
++) {
178 print_evalue(DST
, &p
->arr
[i
], pname
);
182 fprintf(DST
, " }\n");
184 else if (p
->type
== polynomial
) {
186 for (i
=p
->size
-1; i
>=0; i
--) {
187 print_evalue(DST
, &p
->arr
[i
], pname
);
188 if (i
==1) fprintf(DST
, " * %s + ", pname
[p
->pos
-1]);
190 fprintf(DST
, " * %s^%d + ", pname
[p
->pos
-1], i
);
192 fprintf(DST
, " )\n");
194 else if (p
->type
== periodic
) {
196 for (i
=0; i
<p
->size
; i
++) {
197 print_evalue(DST
, &p
->arr
[i
], pname
);
198 if (i
!=(p
->size
-1)) fprintf(DST
, ", ");
200 fprintf(DST
," ]_%s", pname
[p
->pos
-1]);
202 else if (p
->type
== modulo
) {
204 for (i
=p
->size
-1; i
>=1; i
--) {
205 print_evalue(DST
, &p
->arr
[i
], pname
);
211 print_evalue(DST
, &p
->arr
[0], pname
);
212 fprintf(DST
, ") mod %d", p
->pos
);
214 fprintf(DST
, ")^%d + ", i
-1);
216 fprintf(DST
, " + ", i
-1);
219 fprintf(DST
, " )\n");
224 static int mod_term_smaller(evalue
*e1
, evalue
*e2
)
226 if (value_notzero_p(e1
->d
)) {
227 if (value_zero_p(e2
->d
))
229 return value_lt(e1
->x
.n
, e2
->x
.n
);
231 if (value_notzero_p(e2
->d
))
233 if (e1
->x
.p
->pos
< e2
->x
.p
->pos
)
235 else if (e1
->x
.p
->pos
> e2
->x
.p
->pos
)
238 return mod_term_smaller(&e1
->x
.p
->arr
[0], &e2
->x
.p
->arr
[0]);
241 static void eadd_rev(evalue
*e1
, evalue
*res
)
245 evalue_copy(&ev
, e1
);
247 free_evalue_refs(res
);
251 static void eadd_rev_cst (evalue
*e1
, evalue
*res
)
255 evalue_copy(&ev
, e1
);
256 eadd(res
, &ev
.x
.p
->arr
[ev
.x
.p
->type
==modulo
]);
257 free_evalue_refs(res
);
261 void eadd(evalue
*e1
,evalue
*res
) {
264 if (value_notzero_p(e1
->d
) && value_notzero_p(res
->d
)) {
265 /* Add two rational numbers */
271 value_multiply(m1
,e1
->x
.n
,res
->d
);
272 value_multiply(m2
,res
->x
.n
,e1
->d
);
273 value_addto(res
->x
.n
,m1
,m2
);
274 value_multiply(res
->d
,e1
->d
,res
->d
);
275 Gcd(res
->x
.n
,res
->d
,&g
);
276 if (value_notone_p(g
)) {
277 value_division(res
->d
,res
->d
,g
);
278 value_division(res
->x
.n
,res
->x
.n
,g
);
280 value_clear(g
); value_clear(m1
); value_clear(m2
);
283 else if (value_notzero_p(e1
->d
) && value_zero_p(res
->d
)) {
284 switch (res
->x
.p
->type
) {
286 /* Add the constant to the constant term of a polynomial*/
287 eadd(e1
, &res
->x
.p
->arr
[0]);
290 /* Add the constant to all elements of a periodic number */
291 for (i
=0; i
<res
->x
.p
->size
; i
++) {
292 eadd(e1
, &res
->x
.p
->arr
[i
]);
296 fprintf(stderr
, "eadd: cannot add const with vector\n");
299 eadd(e1
, &res
->x
.p
->arr
[1]);
303 /* add polynomial or periodic to constant
304 * you have to exchange e1 and res, before doing addition */
306 else if (value_zero_p(e1
->d
) && value_notzero_p(res
->d
)) {
310 else { // ((e1->d==0) && (res->d==0))
311 if ((e1
->x
.p
->type
!= res
->x
.p
->type
) ) {
312 /* adding to evalues of different type. two cases are possible
313 * res is periodic and e1 is polynomial, you have to exchange
314 * e1 and res then to add e1 to the constant term of res */
315 if (e1
->x
.p
->type
== polynomial
) {
316 eadd_rev_cst(e1
, res
);
318 else if (res
->x
.p
->type
== polynomial
) {
319 /* res is polynomial and e1 is periodic,
320 add e1 to the constant term of res */
322 eadd(e1
,&res
->x
.p
->arr
[0]);
328 else if (e1
->x
.p
->pos
!= res
->x
.p
->pos
||
329 (res
->x
.p
->type
== modulo
&&
330 !eequal(&e1
->x
.p
->arr
[0], &res
->x
.p
->arr
[0]))) {
331 /* adding evalues of different position (i.e function of different unknowns
332 * to case are possible */
334 switch (res
->x
.p
->type
) {
336 if(mod_term_smaller(res
, e1
))
337 eadd(e1
,&res
->x
.p
->arr
[1]);
339 eadd_rev_cst(e1
, res
);
341 case polynomial
: // res and e1 are polynomials
342 // add e1 to the constant term of res
344 if(res
->x
.p
->pos
< e1
->x
.p
->pos
)
345 eadd(e1
,&res
->x
.p
->arr
[0]);
347 eadd_rev_cst(e1
, res
);
348 // value_clear(g); value_clear(m1); value_clear(m2);
350 case periodic
: // res and e1 are pointers to periodic numbers
351 //add e1 to all elements of res
353 if(res
->x
.p
->pos
< e1
->x
.p
->pos
)
354 for (i
=0;i
<res
->x
.p
->size
;i
++) {
355 eadd(e1
,&res
->x
.p
->arr
[i
]);
364 //same type , same pos and same size
365 if (e1
->x
.p
->size
== res
->x
.p
->size
) {
366 // add any element in e1 to the corresponding element in res
367 if (res
->x
.p
->type
== modulo
)
368 assert(eequal(&e1
->x
.p
->arr
[0], &res
->x
.p
->arr
[0]));
369 i
= res
->x
.p
->type
== modulo
? 1 : 0;
370 for (; i
<res
->x
.p
->size
; i
++) {
371 eadd(&e1
->x
.p
->arr
[i
], &res
->x
.p
->arr
[i
]);
376 /* Sizes are different */
377 if (res
->x
.p
->type
==polynomial
) {
378 /* VIN100: if e1-size > res-size you have to copy e1 in a */
379 /* new enode and add res to that new node. If you do not do */
380 /* that, you lose the the upper weight part of e1 ! */
382 if(e1
->x
.p
->size
> res
->x
.p
->size
) {
384 tmp
= ecopy(e1
->x
.p
);
385 for(i
=0;i
<res
->x
.p
->size
;++i
) {
386 eadd(&res
->x
.p
->arr
[i
], &tmp
->arr
[i
]);
387 // free_evalue_refs(&res->x.p->arr[i]);
394 for (i
=0; i
<e1
->x
.p
->size
; i
++) {
395 eadd(&e1
->x
.p
->arr
[i
], &res
->x
.p
->arr
[i
]);
402 /* add two periodics of the same pos (unknown) but whith different sizes (periods) */
403 else if (res
->x
.p
->type
==periodic
) {
404 /* you have to create a new evalue 'ne' in whitch size equals to the lcm
405 of the sizes of e1 and res, then to copy res periodicaly in ne, after
406 to add periodicaly elements of e1 to elements of ne, and finaly to
411 value_init(ex
); value_init(ey
);value_init(ep
);
414 value_set_si(ex
,e1
->x
.p
->size
);
415 value_set_si(ey
,res
->x
.p
->size
);
416 value_assign (ep
,*Lcm(ex
,ey
));
417 p
=(int)mpz_get_si(ep
);
418 ne
= (evalue
*) malloc (sizeof(evalue
));
420 value_set_si( ne
->d
,0);
422 ne
->x
.p
=new_enode(res
->x
.p
->type
,p
, res
->x
.p
->pos
);
424 value_assign(ne
->x
.p
->arr
[i
].d
, res
->x
.p
->arr
[i
%y
].d
);
425 if (value_notzero_p(ne
->x
.p
->arr
[i
].d
)) {
426 value_init(ne
->x
.p
->arr
[i
].x
.n
);
427 value_assign(ne
->x
.p
->arr
[i
].x
.n
, res
->x
.p
->arr
[i
%y
].x
.n
);
430 ne
->x
.p
->arr
[i
].x
.p
=ecopy(res
->x
.p
->arr
[i
%y
].x
.p
);
434 eadd(&e1
->x
.p
->arr
[i
%x
], &ne
->x
.p
->arr
[i
]);
437 value_assign(res
->d
, ne
->d
);
443 fprintf(stderr
, "eadd: ?cannot add vectors of different length\n");
450 static void emul_rev (evalue
*e1
, evalue
*res
)
454 evalue_copy(&ev
, e1
);
456 free_evalue_refs(res
);
460 static void emul_poly (evalue
*e1
, evalue
*res
)
462 int i
, j
, o
= res
->x
.p
->type
== modulo
;
464 int size
=(e1
->x
.p
->size
+ res
->x
.p
->size
- o
- 1);
466 value_set_si(tmp
.d
,0);
467 tmp
.x
.p
=new_enode(res
->x
.p
->type
, size
, res
->x
.p
->pos
);
469 evalue_copy(&tmp
.x
.p
->arr
[0], &e1
->x
.p
->arr
[0]);
470 for (i
=o
; i
< e1
->x
.p
->size
; i
++) {
471 evalue_copy(&tmp
.x
.p
->arr
[i
], &e1
->x
.p
->arr
[i
]);
472 emul(&res
->x
.p
->arr
[o
], &tmp
.x
.p
->arr
[i
]);
475 evalue_set_si(&tmp
.x
.p
->arr
[i
], 0, 1);
476 for (i
=o
+1; i
<res
->x
.p
->size
; i
++)
477 for (j
=o
; j
<e1
->x
.p
->size
; j
++) {
480 evalue_copy(&ev
, &e1
->x
.p
->arr
[j
]);
481 emul(&res
->x
.p
->arr
[i
], &ev
);
482 eadd(&ev
, &tmp
.x
.p
->arr
[i
+j
-o
]);
483 free_evalue_refs(&ev
);
485 free_evalue_refs(res
);
489 /* Computes the product of two evalues "e1" and "res" and puts the result in "res". you must
490 * do a copy of "res" befor calling this function if you nead it after. The vector type of
491 * evalues is not treated here */
493 void emul (evalue
*e1
, evalue
*res
){
496 if((value_zero_p(e1
->d
)&&e1
->x
.p
->type
==evector
)||(value_zero_p(res
->d
)&&(res
->x
.p
->type
==evector
))) {
497 fprintf(stderr
, "emul: do not proced on evector type !\n");
501 if(value_zero_p(e1
->d
)&& value_zero_p(res
->d
)) {
502 switch(e1
->x
.p
->type
) {
504 switch(res
->x
.p
->type
) {
506 if(e1
->x
.p
->pos
== res
->x
.p
->pos
) {
507 /* Product of two polynomials of the same variable */
512 /* Product of two polynomials of different variables */
514 if(res
->x
.p
->pos
< e1
->x
.p
->pos
)
515 for( i
=0; i
<res
->x
.p
->size
; i
++)
516 emul(e1
, &res
->x
.p
->arr
[i
]);
524 /* Product of a polynomial and a periodic or modulo */
529 switch(res
->x
.p
->type
) {
531 if(e1
->x
.p
->pos
==res
->x
.p
->pos
&& e1
->x
.p
->size
==res
->x
.p
->size
) {
532 /* Product of two periodics of the same parameter and period */
534 for(i
=0; i
<res
->x
.p
->size
;i
++)
535 emul(&(e1
->x
.p
->arr
[i
]), &(res
->x
.p
->arr
[i
]));
540 if(e1
->x
.p
->pos
==res
->x
.p
->pos
&& e1
->x
.p
->size
!=res
->x
.p
->size
) {
541 /* Product of two periodics of the same parameter and different periods */
545 value_init(x
); value_init(y
);value_init(z
);
548 value_set_si(x
,e1
->x
.p
->size
);
549 value_set_si(y
,res
->x
.p
->size
);
550 value_assign (z
,*Lcm(x
,y
));
551 lcm
=(int)mpz_get_si(z
);
552 newp
= (evalue
*) malloc (sizeof(evalue
));
554 value_set_si( newp
->d
,0);
555 newp
->x
.p
=new_enode(periodic
,lcm
, e1
->x
.p
->pos
);
557 value_assign(newp
->x
.p
->arr
[i
].d
, res
->x
.p
->arr
[i
%iy
].d
);
558 if (value_notzero_p(newp
->x
.p
->arr
[i
].d
)) {
559 value_assign(newp
->x
.p
->arr
[i
].x
.n
, res
->x
.p
->arr
[i
%iy
].x
.n
);
562 newp
->x
.p
->arr
[i
].x
.p
=ecopy(res
->x
.p
->arr
[i
%iy
].x
.p
);
567 emul(&e1
->x
.p
->arr
[i
%ix
], &newp
->x
.p
->arr
[i
]);
569 value_assign(res
->d
,newp
->d
);
572 value_clear(x
); value_clear(y
);value_clear(z
);
576 /* Product of two periodics of different parameters */
578 for(i
=0; i
<res
->x
.p
->size
; i
++)
579 emul(e1
, &(res
->x
.p
->arr
[i
]));
585 /* Product of a periodic and a polynomial */
587 for(i
=0; i
<res
->x
.p
->size
; i
++)
588 emul(e1
, &(res
->x
.p
->arr
[i
]));
594 switch(res
->x
.p
->type
) {
596 for(i
=0; i
<res
->x
.p
->size
; i
++)
597 emul(e1
, &(res
->x
.p
->arr
[i
]));
602 if (e1
->x
.p
->pos
== res
->x
.p
->pos
&&
603 eequal(&e1
->x
.p
->arr
[0], &res
->x
.p
->arr
[0]))
606 if(mod_term_smaller(res
, e1
))
607 for(i
=1; i
<res
->x
.p
->size
; i
++)
608 emul(e1
, &(res
->x
.p
->arr
[i
]));
617 if (value_notzero_p(e1
->d
)&& value_notzero_p(res
->d
)) {
618 /* Product of two rational numbers */
622 value_multiply(res
->d
,e1
->d
,res
->d
);
623 value_multiply(res
->x
.n
,e1
->x
.n
,res
->x
.n
);
624 Gcd(res
->x
.n
, res
->d
,&g
);
625 if (value_notone_p(g
)) {
626 value_division(res
->d
,res
->d
,g
);
627 value_division(res
->x
.n
,res
->x
.n
,g
);
633 if(value_zero_p(e1
->d
)&& value_notzero_p(res
->d
)) {
634 /* Product of an expression (polynomial or peririodic) and a rational number */
640 /* Product of a rationel number and an expression (polynomial or peririodic) */
642 i
= res
->x
.p
->type
== modulo
? 1 : 0;
643 for (; i
<res
->x
.p
->size
; i
++)
644 emul(e1
, &res
->x
.p
->arr
[i
]);
654 void evalue_copy(evalue
*dst
, evalue
*src
)
656 value_assign(dst
->d
, src
->d
);
657 if(value_notzero_p(src
->d
)) {
658 value_init(dst
->x
.n
);
659 value_assign(dst
->x
.n
, src
->x
.n
);
661 dst
->x
.p
= ecopy(src
->x
.p
);
664 enode
*new_enode(enode_type type
,int size
,int pos
) {
670 fprintf(stderr
, "Allocating enode of size 0 !\n" );
673 res
= (enode
*) malloc(sizeof(enode
) + (size
-1)*sizeof(evalue
));
677 for(i
=0; i
<size
; i
++) {
678 value_init(res
->arr
[i
].d
);
679 value_set_si(res
->arr
[i
].d
,0);
685 enode
*ecopy(enode
*e
) {
690 res
= new_enode(e
->type
,e
->size
,e
->pos
);
691 for(i
=0;i
<e
->size
;++i
) {
692 value_assign(res
->arr
[i
].d
,e
->arr
[i
].d
);
693 if(value_zero_p(res
->arr
[i
].d
))
694 res
->arr
[i
].x
.p
= ecopy(e
->arr
[i
].x
.p
);
696 value_init(res
->arr
[i
].x
.n
);
697 value_assign(res
->arr
[i
].x
.n
,e
->arr
[i
].x
.n
);
703 int eequal(evalue
*e1
,evalue
*e2
) {
708 if (value_ne(e1
->d
,e2
->d
))
712 if (value_notzero_p(e1
->d
)) {
713 if (value_ne(e1
->x
.n
,e2
->x
.n
))
716 /* e1->d == e2->d != 0 AND e1->n == e2->n */
720 /* e1->d == e2->d == 0 */
723 if (p1
->type
!= p2
->type
) return 0;
724 if (p1
->size
!= p2
->size
) return 0;
725 if (p1
->pos
!= p2
->pos
) return 0;
726 for (i
=0; i
<p1
->size
; i
++)
727 if (!eequal(&p1
->arr
[i
], &p2
->arr
[i
]) )
732 void free_evalue_refs(evalue
*e
) {
737 if (value_notzero_p(e
->d
)) {
739 /* 'e' stores a constant */
746 if (!p
) return; /* null pointer */
747 for (i
=0; i
<p
->size
; i
++) {
748 free_evalue_refs(&(p
->arr
[i
]));
752 } /* free_evalue_refs */
754 /****************************************************/
755 /* function compute enode */
756 /* compute the value of enode p with parameters */
757 /* list "list_args */
758 /* compute the polynomial or the periodic */
759 /****************************************************/
761 static double compute_enode(enode
*p
, Value
*list_args
) {
773 if (p
->type
== polynomial
) {
775 value_assign(param
,list_args
[p
->pos
-1]);
777 /* Compute the polynomial using Horner's rule */
778 for (i
=p
->size
-1;i
>0;i
--) {
779 res
+=compute_evalue(&p
->arr
[i
],list_args
);
780 res
*=VALUE_TO_DOUBLE(param
);
782 res
+=compute_evalue(&p
->arr
[0],list_args
);
784 else if (p
->type
== modulo
) {
785 double d
= compute_evalue(&p
->arr
[0], list_args
);
790 value_set_double(param
, d
);
791 value_set_si(m
, p
->pos
);
792 mpz_fdiv_r(param
, param
, m
);
794 /* Compute the polynomial using Horner's rule */
795 for (i
=p
->size
-1;i
>1;i
--) {
796 res
+=compute_evalue(&p
->arr
[i
],list_args
);
797 res
*=VALUE_TO_DOUBLE(param
);
799 res
+=compute_evalue(&p
->arr
[1],list_args
);
801 else if (p
->type
== periodic
) {
802 value_assign(param
,list_args
[p
->pos
-1]);
804 /* Choose the right element of the periodic */
805 value_absolute(m
,param
);
806 value_set_si(param
,p
->size
);
807 value_modulus(m
,m
,param
);
808 res
= compute_evalue(&p
->arr
[VALUE_TO_INT(m
)],list_args
);
813 } /* compute_enode */
815 /*************************************************/
816 /* return the value of Ehrhart Polynomial */
817 /* It returns a double, because since it is */
818 /* a recursive function, some intermediate value */
819 /* might not be integral */
820 /*************************************************/
822 double compute_evalue(evalue
*e
,Value
*list_args
) {
826 if (value_notzero_p(e
->d
)) {
827 if (value_notone_p(e
->d
))
828 res
= VALUE_TO_DOUBLE(e
->x
.n
) / VALUE_TO_DOUBLE(e
->d
);
830 res
= VALUE_TO_DOUBLE(e
->x
.n
);
833 res
= compute_enode(e
->x
.p
,list_args
);
835 } /* compute_evalue */
838 /****************************************************/
839 /* function compute_poly : */
840 /* Check for the good validity domain */
841 /* return the number of point in the Polyhedron */
842 /* in allocated memory */
843 /* Using the Ehrhart pseudo-polynomial */
844 /****************************************************/
845 Value
*compute_poly(Enumeration
*en
,Value
*list_args
) {
848 /* double d; int i; */
850 tmp
= (Value
*) malloc (sizeof(Value
));
853 value_set_si(*tmp
,0);
856 return(tmp
); /* no ehrhart polynomial */
857 if(en
->ValidityDomain
) {
858 if(!en
->ValidityDomain
->Dimension
) { /* no parameters */
859 value_set_double(*tmp
,compute_evalue(&en
->EP
,list_args
)+.25);
864 return(tmp
); /* no Validity Domain */
866 if(in_domain(en
->ValidityDomain
,list_args
)) {
868 #ifdef EVAL_EHRHART_DEBUG
869 Print_Domain(stdout
,en
->ValidityDomain
);
870 print_evalue(stdout
,&en
->EP
);
873 /* d = compute_evalue(&en->EP,list_args);
875 printf("(double)%lf = %d\n", d, i ); */
876 value_set_double(*tmp
,compute_evalue(&en
->EP
,list_args
)+.25);
882 value_set_si(*tmp
,0);
883 return(tmp
); /* no compatible domain with the arguments */