Initial implementation of barvinok_enumerate_e.
[barvinok.git] / ev_operations.h
blobbf9a4952b6ac3b66a4b414c1a1a7a519b91967ac
1 #ifndef EV_OPERATIONS_H
2 #define EV_OPERATIONS_H
4 #include <polylib/polylibgmp.h>
6 #define polynomial new_polynomial
7 #define periodic new_periodic
8 #define evector new_evector
9 #define enode_type new_enode_type
10 #define enode_node new_enode_node
11 #define _enumeration _new_enumeration
12 #define Enumeration _new_Enumeration
13 #define enode _new_enode
14 #define _enode _new__enode
15 #define evalue _new_evalue
16 #define _evalue _new__evalue
17 #define eadd _new_eadd
18 #define ecopy _new_ecopy
19 #define new_enode _new_new_enode
20 #define free_evalue_refs _new_free_evalue_refs
21 #define print_evalue _new_print_evalue
22 #define print_enode _new_print_enode
23 #define reduce_evalue _new_reduce
24 #define compute_evalue _new_compute_evalue
25 #define compute_poly _new_compute_poly
27 typedef enum { polynomial, periodic, evector, modulo, relation,
28 partition } enode_type;
30 typedef struct _evalue {
31 Value d; /* denominator */
32 union {
33 Value n; /* numerator (if denominator > 0) */
34 struct _enode *p; /* pointer (if denominator == 0) */
35 Polyhedron *D; /* domain (if denominator == -1) */
36 } x;
37 } evalue;
39 #define EVALUE_DOMAIN(ev) ((ev).x.D)
40 #define EVALUE_SET_DOMAIN(ev, D) \
41 do { \
42 value_set_si((ev).d, -1); \
43 EVALUE_DOMAIN(ev) = D; \
44 } while(0)
45 #define EVALUE_IS_DOMAIN(ev) (value_mone_p((ev).d))
47 #define EVALUE_IS_ZERO(ev) (value_pos_p((ev).d) && value_zero_p((ev).x.n))
49 typedef struct _enode {
50 enode_type type; /* polynomial or periodic or evector */
51 int size; /* number of attached pointers */
52 int pos; /* parameter position */
53 evalue arr[1]; /* array of rational/pointer */
54 } enode;
56 typedef struct _enumeration {
58 Polyhedron *ValidityDomain; /* contraints on the parameters */
59 evalue EP; /* dimension = combined space */
60 struct _enumeration *next; /* Ehrhart Polynomial, corresponding
61 to parameter values inside the
62 domain ValidityDomain below */
63 } Enumeration;
66 void evalue_set_si(evalue *ev, int n, int d);
67 void evalue_set(evalue *ev, Value n, Value d);
68 void evalue_copy(evalue *dst, evalue *src);
69 enode *new_enode(enode_type type,int size,int pos);
70 enode *ecopy(enode *e);
71 int eequal(evalue *e1,evalue *e2);
72 void free_evalue_refs(evalue *e);
73 void print_evalue(FILE *DST,evalue *e,char **pname);
74 void print_enode(FILE *DST,enode *p,char **pname);
75 void reduce_evalue (evalue *e);
76 void aep_evalue(evalue *e, int *ref);
77 void addeliminatedparams_evalue(evalue *e,Matrix *CT);
78 void eadd(evalue *e1,evalue *res);
79 void emul (evalue *e1, evalue *res );
80 double compute_evalue(evalue *e,Value *list_args);
81 Value *compute_poly(Enumeration *en,Value *list_args);
82 #endif