summate.c: sum_with_equalities: extract out sum_over_polytope_0D
authorSven Verdoolaege <skimo@kotnet.org>
Sat, 2 Feb 2013 09:45:32 +0000 (2 10:45 +0100)
committerSven Verdoolaege <skimo@kotnet.org>
Sat, 2 Feb 2013 09:48:20 +0000 (2 10:48 +0100)
We will be able to reuse this function is the next commit.
Note that we use P->Dimension instead of new_dim in sum_over_polytope_0D,
but these values should be the same.

Signed-off-by: Sven Verdoolaege <skimo@kotnet.org>
summate.c

index b34fc06..abbf22b 100644 (file)
--- a/summate.c
+++ b/summate.c
@@ -56,6 +56,28 @@ static void transform_polynomial(evalue *E, Matrix *T, Matrix *CP,
     free(subs);
 }
 
+/* Compute the sum of the quasi-polynomial E
+ * over a 0D (non-empty, but possibly parametric) polytope P.
+ *
+ * Consumes P and E.
+ *
+ * We simply return a partition evalue with P as domain and E as value.
+ */
+static evalue *sum_over_polytope_0D(Polyhedron *P, evalue *E)
+{
+       evalue *sum;
+
+       sum = ALLOC(evalue);
+       value_init(sum->d);
+       sum->x.p = new_enode(partition, 2, P->Dimension);
+       EVALUE_SET_DOMAIN(sum->x.p->arr[0], P);
+       value_clear(sum->x.p->arr[1].d);
+       sum->x.p->arr[1] = *E;
+       free(E);
+
+       return sum;
+}
+
 static evalue *sum_with_equalities(Polyhedron *P, evalue *E,
        unsigned nvar, struct evalue_section_array *sections,
        struct barvinok_options *options,
@@ -93,13 +115,7 @@ static evalue *sum_with_equalities(Polyhedron *P, evalue *E,
        evalue_free(E);
        Polyhedron_Free(P);
     } else {
-       sum = ALLOC(evalue);
-       value_init(sum->d);
-       sum->x.p = new_enode(partition, 2, new_dim);
-       EVALUE_SET_DOMAIN(sum->x.p->arr[0], P);
-       value_clear(sum->x.p->arr[1].d);
-       sum->x.p->arr[1] = *E;
-       free(E);
+       sum = sum_over_polytope_0D(P, E);
     }
 
     if (CP) {