[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [23512] trunk/blender/intern/itasc: Speed optimization in itasc when with armature with many bones and few targets .

Benoit Bolsee benoit.bolsee at online.be
Sun Sep 27 18:20:42 CEST 2009


Revision: 23512
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=23512
Author:   ben2610
Date:     2009-09-27 18:20:42 +0200 (Sun, 27 Sep 2009)

Log Message:
-----------
Speed optimization in itasc when with armature with many bones and few targets. Thanks to Brecht who pointed out a simple but efficient optimization in SVD decomposition.

Modified Paths:
--------------
    trunk/blender/intern/itasc/WDLSSolver.cpp
    trunk/blender/intern/itasc/WDLSSolver.hpp
    trunk/blender/intern/itasc/WSDLSSolver.cpp
    trunk/blender/intern/itasc/WSDLSSolver.hpp

Modified: trunk/blender/intern/itasc/WDLSSolver.cpp
===================================================================
--- trunk/blender/intern/itasc/WDLSSolver.cpp	2009-09-27 14:04:46 UTC (rev 23511)
+++ trunk/blender/intern/itasc/WDLSSolver.cpp	2009-09-27 16:20:42 UTC (rev 23512)
@@ -24,12 +24,22 @@
 	m_ns = std::min(nc,nq);
     m_AWq = e_zero_matrix(nc,nq);
     m_WyAWq = e_zero_matrix(nc,nq);
-    m_U = e_zero_matrix(nc,nq);
+    m_WyAWqt = e_zero_matrix(nq,nc);
 	m_S = e_zero_vector(std::max(nc,nq));
-    m_temp = e_zero_vector(nq);
-    m_V = e_zero_matrix(nq,nq);
-    m_WqV = e_zero_matrix(nq,nq);
 	m_Wy_ydot = e_zero_vector(nc);
+	if (nq > nc) {
+		m_transpose = true;
+	    m_temp = e_zero_vector(nc);
+	    m_U = e_zero_matrix(nc,nc);
+		m_V = e_zero_matrix(nq,nc);
+	    m_WqV = e_zero_matrix(nq,nc);
+	} else {
+		m_transpose = false;
+	    m_temp = e_zero_vector(nq);
+	    m_U = e_zero_matrix(nc,nq);
+		m_V = e_zero_matrix(nq,nq);
+	    m_WqV = e_zero_matrix(nq,nq);
+	}
     return true;
 }
 
@@ -42,7 +52,13 @@
 		m_WyAWq.row(i) = Wy(i)*m_AWq.row(i);
 
     // Compute the SVD of the weighted jacobian
-	int ret = KDL::svd_eigen_HH(m_WyAWq,m_U,m_S,m_V,m_temp);
+	int ret;
+	if (m_transpose) {
+		m_WyAWqt = m_WyAWq.transpose();
+		ret = KDL::svd_eigen_HH(m_WyAWqt,m_V,m_S,m_U,m_temp);
+	} else {
+		ret = KDL::svd_eigen_HH(m_WyAWq,m_U,m_S,m_V,m_temp);
+	}
     if(ret<0)
         return false;
 

Modified: trunk/blender/intern/itasc/WDLSSolver.hpp
===================================================================
--- trunk/blender/intern/itasc/WDLSSolver.hpp	2009-09-27 14:04:46 UTC (rev 23511)
+++ trunk/blender/intern/itasc/WDLSSolver.hpp	2009-09-27 16:20:42 UTC (rev 23512)
@@ -14,12 +14,13 @@
 
 class WDLSSolver: public iTaSC::Solver {
 private:
-    e_matrix m_AWq,m_WyAWq,m_U,m_V,m_WqV;
+    e_matrix m_AWq,m_WyAWq,m_WyAWqt,m_U,m_V,m_WqV;
     e_vector m_S,m_temp,m_Wy_ydot;
     double m_lambda;
     double m_epsilon;
 	double m_qmax;
 	int m_ns;
+	bool m_transpose;
 public:
     WDLSSolver();
     virtual ~WDLSSolver();

Modified: trunk/blender/intern/itasc/WSDLSSolver.cpp
===================================================================
--- trunk/blender/intern/itasc/WSDLSSolver.cpp	2009-09-27 14:04:46 UTC (rev 23511)
+++ trunk/blender/intern/itasc/WSDLSSolver.cpp	2009-09-27 16:20:42 UTC (rev 23512)
@@ -31,13 +31,23 @@
 	m_ns = std::min(m_nc,m_nq);
     m_AWq = e_zero_matrix(m_nc,m_nq);
     m_WyAWq = e_zero_matrix(m_nc,m_nq);
-    m_U = e_zero_matrix(m_nc,m_nq);
+    m_WyAWqt = e_zero_matrix(m_nq,m_nc);
 	m_S = e_zero_vector(std::max(m_nc,m_nq));
-    m_temp = e_zero_vector(m_nq);
-    m_V = e_zero_matrix(m_nq,m_nq);
-    m_WqV = e_zero_matrix(m_nq,m_nq);
 	m_Wy_ydot = e_zero_vector(m_nc);
 	m_ytask = gc;
+	if (m_nq > m_nc) {
+		m_transpose = true;
+	    m_temp = e_zero_vector(m_nc);
+	    m_U = e_zero_matrix(m_nc,m_nc);
+		m_V = e_zero_matrix(m_nq,m_nc);
+	    m_WqV = e_zero_matrix(m_nq,m_nc);
+	} else {
+		m_transpose = false;
+	    m_temp = e_zero_vector(m_nq);
+	    m_U = e_zero_matrix(m_nc,m_nq);
+		m_V = e_zero_matrix(m_nq,m_nq);
+	    m_WqV = e_zero_matrix(m_nq,m_nq);
+	}
     return true;
 }
 
@@ -52,7 +62,13 @@
 		m_WyAWq.row(i) = Wy(i)*m_AWq.row(i);
 
     // Compute the SVD of the weighted jacobian
-	int ret = KDL::svd_eigen_HH(m_WyAWq,m_U,m_S,m_V,m_temp);
+	int ret;
+	if (m_transpose) {
+		m_WyAWqt = m_WyAWq.transpose();
+		ret = KDL::svd_eigen_HH(m_WyAWqt,m_V,m_S,m_U,m_temp);
+	} else {
+		ret = KDL::svd_eigen_HH(m_WyAWq,m_U,m_S,m_V,m_temp);
+	}
     if(ret<0)
         return false;
 

Modified: trunk/blender/intern/itasc/WSDLSSolver.hpp
===================================================================
--- trunk/blender/intern/itasc/WSDLSSolver.hpp	2009-09-27 14:04:46 UTC (rev 23511)
+++ trunk/blender/intern/itasc/WSDLSSolver.hpp	2009-09-27 16:20:42 UTC (rev 23512)
@@ -14,11 +14,12 @@
 
 class WSDLSSolver: public iTaSC::Solver {
 private:
-    e_matrix m_AWq,m_WyAWq,m_U,m_V,m_WqV;
+    e_matrix m_AWq,m_WyAWq,m_WyAWqt,m_U,m_V,m_WqV;
     e_vector m_S,m_temp,m_Wy_ydot;
 	std::vector<bool> m_ytask;
 	e_scalar m_qmax;
 	unsigned int m_ns, m_nc, m_nq;
+	bool m_transpose;
 public:
     WSDLSSolver();
     virtual ~WSDLSSolver();





More information about the Bf-blender-cvs mailing list