Expression and ExpressionGraph comparison

 - Add operator== for comparing Expressions and ExpressionGraphs.
 - Remove the broken Jet-test for now. (Will be added again later)

Change-Id: I3ee1599e8a0b50fa61c16f30812c78db7333f273
diff --git a/include/ceres/internal/expression.h b/include/ceres/internal/expression.h
index b9e2e39..ce470b2 100644
--- a/include/ceres/internal/expression.h
+++ b/include/ceres/internal/expression.h
@@ -306,6 +306,23 @@
   // Returns true if this expression has a valid lhs.
   bool HasValidLhs() const { return lhs_id_ != kInvalidExpressionId; }
 
+  // Compares all members with the == operator. If this function succeeds,
+  // IsSemanticallyEquivalentTo will also return true.
+  bool operator==(const Expression& other) const;
+
+  // Semantically equivalent expressions are similar in a way, that the type(),
+  // value(), name(), number of arguments is identical. The lhs_id() and the
+  // argument_ids can differ. For example, the following groups of expressions
+  // are semantically equivalent:
+  //
+  // v_0 = v_1 + v_2;
+  // v_0 = v_1 + v_3;
+  // v_1 = v_1 + v_2;
+  //
+  // v_0 = sin(v_1);
+  // v_3 = sin(v_2);
+  bool IsSemanticallyEquivalentTo(const Expression& other) const;
+
   ExpressionType type() const { return type_; }
   ExpressionId lhs_id() const { return lhs_id_; }
   double value() const { return value_; }
diff --git a/include/ceres/internal/expression_graph.h b/include/ceres/internal/expression_graph.h
index 308528f..0250d19 100644
--- a/include/ceres/internal/expression_graph.h
+++ b/include/ceres/internal/expression_graph.h
@@ -72,6 +72,8 @@
   // -> B is a descendant of A
   bool DependsOn(ExpressionId A, ExpressionId B) const;
 
+  bool operator==(const ExpressionGraph& other) const;
+
   Expression& ExpressionForId(ExpressionId id) { return expressions_[id]; }
   const Expression& ExpressionForId(ExpressionId id) const {
     return expressions_[id];
diff --git a/internal/ceres/expression.cc b/internal/ceres/expression.cc
index b3f9106..54450b8 100644
--- a/internal/ceres/expression.cc
+++ b/internal/ceres/expression.cc
@@ -173,5 +173,17 @@
   arguments_.clear();
 }
 
+bool Expression::operator==(const Expression& other) const {
+  return type() == other.type() && name() == other.name() &&
+         value() == other.value() && lhs_id() == other.lhs_id() &&
+         arguments() == other.arguments();
+}
+
+bool Expression::IsSemanticallyEquivalentTo(const Expression& other) const {
+  return type() == other.type() && name() == other.name() &&
+         value() == other.value() &&
+         arguments().size() == other.arguments().size();
+}
+
 }  // namespace internal
 }  // namespace ceres
diff --git a/internal/ceres/expression_graph.cc b/internal/ceres/expression_graph.cc
index 5c2b84e..b7e7888 100644
--- a/internal/ceres/expression_graph.cc
+++ b/internal/ceres/expression_graph.cc
@@ -95,5 +95,18 @@
   }
   return false;
 }
+
+bool ExpressionGraph::operator==(const ExpressionGraph& other) const {
+  if (Size() != other.Size()) {
+    return false;
+  }
+  for (ExpressionId id = 0; id < Size(); ++id) {
+    if (!(ExpressionForId(id) == other.ExpressionForId(id))) {
+      return false;
+    }
+  }
+  return true;
+}
+
 }  // namespace internal
 }  // namespace ceres
diff --git a/internal/ceres/expression_test.cc b/internal/ceres/expression_test.cc
index a8a8213..c21ae31 100644
--- a/internal/ceres/expression_test.cc
+++ b/internal/ceres/expression_test.cc
@@ -113,52 +113,5 @@
   ASSERT_TRUE(graph.ExpressionForId(d.id).DirectlyDependsOn(c.id));
 }
 
-TEST(Expression, Jet) {
-  using T = Jet<ExpressionRef, 1>;
-
-  StartRecordingExpressions();
-
-  T a(2, 0);
-  T b = a * a;
-
-  auto graph = StopRecordingExpressions();
-
-  // b is valid during the assignment so we expect an
-  // additional assignment expression.
-  EXPECT_EQ(graph.Size(), 8);
-
-  // Expected code
-  //   v_0 = 2;
-  //   v_1 = 0;
-  //   v_2 = 1;
-  //   v_1 = v_2;
-  //   v_3 = v_0 * v_0;
-  //   v_4 = v_0 * v_1;
-  //   v_5 = v_1 * v_0;
-  //   v_6 = v_3 * v_4;
-  //   v_7 = v_5 * v_6;
-
-  // clang-format off
-  // Id, Type, Lhs, Value, Name, Arguments
-  CHECK_EXPRESSION(  0,  COMPILE_TIME_CONSTANT,   0,   2,   "",     );
-  CHECK_EXPRESSION(  1,  COMPILE_TIME_CONSTANT,   1,   0,   "",     );
-  CHECK_EXPRESSION(  2,  COMPILE_TIME_CONSTANT,   2,   1,   "",     );
-  CHECK_EXPRESSION(  3,             ASSIGNMENT,   1,   0,   "", 2   );
-  CHECK_EXPRESSION(  4,      BINARY_ARITHMETIC,   4,   0,  "*", 0, 0);
-  CHECK_EXPRESSION(  5,      BINARY_ARITHMETIC,   5,   0,  "*", 0, 1);
-  CHECK_EXPRESSION(  6,      BINARY_ARITHMETIC,   6,   0,  "*", 1, 0);
-  CHECK_EXPRESSION(  7,      BINARY_ARITHMETIC,   7,   0,  "+", 5, 6);
-  // clang-format on
-
-  // Variables after execution:
-  //
-  // b.a         <=> v_4
-  // b.v[0]      <=> v_7
-  EXPECT_EQ(b.a.id, 4);
-  EXPECT_EQ(b.v[0].id, 7);
-}
-
-// Todo: remaining functions of Expression
-
 }  // namespace internal
 }  // namespace ceres