[Mlir-commits] [mlir] [MLIR][Presburger] Implement computation of generating function for unimodular cones (PR #77235)
Arjun P
llvmlistbot at llvm.org
Mon Jan 8 08:47:55 PST 2024
================
@@ -63,3 +63,78 @@ MPInt mlir::presburger::detail::getIndex(ConeV cone) {
return cone.determinant();
}
+
+/// Compute the generating function for a unimodular cone.
+/// This consists of a single term of the form
+/// x^num / prod_j (1 - x^den_j)
+///
+/// den_j is defined as the set of generators of the cone.
+/// num is computed by expressing the vertex as a weighted
+/// sum of the generators, and then taking the floor of the
+/// coefficients.
+GeneratingFunction mlir::presburger::detail::unimodularConeGeneratingFunction(
+ ParamPoint vertex, int sign, ConeH cone) {
+ // `cone` is assumed to be unimodular.
+ assert(getIndex(getDual(cone)) == 1 && "input cone is not unimodular!");
+
+ unsigned numVar = cone.getNumVars();
+ unsigned numIneq = cone.getNumInequalities();
+
+ // Thus its ray matrix, U, is the inverse of the
+ // transpose of its inequality matrix, `cone`.
+ FracMatrix transp(numVar, numIneq);
+ for (unsigned i = 0; i < numVar; ++i)
+ for (unsigned j = 0; j < numIneq; ++j)
+ transp(j, i) = Fraction(cone.atIneq(i, j), 1);
+
+ FracMatrix generators(numVar, numIneq);
+ transp.determinant(&generators); // This is the U-matrix.
+
+ // The denominators of the generating function
+ // are given by the generators of the cone, i.e.,
+ // the rows of the matrix U.
+ std::vector<Point> denominator(numIneq);
+ ArrayRef<Fraction> row;
+ for (unsigned i = 0; i < numVar; ++i) {
+ row = generators.getRow(i);
+ denominator[i] = Point(row);
+ }
+
+ // The vertex is v : [d, n+1].
+ // We need to find affine functions of parameters λi(p)
+ // such that v = Σ λi(p)*ui.
----------------
Superty wrote:
u_i
https://github.com/llvm/llvm-project/pull/77235
More information about the Mlir-commits
mailing list