From a0ae31f0d475e5aa7e5d5c853fcbc56e229a6f90 Mon Sep 17 00:00:00 2001 From: Tyler Veness Date: Sun, 29 Dec 2024 11:57:28 -0800 Subject: [PATCH] Remove operator^ from Matrix and SubgraphPreconditioner Eigen recently added an operator^ for coefficient-wise bitwise xor, which conflicts with gtsam's operator^. Since gtsam's operator^ isn't xor, I opted to remove it. Fixes #1951. --- gtsam/base/Matrix.cpp | 11 ----------- gtsam/base/Matrix.h | 6 ------ gtsam/linear/SubgraphPreconditioner.cpp | 14 -------------- gtsam/linear/SubgraphPreconditioner.h | 3 --- gtsam/linear/iterative.h | 7 +------ 5 files changed, 1 insertion(+), 40 deletions(-) diff --git a/gtsam/base/Matrix.cpp b/gtsam/base/Matrix.cpp index 1e04bc58a..6248ad77d 100644 --- a/gtsam/base/Matrix.cpp +++ b/gtsam/base/Matrix.cpp @@ -126,17 +126,6 @@ bool linear_dependent(const Matrix& A, const Matrix& B, double tol) { } /* ************************************************************************* */ -Vector operator^(const Matrix& A, const Vector & v) { - if (A.rows()!=v.size()) { - throw std::invalid_argument("Matrix operator^ : A.m(" + std::to_string(A.rows()) + ")!=v.size(" + - std::to_string(v.size()) + ")"); - } -// Vector vt = v.transpose(); -// Vector vtA = vt * A; -// return vtA.transpose(); - return A.transpose() * v; -} - const Eigen::IOFormat& matlabFormat() { static const Eigen::IOFormat matlab( Eigen::StreamPrecision, // precision diff --git a/gtsam/base/Matrix.h b/gtsam/base/Matrix.h index c8dc46ed5..2b177e3d7 100644 --- a/gtsam/base/Matrix.h +++ b/gtsam/base/Matrix.h @@ -132,12 +132,6 @@ GTSAM_EXPORT bool linear_independent(const Matrix& A, const Matrix& B, double to */ GTSAM_EXPORT bool linear_dependent(const Matrix& A, const Matrix& B, double tol = 1e-9); -/** - * overload ^ for trans(A)*v - * We transpose the vectors for speed. - */ -GTSAM_EXPORT Vector operator^(const Matrix& A, const Vector & v); - /** products using old-style format to improve compatibility */ template inline MATRIX prod(const MATRIX& A, const MATRIX&B) { diff --git a/gtsam/linear/SubgraphPreconditioner.cpp b/gtsam/linear/SubgraphPreconditioner.cpp index 53ea94d6e..9087b3c90 100644 --- a/gtsam/linear/SubgraphPreconditioner.cpp +++ b/gtsam/linear/SubgraphPreconditioner.cpp @@ -149,20 +149,6 @@ void SubgraphPreconditioner::multiplyInPlace(const VectorValues& y, Errors& e) c Ab2_.multiplyInPlace(x, ei); // use iterator version } -/* ************************************************************************* */ -// Apply operator A', A'*e = [I inv(R1')*A2']*e = e1 + inv(R1')*A2'*e2 -VectorValues SubgraphPreconditioner::operator^(const Errors& e) const { - - Errors::const_iterator it = e.begin(); - VectorValues y = zero(); - for(auto& key_value: y) { - key_value.second = *it; - ++it; - } - transposeMultiplyAdd2(1.0, it, e.end(), y); - return y; -} - /* ************************************************************************* */ // y += alpha*A'*e void SubgraphPreconditioner::transposeMultiplyAdd diff --git a/gtsam/linear/SubgraphPreconditioner.h b/gtsam/linear/SubgraphPreconditioner.h index 558a80bd8..9e005dd53 100644 --- a/gtsam/linear/SubgraphPreconditioner.h +++ b/gtsam/linear/SubgraphPreconditioner.h @@ -125,9 +125,6 @@ namespace gtsam { /** Apply operator A in place: needs e allocated already */ void multiplyInPlace(const VectorValues& y, Errors& e) const; - /** Apply operator A' */ - VectorValues operator^(const Errors& e) const; - /** * Add A'*e to y * y += alpha*A'*[e1;e2] = [alpha*e1; alpha*inv(R1')*A2'*e2] diff --git a/gtsam/linear/iterative.h b/gtsam/linear/iterative.h index 22f65b8de..ff3d73801 100644 --- a/gtsam/linear/iterative.h +++ b/gtsam/linear/iterative.h @@ -59,11 +59,6 @@ namespace gtsam { /** Access b vector */ const Vector& b() const { return b_; } - /** Apply operator A'*e */ - Vector operator^(const Vector& e) const { - return A_ ^ e; - } - /** * Print with optional string */ @@ -71,7 +66,7 @@ namespace gtsam { /** gradient of objective function 0.5*|Ax-b_|^2 at x = A_'*(Ax-b_) */ Vector gradient(const Vector& x) const { - return A() ^ (A() * x - b()); + return A().transpose() * (A() * x - b()); } /** Apply operator A */