Browse Source

Alecjacobson/fix mqwf ldlt (#2239)

* enable ldlt

* mqwf test
Alec Jacobson 2 years ago
parent
commit
e2a345a43d
2 changed files with 35 additions and 5 deletions
  1. 5 5
      include/igl/min_quad_with_fixed.impl.h
  2. 30 0
      tests/include/igl/min_quad_with_fixed.cpp

+ 5 - 5
include/igl/min_quad_with_fixed.impl.h

@@ -235,17 +235,17 @@ IGL_INLINE bool igl::min_quad_with_fixed_precompute(
     }else
     {
 #ifdef MIN_QUAD_WITH_FIXED_CPP_DEBUG
-    cout<<"    ldlt"<<endl;
+        cout<<"    ldlt/lu"<<endl;
 #endif
       // Either not PD or there are equality constraints
       SparseMatrix<T> NA;
       slice(new_A,data.unknown_lagrange,data.unknown_lagrange,NA);
       data.NA = NA;
-      // Ideally we'd use LDLT but Eigen doesn't support positive semi-definite
-      // matrices:
-      // http://forum.kde.org/viewtopic.php?f=74&t=106962&p=291990#p291990
-      if(data.Auu_sym && false)
+      if(data.Auu_pd)
       {
+#ifdef MIN_QUAD_WITH_FIXED_CPP_DEBUG
+        cout<<"    ldlt"<<endl;
+#endif
         data.ldlt.compute(NA);
         switch(data.ldlt.info())
         {

+ 30 - 0
tests/include/igl/min_quad_with_fixed.cpp

@@ -16,3 +16,33 @@ TEST_CASE("min_quad_with_fixed: dense", "[igl]" )
   REQUIRE(abs(x(1)- 1.5)<igl::EPS<double>());
   REQUIRE(abs(x(2)- -.5)<igl::EPS<double>());
 }
+
+TEST_CASE("min_quad_with_fixed: Aeq", "[igl]" )
+{
+  Eigen::MatrixXd Q(4,4);
+  Q<<
+    1,-1,0,0,
+    -1,2,-1,0,
+    0,-1,2,-1,
+    0,0,-1,1;
+  Eigen::VectorXd B = Eigen::VectorXd::Zero(4);
+  Eigen::MatrixXd Aeq(1,4);
+  Aeq<<-1,0,0,1;
+  Eigen::VectorXd beq(1);
+  beq<<3;
+  Eigen::VectorXi b(1);
+  b<<0;
+  Eigen::VectorXd bc(1);
+  bc<<0;
+
+  Eigen::VectorXd Z;
+  igl::min_quad_with_fixed(
+    Eigen::SparseMatrix<double>(Q.sparseView()),B,b,bc,
+    Eigen::SparseMatrix<double>(Aeq.sparseView()),beq,true,Z);
+
+  Eigen::VectorXd Zgt(4);
+  Zgt << 0,1,2,3;
+  const double epsilon = 1e-15;
+  test_common::assert_near(Z,Zgt,epsilon);
+
+}