mirror of
https://github.com/intel/llvm.git
synced 2026-01-24 08:30:34 +08:00
This is an artifact from merging MLIR into LLVM, the file headers are now aligned with the rest of the project.
143 lines
4.7 KiB
C++
143 lines
4.7 KiB
C++
//===- UniformSolversTest.cpp - Tests for uniform solvers -----------------===//
|
|
//
|
|
// 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/Quantizer/Support/UniformSolvers.h"
|
|
#include "gtest/gtest.h"
|
|
|
|
using namespace mlir;
|
|
using namespace mlir::quantizer;
|
|
|
|
namespace {
|
|
|
|
const double kEpsilon = 1e-12;
|
|
|
|
TEST(UniformMathTest, testAsym) {
|
|
UniformParamsFromMinMaxSolver s(UniformStorageParams::getQuint8(), -8, 8.123);
|
|
ASSERT_TRUE(s.compute());
|
|
|
|
llvm::errs() << "testBasic Results: " << s << "\n";
|
|
|
|
EXPECT_EQ(0.0, s.dequantize(s.getZp())); // Exact.
|
|
EXPECT_EQ(s.getZp(), s.quantize(0.0));
|
|
EXPECT_GE(s.getAdjMax() + kEpsilon, s.getBoundingMax());
|
|
EXPECT_LE(s.getAdjMin() - kEpsilon, s.getBoundingMin());
|
|
}
|
|
|
|
TEST(UniformMathTest, testPOT) {
|
|
UniformParamsFromMinMaxSolver s(UniformStorageParams::getQuint8(), -8,
|
|
7.9375);
|
|
ASSERT_TRUE(s.compute());
|
|
|
|
llvm::errs() << "testPOT Results: " << s << "\n";
|
|
|
|
// POT ranges should be exact.
|
|
EXPECT_EQ(128, s.getZp());
|
|
EXPECT_NEAR(6.25e-2, s.getScale(), kEpsilon);
|
|
EXPECT_EQ(0.0, s.dequantize(s.getZp())); // Exact.
|
|
EXPECT_EQ(s.getZp(), s.quantize(0.0));
|
|
EXPECT_GE(s.getAdjMax() + kEpsilon, s.getBoundingMax());
|
|
EXPECT_LE(s.getAdjMin() - kEpsilon, s.getBoundingMin());
|
|
}
|
|
|
|
TEST(UniformMathTest, testLopsidedPositive) {
|
|
UniformParamsFromMinMaxSolver s(UniformStorageParams::getQuint8(), 1.0, 8.0);
|
|
ASSERT_TRUE(s.compute());
|
|
|
|
llvm::errs() << "testLopsidedPositive Results: " << s << "\n";
|
|
|
|
EXPECT_EQ(0, s.getZp());
|
|
EXPECT_EQ(0.0, s.dequantize(s.getZp())); // Exact.
|
|
EXPECT_EQ(0, s.quantize(0.0));
|
|
EXPECT_GE(s.getAdjMax() + kEpsilon, s.getBoundingMax());
|
|
EXPECT_LE(s.getAdjMin() - kEpsilon, s.getBoundingMin());
|
|
}
|
|
|
|
TEST(UniformMathTest, testLopsidedNegative) {
|
|
UniformParamsFromMinMaxSolver s(UniformStorageParams::getQuint8(), -72.0,
|
|
-4.0);
|
|
ASSERT_TRUE(s.compute());
|
|
|
|
llvm::errs() << "testLopsidedNegative Results: " << s << "\n";
|
|
|
|
EXPECT_EQ(255, s.getZp());
|
|
EXPECT_EQ(0.0, s.dequantize(s.getZp())); // Exact.
|
|
EXPECT_EQ(255, s.quantize(0.0));
|
|
EXPECT_GE(s.getAdjMax() + kEpsilon, s.getBoundingMax());
|
|
EXPECT_LE(s.getAdjMin() - kEpsilon, s.getBoundingMin());
|
|
}
|
|
|
|
TEST(UniformMathTest, testLargeRange) {
|
|
UniformParamsFromMinMaxSolver s(UniformStorageParams::getQuint8(), -123.23389,
|
|
231.1289);
|
|
ASSERT_TRUE(s.compute());
|
|
|
|
llvm::errs() << "testLargeRange Results: " << s << "\n";
|
|
|
|
// EXPECT_EQ(255, s.getZp());
|
|
EXPECT_EQ(0.0, s.dequantize(s.getZp())); // Exact.
|
|
EXPECT_EQ(s.getZp(), s.quantize(0.0));
|
|
EXPECT_GE(s.getAdjMax() + kEpsilon, s.getBoundingMax());
|
|
EXPECT_LE(s.getAdjMin() - kEpsilon, s.getBoundingMin());
|
|
}
|
|
|
|
TEST(UniformMathTest, test16BitLargeRange) {
|
|
UniformParamsFromMinMaxSolver s(UniformStorageParams::getQuint16(),
|
|
-123.23389, 231.1289);
|
|
ASSERT_TRUE(s.compute());
|
|
|
|
llvm::errs() << "test16BitLargeRange Results: " << s << "\n";
|
|
|
|
EXPECT_EQ(0.0, s.dequantize(s.getZp())); // Exact.
|
|
EXPECT_EQ(s.getZp(), s.quantize(0.0));
|
|
EXPECT_GE(s.getAdjMax() + kEpsilon, s.getBoundingMax());
|
|
EXPECT_LE(s.getAdjMin() - kEpsilon, s.getBoundingMin());
|
|
}
|
|
|
|
TEST(UniformMathTest, testQuint8SymmetricRight) {
|
|
UniformParamsFromMinMaxSolver s(
|
|
UniformStorageParams::getQuint8SymmetricRight(), -123.23389, 231.1289);
|
|
ASSERT_TRUE(s.compute());
|
|
|
|
llvm::errs() << "testQuint8SymmetricRight Results: " << s << "\n";
|
|
|
|
EXPECT_EQ(0.0, s.dequantize(s.getZp())); // Exact.
|
|
EXPECT_EQ(s.getZp(), s.quantize(0.0));
|
|
EXPECT_GE(s.getAdjMax() + kEpsilon, s.getBoundingMax());
|
|
EXPECT_LE(s.getAdjMin() - kEpsilon, s.getBoundingMin());
|
|
}
|
|
|
|
TEST(UniformMathTest, testQuint4) {
|
|
UniformParamsFromMinMaxSolver s({15, 0}, -1.0, 1.0);
|
|
ASSERT_TRUE(s.compute());
|
|
|
|
llvm::errs() << "testQuint4 Results: " << s << "\n";
|
|
|
|
EXPECT_EQ(0.0, s.dequantize(s.getZp())); // Exact.
|
|
EXPECT_EQ(s.getZp(), s.quantize(0.0));
|
|
EXPECT_GE(s.getAdjMax() + kEpsilon, s.getBoundingMax());
|
|
EXPECT_LE(s.getAdjMin() - kEpsilon, s.getBoundingMin());
|
|
}
|
|
|
|
TEST(UniformMathTest, testNan) {
|
|
UniformParamsFromMinMaxSolver s({0, 0}, -1.0, 1.0);
|
|
ASSERT_FALSE(s.compute());
|
|
}
|
|
|
|
TEST(UniformMathTest, testBadBounds) {
|
|
UniformParamsFromMinMaxSolver s(UniformStorageParams::getQuint16(), 123.23389,
|
|
-231.1289);
|
|
ASSERT_FALSE(s.compute());
|
|
}
|
|
|
|
TEST(UniformMathTest, testZeroBounds) {
|
|
UniformParamsFromMinMaxSolver s(UniformStorageParams::getQuint16(), 0, 0);
|
|
ASSERT_FALSE(s.compute());
|
|
}
|
|
|
|
} // end namespace
|