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
