gen_fun: add shift method
[barvinok.git] / reduce_domain.c
blob16251c8fdd62571bc26e0a29d8b3c7ad9397a029
1 #include "reduce_domain.h"
3 Polyhedron *reduce_domain(Polyhedron *D, Matrix *CT, Polyhedron *CEq,
4 Polyhedron **fVD, int nd, unsigned MaxRays)
6 Polyhedron *Dt, *rVD;
7 Value c;
8 int i;
10 Dt = CT ? DomainPreimage(D, CT, MaxRays) : D;
11 rVD = CEq ? DomainIntersection(Dt, CEq, MaxRays) : Domain_Copy(Dt);
13 /* if rVD is empty or too small in geometric dimension */
14 if(!rVD || emptyQ(rVD) ||
15 (CEq && rVD->Dimension-rVD->NbEq < Dt->Dimension-Dt->NbEq-CEq->NbEq)) {
16 if(rVD)
17 Domain_Free(rVD);
18 if (CT)
19 Domain_Free(Dt);
20 return 0; /* empty validity domain */
23 if (CT)
24 Domain_Free(Dt);
26 fVD[nd] = Domain_Copy(rVD);
27 for (i = 0 ; i < nd; ++i) {
28 Polyhedron *F;
29 Polyhedron *I = DomainIntersection(fVD[nd], fVD[i], MaxRays);
30 if (emptyQ(I)) {
31 Domain_Free(I);
32 continue;
34 F = DomainSimplify(I, fVD[nd], MaxRays);
35 if (F->NbEq == 1) {
36 Polyhedron *T = rVD;
37 rVD = DomainDifference(rVD, F, MaxRays);
38 Domain_Free(T);
40 Domain_Free(F);
41 Domain_Free(I);
44 rVD = DomainConstraintSimplify(rVD, MaxRays);
45 if (emptyQ(rVD)) {
46 Domain_Free(fVD[nd]);
47 Domain_Free(rVD);
48 return 0;
51 value_init(c);
52 barvinok_count(rVD, &c, MaxRays);
53 if (value_zero_p(c)) {
54 Domain_Free(rVD);
55 rVD = 0;
57 value_clear(c);
59 return rVD;