doc: add some more publications that refer to barvinok
[barvinok.git] / barvinok / evalue.h
blob2119de3dc3f25f4fa02792520c0b2c3154e420ee
1 #ifndef EVALUE_H
2 #define EVALUE_H
4 #include <gmp.h>
6 #if defined(__cplusplus)
7 extern "C" {
8 #endif
10 #include <polylib/polylibgmp.h>
11 #undef divide
12 #undef value_compare
14 #define polynomial new_polynomial
15 #define periodic new_periodic
16 #define evector new_evector
17 #define enode_type new_enode_type
18 #define enode_node new_enode_node
19 #define _enumeration _new_enumeration
20 #define Enumeration _new_Enumeration
21 #define enode _new_enode
22 #define _enode _new__enode
23 #define evalue _new_evalue
24 #define _evalue _new__evalue
25 #define eadd _new_eadd
26 #define ecopy _new_ecopy
27 #define new_enode _new_new_enode
28 #define free_evalue_refs _new_free_evalue_refs
29 #define print_evalue _new_print_evalue
30 #define print_enode _new_print_enode
31 #define reduce_evalue _new_reduce
32 #define compute_evalue _new_compute_evalue
33 #define compute_poly _new_compute_poly
34 #define in_domain _new_in_domain
35 #define Enumeration_Free _new_Enumeration_Free
37 typedef enum { polynomial, periodic, evector, fractional, relation,
38 partition, flooring } enode_type;
40 typedef struct _evalue {
41 Value d; /* denominator */
42 union {
43 Value n; /* numerator (if denominator > 0) */
44 struct _enode *p; /* pointer (if denominator == 0) */
45 Polyhedron *D; /* domain (if denominator == -1) */
46 } x;
47 } evalue;
49 #define EVALUE_DOMAIN(ev) ((ev).x.D)
50 #define EVALUE_SET_DOMAIN(ev, D) \
51 do { \
52 value_set_si((ev).d, -1); \
53 EVALUE_DOMAIN(ev) = D; \
54 } while(0)
55 #define EVALUE_IS_DOMAIN(ev) (value_mone_p((ev).d))
57 #define EVALUE_IS_ZERO(ev) (value_pos_p((ev).d) && value_zero_p((ev).x.n))
58 #define EVALUE_IS_ONE(ev) (value_one_p((ev).d) && value_one_p((ev).x.n))
60 typedef struct _enode {
61 enode_type type; /* polynomial or periodic or evector */
62 int size; /* number of attached pointers */
63 int pos; /* parameter position */
64 evalue arr[1]; /* array of rational/pointer */
65 } enode;
67 typedef struct _enumeration {
69 Polyhedron *ValidityDomain; /* contraints on the parameters */
70 evalue EP; /* dimension = combined space */
71 struct _enumeration *next; /* Ehrhart Polynomial, corresponding
72 to parameter values inside the
73 domain ValidityDomain below */
74 } Enumeration;
77 void evalue_set_si(evalue *ev, int n, int d);
78 void evalue_set(evalue *ev, Value n, Value d);
79 void evalue_copy(evalue *dst, const evalue *src);
80 evalue *evalue_zero();
81 enode *new_enode(enode_type type,int size,int pos);
82 enode *ecopy(enode *e);
83 int eequal(evalue *e1,evalue *e2);
84 void free_evalue_refs(evalue *e);
85 void print_evalue(FILE *DST,evalue *e,char **pname);
86 void print_enode(FILE *DST,enode *p,char **pname);
87 void reduce_evalue (evalue *e);
88 void reduce_evalue_in_domain(evalue *e, Polyhedron *D);
89 void aep_evalue(evalue *e, int *ref);
90 void addeliminatedparams_evalue(evalue *e,Matrix *CT);
91 void addeliminatedparams_enum(evalue *e, Matrix *CT, Polyhedron *CEq,
92 unsigned MaxRays, unsigned nparam);
93 void eadd(const evalue *e1, evalue *res);
94 void emul (evalue *e1, evalue *res );
95 void emask(evalue *mask, evalue *res);
96 int in_domain(Polyhedron *P, Value *list_args);
97 double compute_evalue(evalue *e,Value *list_args);
98 Value *compute_poly(Enumeration *en,Value *list_args);
99 void evalue_mod2table(evalue *ev, int nparam);
100 void evalue_mod2relation(evalue *e);
101 void evalue_combine(evalue *e);
102 void evalue_range_reduction(evalue *e);
103 int evalue_range_reduction_in_domain(evalue *e, Polyhedron *D);
104 size_t evalue_size(evalue *e);
105 size_t domain_size(Polyhedron *D);
106 Enumeration* partition2enumeration(evalue *EP);
107 void evalue_frac2floor(evalue *e);
108 int evalue_frac2floor_in_domain(evalue *e, Polyhedron *D);
109 evalue *esum(evalue *E, int nvar);
110 void eor(evalue *e1, evalue *res);
111 void evalue_denom(evalue *e, Value *d);
113 #if defined(__cplusplus)
115 #endif
117 #endif