140 lines
7.4 KiB
C++
140 lines
7.4 KiB
C++
|
//===- MatrixTest.cpp - Tests for QuasiPolynomial -------------------------===//
|
|||
|
//
|
|||
|
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
|||
|
// See https://llvm.org/LICENSE.txt for license information.
|
|||
|
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
|||
|
//
|
|||
|
//===----------------------------------------------------------------------===//
|
|||
|
|
|||
|
#include "mlir/Analysis/Presburger/QuasiPolynomial.h"
|
|||
|
#include "./Utils.h"
|
|||
|
#include "mlir/Analysis/Presburger/Fraction.h"
|
|||
|
#include <gmock/gmock.h>
|
|||
|
#include <gtest/gtest.h>
|
|||
|
|
|||
|
using namespace mlir;
|
|||
|
using namespace presburger;
|
|||
|
|
|||
|
// Test the arithmetic operations on QuasiPolynomials;
|
|||
|
// addition, subtraction, multiplication, and division
|
|||
|
// by a constant.
|
|||
|
// Two QPs of 3 parameters each were generated randomly
|
|||
|
// and their sum, difference, and product computed by hand.
|
|||
|
TEST(QuasiPolynomialTest, arithmetic) {
|
|||
|
QuasiPolynomial qp1(
|
|||
|
3, {Fraction(1, 3), Fraction(1, 1), Fraction(1, 2)},
|
|||
|
{{{Fraction(1, 1), Fraction(-1, 2), Fraction(4, 5), Fraction(0, 1)},
|
|||
|
{Fraction(2, 3), Fraction(3, 4), Fraction(-1, 1), Fraction(5, 7)}},
|
|||
|
{{Fraction(1, 2), Fraction(1, 1), Fraction(4, 5), Fraction(1, 1)}},
|
|||
|
{{Fraction(-3, 2), Fraction(1, 1), Fraction(5, 6), Fraction(7, 5)},
|
|||
|
{Fraction(1, 4), Fraction(2, 1), Fraction(6, 5), Fraction(-9, 8)},
|
|||
|
{Fraction(3, 2), Fraction(2, 5), Fraction(-7, 4), Fraction(0, 1)}}});
|
|||
|
QuasiPolynomial qp2(
|
|||
|
3, {Fraction(1, 1), Fraction(2, 1)},
|
|||
|
{{{Fraction(1, 2), Fraction(0, 1), Fraction(-1, 3), Fraction(5, 3)},
|
|||
|
{Fraction(2, 1), Fraction(5, 4), Fraction(9, 7), Fraction(-1, 5)}},
|
|||
|
{{Fraction(1, 3), Fraction(-2, 3), Fraction(1, 1), Fraction(0, 1)}}});
|
|||
|
|
|||
|
QuasiPolynomial sum = qp1 + qp2;
|
|||
|
EXPECT_EQ_REPR_QUASIPOLYNOMIAL(
|
|||
|
sum,
|
|||
|
QuasiPolynomial(
|
|||
|
3,
|
|||
|
{Fraction(1, 3), Fraction(1, 1), Fraction(1, 2), Fraction(1, 1),
|
|||
|
Fraction(2, 1)},
|
|||
|
{{{Fraction(1, 1), Fraction(-1, 2), Fraction(4, 5), Fraction(0, 1)},
|
|||
|
{Fraction(2, 3), Fraction(3, 4), Fraction(-1, 1), Fraction(5, 7)}},
|
|||
|
{{Fraction(1, 2), Fraction(1, 1), Fraction(4, 5), Fraction(1, 1)}},
|
|||
|
{{Fraction(-3, 2), Fraction(1, 1), Fraction(5, 6), Fraction(7, 5)},
|
|||
|
{Fraction(1, 4), Fraction(2, 1), Fraction(6, 5), Fraction(-9, 8)},
|
|||
|
{Fraction(3, 2), Fraction(2, 5), Fraction(-7, 4), Fraction(0, 1)}},
|
|||
|
{{Fraction(1, 2), Fraction(0, 1), Fraction(-1, 3), Fraction(5, 3)},
|
|||
|
{Fraction(2, 1), Fraction(5, 4), Fraction(9, 7), Fraction(-1, 5)}},
|
|||
|
{{Fraction(1, 3), Fraction(-2, 3), Fraction(1, 1),
|
|||
|
Fraction(0, 1)}}}));
|
|||
|
|
|||
|
QuasiPolynomial diff = qp1 - qp2;
|
|||
|
EXPECT_EQ_REPR_QUASIPOLYNOMIAL(
|
|||
|
diff,
|
|||
|
QuasiPolynomial(
|
|||
|
3,
|
|||
|
{Fraction(1, 3), Fraction(1, 1), Fraction(1, 2), Fraction(-1, 1),
|
|||
|
Fraction(-2, 1)},
|
|||
|
{{{Fraction(1, 1), Fraction(-1, 2), Fraction(4, 5), Fraction(0, 1)},
|
|||
|
{Fraction(2, 3), Fraction(3, 4), Fraction(-1, 1), Fraction(5, 7)}},
|
|||
|
{{Fraction(1, 2), Fraction(1, 1), Fraction(4, 5), Fraction(1, 1)}},
|
|||
|
{{Fraction(-3, 2), Fraction(1, 1), Fraction(5, 6), Fraction(7, 5)},
|
|||
|
{Fraction(1, 4), Fraction(2, 1), Fraction(6, 5), Fraction(-9, 8)},
|
|||
|
{Fraction(3, 2), Fraction(2, 5), Fraction(-7, 4), Fraction(0, 1)}},
|
|||
|
{{Fraction(1, 2), Fraction(0, 1), Fraction(-1, 3), Fraction(5, 3)},
|
|||
|
{Fraction(2, 1), Fraction(5, 4), Fraction(9, 7), Fraction(-1, 5)}},
|
|||
|
{{Fraction(1, 3), Fraction(-2, 3), Fraction(1, 1),
|
|||
|
Fraction(0, 1)}}}));
|
|||
|
|
|||
|
QuasiPolynomial prod = qp1 * qp2;
|
|||
|
EXPECT_EQ_REPR_QUASIPOLYNOMIAL(
|
|||
|
prod,
|
|||
|
QuasiPolynomial(
|
|||
|
3,
|
|||
|
{Fraction(1, 3), Fraction(2, 3), Fraction(1, 1), Fraction(2, 1),
|
|||
|
Fraction(1, 2), Fraction(1, 1)},
|
|||
|
{{{Fraction(1, 1), Fraction(-1, 2), Fraction(4, 5), Fraction(0, 1)},
|
|||
|
{Fraction(2, 3), Fraction(3, 4), Fraction(-1, 1), Fraction(5, 7)},
|
|||
|
{Fraction(1, 2), Fraction(0, 1), Fraction(-1, 3), Fraction(5, 3)},
|
|||
|
{Fraction(2, 1), Fraction(5, 4), Fraction(9, 7), Fraction(-1, 5)}},
|
|||
|
{{Fraction(1, 1), Fraction(-1, 2), Fraction(4, 5), Fraction(0, 1)},
|
|||
|
{Fraction(2, 3), Fraction(3, 4), Fraction(-1, 1), Fraction(5, 7)},
|
|||
|
{Fraction(1, 3), Fraction(-2, 3), Fraction(1, 1), Fraction(0, 1)}},
|
|||
|
{{Fraction(1, 2), Fraction(1, 1), Fraction(4, 5), Fraction(1, 1)},
|
|||
|
{Fraction(1, 2), Fraction(0, 1), Fraction(-1, 3), Fraction(5, 3)},
|
|||
|
{Fraction(2, 1), Fraction(5, 4), Fraction(9, 7), Fraction(-1, 5)}},
|
|||
|
{{Fraction(1, 2), Fraction(1, 1), Fraction(4, 5), Fraction(1, 1)},
|
|||
|
{Fraction(1, 3), Fraction(-2, 3), Fraction(1, 1), Fraction(0, 1)}},
|
|||
|
{{Fraction(-3, 2), Fraction(1, 1), Fraction(5, 6), Fraction(7, 5)},
|
|||
|
{Fraction(1, 4), Fraction(2, 1), Fraction(6, 5), Fraction(-9, 8)},
|
|||
|
{Fraction(3, 2), Fraction(2, 5), Fraction(-7, 4), Fraction(0, 1)},
|
|||
|
{Fraction(1, 2), Fraction(0, 1), Fraction(-1, 3), Fraction(5, 3)},
|
|||
|
{Fraction(2, 1), Fraction(5, 4), Fraction(9, 7), Fraction(-1, 5)}},
|
|||
|
{{Fraction(-3, 2), Fraction(1, 1), Fraction(5, 6), Fraction(7, 5)},
|
|||
|
{Fraction(1, 4), Fraction(2, 1), Fraction(6, 5), Fraction(-9, 8)},
|
|||
|
{Fraction(3, 2), Fraction(2, 5), Fraction(-7, 4), Fraction(0, 1)},
|
|||
|
{Fraction(1, 3), Fraction(-2, 3), Fraction(1, 1),
|
|||
|
Fraction(0, 1)}}}));
|
|||
|
|
|||
|
QuasiPolynomial quot = qp1 / 2;
|
|||
|
EXPECT_EQ_REPR_QUASIPOLYNOMIAL(
|
|||
|
quot,
|
|||
|
QuasiPolynomial(
|
|||
|
3, {Fraction(1, 6), Fraction(1, 2), Fraction(1, 4)},
|
|||
|
{{{Fraction(1, 1), Fraction(-1, 2), Fraction(4, 5), Fraction(0, 1)},
|
|||
|
{Fraction(2, 3), Fraction(3, 4), Fraction(-1, 1), Fraction(5, 7)}},
|
|||
|
{{Fraction(1, 2), Fraction(1, 1), Fraction(4, 5), Fraction(1, 1)}},
|
|||
|
{{Fraction(-3, 2), Fraction(1, 1), Fraction(5, 6), Fraction(7, 5)},
|
|||
|
{Fraction(1, 4), Fraction(2, 1), Fraction(6, 5), Fraction(-9, 8)},
|
|||
|
{Fraction(3, 2), Fraction(2, 5), Fraction(-7, 4),
|
|||
|
Fraction(0, 1)}}}));
|
|||
|
}
|
|||
|
|
|||
|
// Test the simplify() operation on QPs, which removes terms that
|
|||
|
// are identically zero. A random QP was generated and terms were
|
|||
|
// changed to account for each condition in simplify() –
|
|||
|
// the term coefficient being zero, or all the coefficients in some
|
|||
|
// affine term in the product being zero.
|
|||
|
TEST(QuasiPolynomialTest, simplify) {
|
|||
|
QuasiPolynomial qp(2,
|
|||
|
{Fraction(2, 3), Fraction(0, 1), Fraction(1, 1),
|
|||
|
Fraction(1, 2), Fraction(0, 1)},
|
|||
|
{{{Fraction(1, 1), Fraction(3, 4), Fraction(5, 3)},
|
|||
|
{Fraction(2, 1), Fraction(0, 1), Fraction(0, 1)}},
|
|||
|
{{Fraction(1, 3), Fraction(8, 5), Fraction(2, 5)}},
|
|||
|
{{Fraction(2, 7), Fraction(9, 5), Fraction(0, 1)},
|
|||
|
{Fraction(0, 1), Fraction(0, 1), Fraction(0, 1)}},
|
|||
|
{{Fraction(1, 1), Fraction(4, 5), Fraction(6, 5)}},
|
|||
|
{{Fraction(1, 3), Fraction(4, 3), Fraction(7, 8)}}});
|
|||
|
EXPECT_EQ_REPR_QUASIPOLYNOMIAL(
|
|||
|
qp.simplify(),
|
|||
|
QuasiPolynomial(2, {Fraction(2, 3), Fraction(1, 2)},
|
|||
|
{{{Fraction(1, 1), Fraction(3, 4), Fraction(5, 3)},
|
|||
|
{Fraction(2, 1), Fraction(0, 1), Fraction(0, 1)}},
|
|||
|
{{Fraction(1, 1), Fraction(4, 5), Fraction(6, 5)}}}));
|
|||
|
}
|