[Mlir-commits] [mlir] [MLIR][Presburger] Define matrix inverse for rational matrices (PR #67382)
llvmlistbot at llvm.org
llvmlistbot at llvm.org
Mon Sep 25 16:32:34 PDT 2023
github-actions[bot] wrote:
<!--LLVM CODE FORMAT COMMENT: {clang-format}-->
:warning: C/C++ code formatter, clang-format found issues in your code. :warning:
<details>
<summary>
You can test this locally with the following command:
</summary>
``````````bash
git-clang-format --diff c74398649f28ab78c74bacfe82e69224377008e7 69cce307842ab6bfbca10f44d3826623379a0385 -- mlir/include/mlir/Analysis/Presburger/Fraction.h mlir/include/mlir/Analysis/Presburger/Matrix.h mlir/lib/Analysis/Presburger/Matrix.cpp mlir/unittests/Analysis/Presburger/MatrixTest.cpp mlir/unittests/Analysis/Presburger/Utils.h
``````````
</details>
<details>
<summary>
View the diff from clang-format here.
</summary>
``````````diff
diff --git a/mlir/include/mlir/Analysis/Presburger/Matrix.h b/mlir/include/mlir/Analysis/Presburger/Matrix.h
index b9048334c39f..74edddd6cb7d 100644
--- a/mlir/include/mlir/Analysis/Presburger/Matrix.h
+++ b/mlir/include/mlir/Analysis/Presburger/Matrix.h
@@ -247,27 +247,25 @@ public:
// An inherited class for rational matrices, with no new data attributes.
// This is only used for the matrix-related method which apply only
// to fractions (inverse).
-class FracMatrix : public Matrix<Fraction>
-{
+class FracMatrix : public Matrix<Fraction> {
public:
FracMatrix(unsigned rows, unsigned columns, unsigned reservedRows = 0,
- unsigned reservedColumns = 0) :
- Matrix<Fraction>(rows, columns, reservedRows, reservedColumns) {};
+ unsigned reservedColumns = 0)
+ : Matrix<Fraction>(rows, columns, reservedRows, reservedColumns){};
- FracMatrix(Matrix<Fraction> m) :
- Matrix<Fraction>(m.getNumRows(), m.getNumColumns(), m.getNumReservedRows(), m.getNumReservedColumns())
- {
+ FracMatrix(Matrix<Fraction> m)
+ : Matrix<Fraction>(m.getNumRows(), m.getNumColumns(),
+ m.getNumReservedRows(), m.getNumReservedColumns()) {
for (unsigned i = 0; i < m.getNumRows(); i++)
for (unsigned j = 0; j < m.getNumColumns(); j++)
at(i, j) = m(i, j);
};
-
+
/// Return the identity matrix of the specified dimension.
static FracMatrix identity(unsigned dimension);
// Return the inverse of the matrix, leaving the calling object unmodified.
FracMatrix inverse();
-
};
} // namespace presburger
diff --git a/mlir/lib/Analysis/Presburger/Matrix.cpp b/mlir/lib/Analysis/Presburger/Matrix.cpp
index c0fbc688be2e..de5e2bbe285a 100644
--- a/mlir/lib/Analysis/Presburger/Matrix.cpp
+++ b/mlir/lib/Analysis/Presburger/Matrix.cpp
@@ -392,7 +392,6 @@ MPInt IntMatrix::normalizeRow(unsigned row) {
return normalizeRow(row, getNumColumns());
}
-
FracMatrix FracMatrix::identity(unsigned dimension) {
FracMatrix matrix(dimension, dimension);
for (unsigned i = 0; i < dimension; ++i)
@@ -400,60 +399,55 @@ FracMatrix FracMatrix::identity(unsigned dimension) {
return matrix;
}
-FracMatrix FracMatrix::inverse()
-{
- // We use Gaussian elimination on the rows of [M | I]
- // to find the integer inverse. We proceed left-to-right,
- // top-to-bottom. M is assumed to be a dim x dim matrix.
+FracMatrix FracMatrix::inverse() {
+ // We use Gaussian elimination on the rows of [M | I]
+ // to find the integer inverse. We proceed left-to-right,
+ // top-to-bottom. M is assumed to be a dim x dim matrix.
- unsigned dim = getNumRows();
+ unsigned dim = getNumRows();
- // Construct the augmented matrix [M | I]
- FracMatrix augmented(dim, dim + dim);
- for (unsigned i = 0; i < dim; i++)
- {
- augmented.fillRow(i, 0);
- for (unsigned j = 0; j < dim; j++)
- augmented(i, j) = at(i, j);
- augmented(i, dim+i).num = 1;
- augmented(i, dim+i).den = 1;
- }
- Fraction a, b;
- for (unsigned i = 0; i < dim; i++)
- {
- if (augmented(i, i) == Fraction(0, 1))
- for (unsigned j = i+1; j < dim; j++)
- if (augmented(j, i) != Fraction(0, 1))
- {
- augmented.addToRow(i, augmented.getRow(j), Fraction(1, 1));
- break;
- }
-
- b = augmented(i, i);
- for (unsigned j = 0; j < dim; j++)
- {
- if (i == j || augmented(j, i) == 0) continue;
- a = augmented(j, i);
- // Rj -> Rj - (b/a)Ri
- augmented.addToRow(j, augmented.getRow(i), - a / b);
- // Now (Rj)i = 0
+ // Construct the augmented matrix [M | I]
+ FracMatrix augmented(dim, dim + dim);
+ for (unsigned i = 0; i < dim; i++) {
+ augmented.fillRow(i, 0);
+ for (unsigned j = 0; j < dim; j++)
+ augmented(i, j) = at(i, j);
+ augmented(i, dim + i).num = 1;
+ augmented(i, dim + i).den = 1;
+ }
+ Fraction a, b;
+ for (unsigned i = 0; i < dim; i++) {
+ if (augmented(i, i) == Fraction(0, 1))
+ for (unsigned j = i + 1; j < dim; j++)
+ if (augmented(j, i) != Fraction(0, 1)) {
+ augmented.addToRow(i, augmented.getRow(j), Fraction(1, 1));
+ break;
}
+
+ b = augmented(i, i);
+ for (unsigned j = 0; j < dim; j++) {
+ if (i == j || augmented(j, i) == 0)
+ continue;
+ a = augmented(j, i);
+ // Rj -> Rj - (b/a)Ri
+ augmented.addToRow(j, augmented.getRow(i), -a / b);
+ // Now (Rj)i = 0
}
-
- // Now only diagonal elements are nonzero, but they are
- // not necessarily 1.
- for (unsigned i = 0; i < dim; i++)
- {
- a = augmented(i, i);
- for (unsigned j = dim; j < dim + dim; j++)
- augmented(i, j) = augmented(i, j) / a;
- }
+ }
+
+ // Now only diagonal elements are nonzero, but they are
+ // not necessarily 1.
+ for (unsigned i = 0; i < dim; i++) {
+ a = augmented(i, i);
+ for (unsigned j = dim; j < dim + dim; j++)
+ augmented(i, j) = augmented(i, j) / a;
+ }
- // Copy the right half of the augmented matrix.
- FracMatrix inverse(dim, dim);
- for (unsigned i = 0; i < dim; i++)
- for (unsigned j = 0; j < dim; j++)
- inverse(i, j) = augmented(i, j+dim);
+ // Copy the right half of the augmented matrix.
+ FracMatrix inverse(dim, dim);
+ for (unsigned i = 0; i < dim; i++)
+ for (unsigned j = 0; j < dim; j++)
+ inverse(i, j) = augmented(i, j + dim);
- return inverse;
+ return inverse;
}
\ No newline at end of file
diff --git a/mlir/unittests/Analysis/Presburger/MatrixTest.cpp b/mlir/unittests/Analysis/Presburger/MatrixTest.cpp
index d07318617e1a..efa6d4507d16 100644
--- a/mlir/unittests/Analysis/Presburger/MatrixTest.cpp
+++ b/mlir/unittests/Analysis/Presburger/MatrixTest.cpp
@@ -250,12 +250,16 @@ TEST(MatrixTest, computeHermiteNormalForm) {
}
TEST(MatrixTest, inverse) {
- FracMatrix mat = makeFracMatrix(2, 2, {{Fraction(2, 1), Fraction(1, 1)}, {Fraction(7, 1), Fraction(0, 1)}});
- FracMatrix inverse = makeFracMatrix(2, 2, {{Fraction(0, 1), Fraction(1, 7)}, {Fraction(1, 1), Fraction(-2, 7)}});
-
- FracMatrix inv = mat.inverse();
-
- for (unsigned row = 0; row < 2; row++)
- for (unsigned col = 0; col < 2; col++)
- EXPECT_EQ(inv(row, col), inverse(row, col));
+ FracMatrix mat = makeFracMatrix(
+ 2, 2,
+ {{Fraction(2, 1), Fraction(1, 1)}, {Fraction(7, 1), Fraction(0, 1)}});
+ FracMatrix inverse = makeFracMatrix(
+ 2, 2,
+ {{Fraction(0, 1), Fraction(1, 7)}, {Fraction(1, 1), Fraction(-2, 7)}});
+
+ FracMatrix inv = mat.inverse();
+
+ for (unsigned row = 0; row < 2; row++)
+ for (unsigned col = 0; col < 2; col++)
+ EXPECT_EQ(inv(row, col), inverse(row, col));
}
diff --git a/mlir/unittests/Analysis/Presburger/Utils.h b/mlir/unittests/Analysis/Presburger/Utils.h
index c652daa583a8..ce149c32ffa3 100644
--- a/mlir/unittests/Analysis/Presburger/Utils.h
+++ b/mlir/unittests/Analysis/Presburger/Utils.h
@@ -41,7 +41,7 @@ inline IntMatrix makeIntMatrix(unsigned numRow, unsigned numColumns,
}
inline FracMatrix makeFracMatrix(unsigned numRow, unsigned numColumns,
- ArrayRef<SmallVector<Fraction, 8>> matrix) {
+ ArrayRef<SmallVector<Fraction, 8>> matrix) {
FracMatrix results(numRow, numColumns);
assert(matrix.size() == numRow);
for (unsigned i = 0; i < numRow; ++i) {
``````````
</details>
https://github.com/llvm/llvm-project/pull/67382
More information about the Mlir-commits
mailing list