9 static int lex_cmp(vec_ZZ
& a
, vec_ZZ
& b
)
11 assert(a
.length() == b
.length());
13 for (int j
= 0; j
< a
.length(); ++j
)
15 return a
[j
] < b
[j
] ? -1 : 1;
19 static int lex_cmp(mat_ZZ
& a
, mat_ZZ
& b
)
21 assert(a
.NumCols() == b
.NumCols());
22 int alen
= a
.NumRows();
23 int blen
= b
.NumRows();
24 int len
= alen
< blen
? alen
: blen
;
26 for (int i
= 0; i
< len
; ++i
) {
27 int s
= lex_cmp(a
[i
], b
[i
]);
34 void gen_fun::add(ZZ
& cn
, ZZ
& cd
, vec_ZZ
& num
, mat_ZZ
& den
)
39 short_rat
* r
= new short_rat
;
40 r
->n
.coeff
.SetDims(1, 2);
41 r
->n
.coeff
[0][0] = cn
;
42 r
->n
.coeff
[0][1] = cd
;
43 r
->n
.power
.SetDims(1, num
.length());
47 for (int i
= 0; i
< r
->d
.power
.NumRows(); ++i
) {
49 for (j
= 0; j
< r
->d
.power
.NumCols(); ++j
)
50 if (r
->d
.power
[i
][j
] != 0)
52 if (r
->d
.power
[i
][j
] < 0) {
53 r
->d
.power
[i
] = -r
->d
.power
[i
];
54 r
->n
.coeff
[0][0] = -r
->n
.coeff
[0][0];
55 r
->n
.power
[0] += r
->d
.power
[i
];
59 for (int i
= 0; i
< term
.size(); ++i
)
60 if (lex_cmp(term
[i
]->d
.power
, r
->d
.power
) == 0) {
61 int len
= term
[i
]->n
.coeff
.NumRows();
62 int dim
= term
[i
]->n
.power
.NumCols();
63 term
[i
]->n
.coeff
.SetDims(len
+1, 2);
64 term
[i
]->n
.power
.SetDims(len
+1, dim
);
65 term
[i
]->n
.coeff
[len
] = r
->n
.coeff
[0];
66 term
[i
]->n
.power
[len
] = r
->n
.power
[0];
74 static void print_power(vec_ZZ
& c
, vec_ZZ
& p
,
75 unsigned int nparam
, char **param_name
)
79 for (int i
= 0; i
< p
.length(); ++i
) {
83 if (c
[0] == -1 && c
[1] == 1)
85 else if (c
[0] != 1 || c
[1] != 1) {
88 cout
<< " / " << c
[1];
95 cout
<< param_name
[i
];
101 cout
<< "^(" << p
[i
] << ")";
108 cout
<< " / " << c
[1];
112 void gen_fun::print(unsigned int nparam
, char **param_name
)
118 for (int i
= 0; i
< term
.size(); ++i
) {
122 for (int j
= 0; j
< term
[i
]->n
.coeff
.NumRows(); ++j
) {
123 if (j
!= 0 && term
[i
]->n
.coeff
[j
][0] > 0)
125 print_power(term
[i
]->n
.coeff
[j
], term
[i
]->n
.power
[j
],
129 for (int j
= 0; j
< term
[i
]->d
.power
.NumRows(); ++j
) {
133 print_power(mone
, term
[i
]->d
.power
[j
],
141 gen_fun::operator evalue
*()
145 value_init(factor
.d
);
146 value_init(factor
.x
.n
);
147 for (int i
= 0; i
< term
.size(); ++i
) {
148 unsigned nvar
= term
[i
]->d
.power
.NumRows();
149 unsigned nparam
= term
[i
]->d
.power
.NumCols();
150 Matrix
*C
= Matrix_Alloc(nparam
+ nvar
, 1 + nvar
+ nparam
+ 1);
151 mat_ZZ
& d
= term
[i
]->d
.power
;
152 Polyhedron
*U
= Universe_Polyhedron(nparam
);
154 for (int j
= 0; j
< term
[i
]->n
.coeff
.NumRows(); ++j
) {
155 for (int r
= 0; r
< nparam
; ++r
) {
156 value_set_si(C
->p
[r
][0], 0);
157 for (int c
= 0; c
< nvar
; ++c
) {
158 zz2value(d
[c
][r
], C
->p
[r
][1+c
]);
160 Vector_Set(&C
->p
[r
][1+nvar
], 0, nparam
);
161 value_set_si(C
->p
[r
][1+nvar
+r
], -1);
162 zz2value(term
[i
]->n
.power
[j
][r
], C
->p
[r
][1+nvar
+nparam
]);
164 for (int r
= 0; r
< nvar
; ++r
) {
165 value_set_si(C
->p
[nparam
+r
][0], 1);
166 Vector_Set(&C
->p
[nparam
+r
][1], 0, nvar
+ nparam
+ 1);
167 value_set_si(C
->p
[nparam
+r
][1+r
], 1);
169 Polyhedron
*P
= Constraints2Polyhedron(C
, 0);
170 evalue
*E
= barvinok_enumerate_ev(P
, U
, 0);
172 zz2value(term
[i
]->n
.coeff
[j
][0], factor
.x
.n
);
173 zz2value(term
[i
]->n
.coeff
[j
][1], factor
.d
);
176 Matrix_Print(stdout, P_VALUE_FMT, C);
177 char *test[] = { "A", "B", "C", "D", "E", "F", "G" };
178 print_evalue(stdout, E, test);
190 value_clear(factor
.d
);
191 value_clear(factor
.x
.n
);