Revert "Reduce copies involved in Jet operations"
This reverts commit c036c78196c7a9f36e48e6387691e8f4979aef5d.
Change-Id: I736f2141d041e7a2c21491a159b48c5565df2bfa
diff --git a/include/ceres/jet.h b/include/ceres/jet.h
index 99cff79..ac07b0a 100644
--- a/include/ceres/jet.h
+++ b/include/ceres/jet.h
@@ -203,50 +203,43 @@
// Compound operators
Jet<T, N>& operator+=(const Jet<T, N>& y) {
- this->a += y.a;
- this->v = this->v + y.v; // Better than +=
+ *this = *this + y;
return *this;
}
Jet<T, N>& operator-=(const Jet<T, N>& y) {
- this->a -= y.a;
- this->v = this->v - y.v; // Better than -=
+ *this = *this - y;
return *this;
}
Jet<T, N>& operator*=(const Jet<T, N>& y) {
- this->v = this->a * y.v + this->v * y.a;
- this->a *= y.a;
+ *this = *this * y;
return *this;
}
Jet<T, N>& operator/=(const Jet<T, N>& y) {
- const T y_a_inverse = T(1.0) / y.a;
- this->a *= y_a_inverse;
- this->v = (this->v - this->a * y.v) * y_a_inverse;
+ *this = *this / y;
return *this;
}
// Compound with scalar operators.
Jet<T, N>& operator+=(const T& s) {
- this->a += s;
+ *this = *this + s;
return *this;
}
Jet<T, N>& operator-=(const T& s) {
- this->a -= s;
+ *this = *this - s;
return *this;
}
Jet<T, N>& operator*=(const T& s) {
- this->a *= s;
- this->v = this->v * s; // Better than *=
+ *this = *this * s;
return *this;
}
Jet<T, N>& operator/=(const T& s) {
- const T s_inverse = T(1.0) / s;
- *this *= s_inverse;
+ *this = *this / s;
return *this;
}
@@ -266,10 +259,6 @@
inline Jet<T, N> const& operator+(const Jet<T, N>& f) {
return f;
}
-template <typename T, int N>
-inline Jet<T, N>&& operator+(Jet<T, N>&& f) {
- return std::move(f);
-}
// TODO(keir): Try adding __attribute__((always_inline)) to these functions to
// see if it causes a performance increase.
@@ -279,139 +268,60 @@
inline Jet<T, N> operator-(const Jet<T, N>& f) {
return Jet<T, N>(-f.a, -f.v);
}
-template <typename T, int N>
-inline Jet<T, N>&& operator-(Jet<T, N>&& f) {
- f.a = -f.a;
- f.v = -f.v;
- return std::move(f);
-}
// Binary +
template <typename T, int N>
inline Jet<T, N> operator+(const Jet<T, N>& f, const Jet<T, N>& g) {
return Jet<T, N>(f.a + g.a, f.v + g.v);
}
-template <typename T, int N>
-inline Jet<T, N>&& operator+(Jet<T, N>&& f, const Jet<T, N>& g) {
- f += g;
- return std::move(f);
-}
-template <typename T, int N>
-inline Jet<T, N>&& operator+(const Jet<T, N>& f, Jet<T, N>&& g) {
- g += f;
- return std::move(g);
-}
-template <typename T, int N>
-inline Jet<T, N>&& operator+(Jet<T, N>&& f, Jet<T, N>&& g) {
- return std::move(f) + g;
-}
// Binary + with a scalar: x + s
template <typename T, int N>
inline Jet<T, N> operator+(const Jet<T, N>& f, T s) {
return Jet<T, N>(f.a + s, f.v);
}
-template <typename T, int N>
-inline Jet<T, N>&& operator+(Jet<T, N>&& f, T s) {
- f.a += s;
- return std::move(f);
-}
// Binary + with a scalar: s + x
template <typename T, int N>
inline Jet<T, N> operator+(T s, const Jet<T, N>& f) {
return Jet<T, N>(f.a + s, f.v);
}
-template <typename T, int N>
-inline Jet<T, N>&& operator+(T s, Jet<T, N>&& f) {
- f.a += s;
- return std::move(f);
-}
// Binary -
template <typename T, int N>
inline Jet<T, N> operator-(const Jet<T, N>& f, const Jet<T, N>& g) {
return Jet<T, N>(f.a - g.a, f.v - g.v);
}
-template <typename T, int N>
-inline Jet<T, N>&& operator-(Jet<T, N>&& f, const Jet<T, N>& g) {
- f -= g;
- return std::move(f);
-}
-template <typename T, int N>
-inline Jet<T, N>&& operator-(const Jet<T, N>& f, Jet<T, N>&& g) {
- g -= f;
- return -std::move(g);
-}
-template <typename T, int N>
-inline Jet<T, N>&& operator-(Jet<T, N>&& f, Jet<T, N>&& g) {
- return std::move(f) - g;
-}
// Binary - with a scalar: x - s
template <typename T, int N>
inline Jet<T, N> operator-(const Jet<T, N>& f, T s) {
return Jet<T, N>(f.a - s, f.v);
}
-template <typename T, int N>
-inline Jet<T, N>&& operator-(Jet<T, N>&& f, T s) {
- f.a -= s;
- return std::move(f);
-}
// Binary - with a scalar: s - x
template <typename T, int N>
inline Jet<T, N> operator-(T s, const Jet<T, N>& f) {
return Jet<T, N>(s - f.a, -f.v);
}
-template <typename T, int N>
-inline Jet<T, N>&& operator-(T s, Jet<T, N>&& f) {
- f.a -= s;
- return -std::move(f);
-}
// Binary *
template <typename T, int N>
inline Jet<T, N> operator*(const Jet<T, N>& f, const Jet<T, N>& g) {
return Jet<T, N>(f.a * g.a, f.a * g.v + f.v * g.a);
}
-template <typename T, int N>
-inline Jet<T, N>&& operator*(Jet<T, N>&& f, const Jet<T, N>& g) {
- f *= g;
- return std::move(f);
-}
-template <typename T, int N>
-inline Jet<T, N>&& operator*(const Jet<T, N>& f, Jet<T, N>&& g) {
- g *= f;
- return std::move(g);
-}
-template <typename T, int N>
-inline Jet<T, N>&& operator*(Jet<T, N>&& f, Jet<T, N>&& g) {
- return std::move(f) * g;
-}
// Binary * with a scalar: x * s
template <typename T, int N>
inline Jet<T, N> operator*(const Jet<T, N>& f, T s) {
return Jet<T, N>(f.a * s, f.v * s);
}
-// Binary * with a scalar: x * s
-template <typename T, int N>
-inline Jet<T, N>&& operator*(Jet<T, N>&& f, T s) {
- f *= s;
- return std::move(f);
-}
// Binary * with a scalar: s * x
template <typename T, int N>
inline Jet<T, N> operator*(T s, const Jet<T, N>& f) {
return Jet<T, N>(f.a * s, f.v * s);
}
-template <typename T, int N>
-inline Jet<T, N>&& operator*(T s, Jet<T, N>&& f) {
- f *= s;
- return std::move(f);
-}
// Binary /
template <typename T, int N>
@@ -427,22 +337,6 @@
const T f_a_by_g_a = f.a * g_a_inverse;
return Jet<T, N>(f_a_by_g_a, (f.v - f_a_by_g_a * g.v) * g_a_inverse);
}
-template <typename T, int N>
-inline Jet<T, N>&& operator/(Jet<T, N>&& f, const Jet<T, N>& g) {
- f /= g;
- return std::move(f);
-}
-template <typename T, int N>
-inline Jet<T, N>&& operator/(const Jet<T, N>& f, Jet<T, N>&& g) {
- const T g_a_inverse = T(1.0) / g.a;
- g.a = f.a * g_a_inverse;
- g.v = (f.v - g.a * g.v) * g_a_inverse;
- return std::move(g);
-}
-template <typename T, int N>
-inline Jet<T, N>&& operator/(Jet<T, N>&& f, Jet<T, N>&& g) {
- return std::move(f) / g;
-}
// Binary / with a scalar: s / x
template <typename T, int N>
@@ -450,13 +344,6 @@
const T minus_s_g_a_inverse2 = -s / (g.a * g.a);
return Jet<T, N>(s / g.a, g.v * minus_s_g_a_inverse2);
}
-template <typename T, int N>
-inline Jet<T, N>&& operator/(T s, Jet<T, N>&& g) {
- const T minus_s_g_a_inverse2 = -s / (g.a * g.a);
- g.a = s / g.a;
- g.v = g.v * minus_s_g_a_inverse2; // Better than *=
- return std::move(g);
-}
// Binary / with a scalar: x / s
template <typename T, int N>
@@ -464,11 +351,6 @@
const T s_inverse = T(1.0) / s;
return Jet<T, N>(f.a * s_inverse, f.v * s_inverse);
}
-template <typename T, int N>
-inline Jet<T, N>&& operator/(Jet<T, N>&& f, T s) {
- f /= s;
- return std::move(f);
-}
// Binary comparison operators for both scalars and jets.
#define CERES_DEFINE_JET_COMPARISON_OPERATOR(op) \
diff --git a/internal/ceres/jet_test.cc b/internal/ceres/jet_test.cc
index 00a1227..6e98b86 100644
--- a/internal/ceres/jet_test.cc
+++ b/internal/ceres/jet_test.cc
@@ -442,13 +442,9 @@
J b = 1.0 + x;
J c = x;
c += 1.0;
- J d = J{x} + 1.0;
- J e = 1.0 + J{x};
ExpectJetsClose(a, b);
ExpectJetsClose(a, c);
- ExpectJetsClose(a, d);
- ExpectJetsClose(a, e);
}
{ // Check that 1 - x == -(x - 1).
@@ -456,13 +452,9 @@
J b = -(x - 1.0);
J c = x;
c -= 1.0;
- J d = -(J{x} - 1.0);
- J e = 1.0 - J{x};
ExpectJetsClose(a, b);
ExpectJetsClose(a, -c);
- ExpectJetsClose(a, d);
- ExpectJetsClose(a, e);
}
{ // Check that (x/s)*s == (x*s)/s.
@@ -472,29 +464,19 @@
c /= 5.0;
J d = x;
d *= 5.0;
- J e = J{x} / 5.0;
- J f = J{x} * 5.0;
- J g = 1.0 / (5.0 / J{x});
- J h = 5.0 * J{x};
ExpectJetsClose(5.0 * a, b / 5.0);
ExpectJetsClose(a, c);
ExpectJetsClose(b, d);
- ExpectJetsClose(5.0 * e, f / 5.0);
- ExpectJetsClose(5.0 * g, h / 5.0);
}
{ // Check that x / y == 1 / (y / x).
J a = x / y;
J b = 1.0 / (y / x);
- J c = J{x} / y;
- J d = x / J{y};
VL << "a = " << a;
VL << "b = " << b;
ExpectJetsClose(a, b);
- ExpectJetsClose(a, c);
- ExpectJetsClose(a, d);
}
{ // Check that abs(-x * x) == sqrt(x * x).