From 1451c7220aef54c76e7e16d84575d82d4dbf1c5c Mon Sep 17 00:00:00 2001
From: Justin Carpentier <justin.carpentier@inria.fr>
Date: Sun, 11 Feb 2024 08:19:03 +0100
Subject: [PATCH] module: extend is_approx for sparse matrices

---
 python/main.cpp | 46 ++++++++++++++++++++++++++++++++++------------
 1 file changed, 34 insertions(+), 12 deletions(-)

diff --git a/python/main.cpp b/python/main.cpp
index 4aa48a64..68b4dfab 100644
--- a/python/main.cpp
+++ b/python/main.cpp
@@ -1,6 +1,6 @@
 /*
  * Copyright 2014-2019, CNRS
- * Copyright 2018-2023, INRIA
+ * Copyright 2018-2024, INRIA
  */
 
 #include <boost/python/scope.hpp>
@@ -17,6 +17,37 @@
 
 using namespace eigenpy;
 
+template <typename Scalar>
+void exposeIsApprox() {
+  enum { Options = 0 };
+  EIGENPY_MAKE_TYPEDEFS(Scalar, Options, s, Eigen::Dynamic, X);
+  EIGENPY_UNUSED_TYPE(VectorXs);
+  EIGENPY_UNUSED_TYPE(RowVectorXs);
+  typedef Eigen::SparseMatrix<Scalar, Options> SparseMatrixXs;
+  typedef typename MatrixXs::RealScalar RealScalar;
+
+  using namespace Eigen;
+  const RealScalar dummy_precision =
+      Eigen::NumTraits<RealScalar>::dummy_precision();
+
+  bp::def("is_approx",
+          (bool (*)(const Eigen::MatrixBase<MatrixXs> &,
+                    const Eigen::MatrixBase<MatrixXs> &, const RealScalar &)) &
+              is_approx,
+          (bp::arg("A"), bp::arg("B"), bp::arg("prec") = dummy_precision),
+          "Returns True if A is approximately equal to B, within the "
+          "precision determined by prec.");
+
+  bp::def("is_approx",
+          (bool (*)(const Eigen::SparseMatrixBase<SparseMatrixXs> &,
+                    const Eigen::SparseMatrixBase<SparseMatrixXs> &,
+                    const RealScalar &)) &
+              is_approx,
+          (bp::arg("A"), bp::arg("B"), bp::arg("prec") = dummy_precision),
+          "Returns True if A is approximately equal to B, within the "
+          "precision determined by prec.");
+}
+
 BOOST_PYTHON_MODULE(eigenpy_pywrap) {
   enableEigenPy();
 
@@ -46,17 +77,8 @@ BOOST_PYTHON_MODULE(eigenpy_pywrap) {
     register_symbolic_link_to_registered_type<Eigen::ComputationInfo>();
   }
 
-  {
-    using namespace Eigen;
-
-    bp::def("is_approx",
-            (bool (*)(const Eigen::MatrixBase<MatrixXd> &,
-                      const Eigen::MatrixBase<MatrixXd> &, const double &)) &
-                is_approx<MatrixXd, MatrixXd>,
-            (bp::arg("A"), bp::arg("B"), bp::arg("prec") = 1e-12),
-            "Returns True if A is approximately equal to B, within the "
-            "precision determined by prec.");
-  }
+  exposeIsApprox<double>();
+  exposeIsApprox<std::complex<double> >();
 
   exposeDecompositions();
 }
-- 
GitLab