diff --git a/src/lib/matrix/matrix/Dual.hpp b/src/lib/matrix/matrix/Dual.hpp index 26641e0f51..fad1581623 100644 --- a/src/lib/matrix/matrix/Dual.hpp +++ b/src/lib/matrix/matrix/Dual.hpp @@ -92,6 +92,16 @@ struct Dual { return (*this = *this / a); } + bool operator==(const Dual &other) const + { + return isEqualF(value, other.value) && (derivative == other.derivative); + } + + bool operator!=(const Dual &other) const + { + const Dual &self = *this; + return !(self == other); + } }; // operators @@ -359,23 +369,12 @@ Matrix collectReals(const Matrix, M, N> &input) return r; } -#if defined(SUPPORT_STDIOSTREAM) -template -std::ostream &operator<<(std::ostream &os, - const matrix::Dual &dual) +template +OStream &operator<<(OStream &os, const matrix::Dual &dual) { - os << "["; - os << std::setw(10) << dual.value << ";"; - - for (size_t j = 0; j < N; ++j) { - os << "\t"; - os << std::setw(10) << static_cast(dual.derivative(j)); - } - - os << "]"; + os << "\nValue: " << dual.value << "\nDerivative:" << dual.derivative; return os; } -#endif // defined(SUPPORT_STDIOSTREAM) } diff --git a/src/lib/matrix/matrix/Matrix.hpp b/src/lib/matrix/matrix/Matrix.hpp index 5b76bb861f..a5694a7515 100644 --- a/src/lib/matrix/matrix/Matrix.hpp +++ b/src/lib/matrix/matrix/Matrix.hpp @@ -12,11 +12,6 @@ #include #include -#if defined(SUPPORT_STDIOSTREAM) -#include -#include -#endif // defined(SUPPORT_STDIOSTREAM) - #include "math.hpp" namespace matrix @@ -816,24 +811,18 @@ Matrix constrain(const Matrix &x, return m; } -#if defined(SUPPORT_STDIOSTREAM) -template -std::ostream &operator<<(std::ostream &os, - const matrix::Matrix &matrix) +template +OStream &operator<<(OStream &os, const matrix::Matrix &matrix) { - for (size_t i = 0; i < M; ++i) { - os << "["; - - for (size_t j = 0; j < N; ++j) { - os << std::setw(10) << matrix(i, j); - os << "\t"; - } - - os << "]" << std::endl; - } + os << "\n"; + // element: tab, point, 8 digits, 4 scientific notation chars; row: newline; string: \0 end + static const size_t n = 15 * N * M + M + 1; + char *buf = new char[n]; + matrix.write_string(buf, n); + os << buf; + delete[] buf; return os; } -#endif // defined(SUPPORT_STDIOSTREAM) } // namespace matrix diff --git a/src/lib/matrix/matrix/Vector.hpp b/src/lib/matrix/matrix/Vector.hpp index 892be7ce0b..1d1500ad9d 100644 --- a/src/lib/matrix/matrix/Vector.hpp +++ b/src/lib/matrix/matrix/Vector.hpp @@ -148,6 +148,25 @@ public: return r; } + + void print() const + { + (*this).transpose().print(); + } }; +template +OStream &operator<<(OStream &os, const matrix::Vector &vector) +{ + os << "\n"; + // element: tab, point, 8 digits, 4 scientific notation chars; row: newline; string: \0 end + static const size_t n = 15 * M * 1 + 1 + 1; + char *buf = new char[n]; + vector.transpose().write_string(buf, n); + os << buf; + delete[] buf; + + return os; +} + } // namespace matrix diff --git a/src/lib/matrix/test/MatrixDualTest.cpp b/src/lib/matrix/test/MatrixDualTest.cpp index 6a34a97c8c..d3b404899e 100644 --- a/src/lib/matrix/test/MatrixDualTest.cpp +++ b/src/lib/matrix/test/MatrixDualTest.cpp @@ -39,12 +39,6 @@ using namespace matrix; -template -bool isEqualAll(Dual a, Dual b) -{ - return isEqualF(a.value, b.value) && a.derivative == b.derivative; -} - template T testFunction(const Vector &point) { @@ -83,9 +77,9 @@ TEST(MatrixDualTest, Dual) EXPECT_FLOAT_EQ(c.derivative(0), 2.f); Dual d = +a; - EXPECT_TRUE(isEqualAll(d, a)); + EXPECT_EQ(d, a); d += b; - EXPECT_TRUE(isEqualAll(d, c)); + EXPECT_EQ(d, c); Dual e = a; e += b.value; @@ -93,7 +87,7 @@ TEST(MatrixDualTest, Dual) EXPECT_EQ(e.derivative, a.derivative); Dual f = b.value + a; - EXPECT_TRUE(isEqualAll(f, e)); + EXPECT_EQ(f, e); } { @@ -103,9 +97,9 @@ TEST(MatrixDualTest, Dual) EXPECT_FLOAT_EQ(c.derivative(0), 0.f); Dual d = b; - EXPECT_TRUE(isEqualAll(d, b)); + EXPECT_EQ(d, b); d -= a; - EXPECT_TRUE(isEqualAll(d, c)); + EXPECT_EQ(d, c); Dual e = b; e -= a.value; @@ -113,7 +107,7 @@ TEST(MatrixDualTest, Dual) EXPECT_EQ(e.derivative, b.derivative); Dual f = a.value - b; - EXPECT_TRUE(isEqualAll(f, -e)); + EXPECT_EQ(f, -e); } { @@ -123,9 +117,9 @@ TEST(MatrixDualTest, Dual) EXPECT_FLOAT_EQ(c.derivative(0), 9.f); Dual d = a; - EXPECT_TRUE(isEqualAll(d, a)); + EXPECT_EQ(d, a); d *= b; - EXPECT_TRUE(isEqualAll(d, c)); + EXPECT_EQ(d, c); Dual e = a; e *= b.value; @@ -133,7 +127,7 @@ TEST(MatrixDualTest, Dual) EXPECT_EQ(e.derivative, a.derivative * b.value); Dual f = b.value * a; - EXPECT_TRUE(isEqualAll(f, e)); + EXPECT_EQ(f, e); } { @@ -143,9 +137,9 @@ TEST(MatrixDualTest, Dual) EXPECT_FLOAT_EQ(c.derivative(0), -1.f / 3.f); Dual d = b; - EXPECT_TRUE(isEqualAll(d, b)); + EXPECT_EQ(d, b); d /= a; - EXPECT_TRUE(isEqualAll(d, c)); + EXPECT_EQ(d, c); Dual e = b; e /= a.value; @@ -153,7 +147,7 @@ TEST(MatrixDualTest, Dual) EXPECT_EQ(e.derivative, b.derivative / a.value); Dual f = a.value / b; - EXPECT_TRUE(isEqualAll(f, 1.f / e)); + EXPECT_EQ(f, 1.f / e); } { @@ -170,9 +164,9 @@ TEST(MatrixDualTest, Dual) { // abs - EXPECT_TRUE(isEqualAll(a, abs(-a))); - EXPECT_FALSE(isEqualAll(-a, abs(a))); - EXPECT_TRUE(isEqualAll(-a, -abs(a))); + EXPECT_EQ(a, abs(-a)); + EXPECT_NE(-a, abs(a)); + EXPECT_EQ(-a, -abs(a)); } { @@ -197,8 +191,8 @@ TEST(MatrixDualTest, Dual) { // max/min - EXPECT_TRUE(isEqualAll(b, max(a, b))); - EXPECT_TRUE(isEqualAll(a, min(a, b))); + EXPECT_EQ(b, max(a, b)); + EXPECT_EQ(a, min(a, b)); } { @@ -248,7 +242,7 @@ TEST(MatrixDualTest, Dual) { // atan2 EXPECT_FLOAT_EQ(atan2(a, b).value, atan2(a.value, b.value)); - EXPECT_TRUE(isEqualAll(atan2(a, Dual(b.value)), atan(a / b.value))); // atan2'(y, x) = atan'(y/x) + EXPECT_EQ(atan2(a, Dual(b.value)), atan(a / b.value)); // atan2'(y, x) = atan'(y/x) } {