[Mlir-commits] [mlir] [MLIR][Presburger][WIP] Implement vertex enumeration and chamber decomposition for polytope generating function computation. (PR #78987)
Arjun P
llvmlistbot at llvm.org
Tue Jan 23 12:37:48 PST 2024
================
@@ -147,6 +148,323 @@ GeneratingFunction mlir::presburger::detail::unimodularConeGeneratingFunction(
std::vector({denominator}));
}
+/// We use Gaussian elimination to find the solution to a set of d equations
+/// of the form
+/// a_1 x_1 + ... + a_d x_d + b_1 m_1 + ... + b_p m_p + c = 0
+/// where x_i are variables,
+/// m_i are parameters and
+/// a_i, b_i, c are rational coefficients.
+/// The solution expresses each x_i as an affine function of the m_i, and is
+/// therefore represented as a matrix of size d x (p+1).
+/// If there is no solution, we return null.
+std::optional<ParamPoint>
+mlir::presburger::detail::solveParametricEquations(FracMatrix equations) {
+ // equations is a d x (d + p + 1) matrix.
+ // Each row represents an equation.
+ unsigned numEqs = equations.getNumRows();
+ unsigned numCols = equations.getNumColumns();
+
+ // If the determinant is zero, there is no unique solution.
+ // Thus we return null.
+ if (FracMatrix(equations.getSubMatrix(/*fromRow=*/0, /*toRow=*/numEqs - 1,
+ /*fromColumn=*/0,
+ /*toColumn=*/numEqs - 1))
+ .determinant() == 0)
+ return std::nullopt;
+
+ for (unsigned i = 0; i < numEqs; ++i) {
+ // First ensure that the diagonal element is nonzero, by swapping
+ // it with a row that is non-zero at column i.
+ if (equations(i, i) == 0) {
----------------
Superty wrote:
avoid nesting, early exit instead
https://github.com/llvm/llvm-project/pull/78987
More information about the Mlir-commits
mailing list