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();


_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to