Revision: 38878
          
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=38878
Author:   shuvro
Date:     2011-07-31 10:54:51 +0000 (Sun, 31 Jul 2011)
Log Message:
-----------
Code cleanup and restructure of eigen solver related classes.

Modified Paths:
--------------
    branches/soc-2011-avocado/blender/intern/autoseam/AutoseamAdjacency.cpp
    branches/soc-2011-avocado/blender/intern/autoseam/EigenSolver.cpp
    branches/soc-2011-avocado/blender/intern/autoseam/EigenSolver.h
    branches/soc-2011-avocado/blender/intern/autoseam/EigenSolverArpack.cpp
    branches/soc-2011-avocado/blender/intern/autoseam/EigenSolverArpack.h

Modified: 
branches/soc-2011-avocado/blender/intern/autoseam/AutoseamAdjacency.cpp
===================================================================
--- branches/soc-2011-avocado/blender/intern/autoseam/AutoseamAdjacency.cpp     
2011-07-31 07:58:50 UTC (rev 38877)
+++ branches/soc-2011-avocado/blender/intern/autoseam/AutoseamAdjacency.cpp     
2011-07-31 10:54:51 UTC (rev 38878)
@@ -143,7 +143,7 @@
                }
        }
        
-       eigen_vectors = solver.calculate_eigen_space();
+       eigen_vectors = solver.solve();
        
        if(a.rows() && a.cols() && eigen_vectors != NULL){
                
@@ -154,23 +154,25 @@
                MatrixXd aminus;
        
 
-               while ( (f < solver.num_eigen_vectors)) {
+               while ((f < solver.num_eigenvalues())) {
                        
-                       if(fabs(solver.eigen_values[f]) > THRESHOLD_ZERO){
+                       if(fabs(solver.eigenvalue(f)) > THRESHOLD_ZERO){
                                
                                int loop;
                                //now construct a vector with the values
+                               std::vector<double> eig_vector = 
solver.eigenvector(f);
                                Eigen::VectorXd eigen_vector = 
Eigen::VectorXd(matrix_dimension);
                                
                                for(loop = 0; loop < matrix_dimension; loop++){
-                                       // This hardcoded value will be removed 
later
-                                       eigen_vector(loop) = *(eigen_vectors + 
f*matrix_dimension + loop);
+                                       
+                                       //eigen_vector(loop) = *(eigen_vectors 
+ f*matrix_dimension + loop);
+                                       eigen_vector(loop) = eig_vector[loop];
                                }
                                
                                
                                //AutoseamEigenspace* aes = new 
AutoseamEigenspace(evalues[n-f-1], es.eigenvectors().col(n-f-1));
                                //AutoseamEigenspace* aes = new 
AutoseamEigenspace(eigen_values[f], eigen_vector);
-                               AutoseamEigenspace* aes = new 
AutoseamEigenspace(solver.eigen_values[f], eigen_vector);
+                               AutoseamEigenspace* aes = new 
AutoseamEigenspace(solver.eigenvalue(f), eigen_vector);
                                // split Eigenspace into two subspaces F+ and 
F- where the ith entry in the eigenvector is positive/negative
                                aes->split();
                                aes->fill_adjacency(a, aplus, aminus);

Modified: branches/soc-2011-avocado/blender/intern/autoseam/EigenSolver.cpp
===================================================================
--- branches/soc-2011-avocado/blender/intern/autoseam/EigenSolver.cpp   
2011-07-31 07:58:50 UTC (rev 38877)
+++ branches/soc-2011-avocado/blender/intern/autoseam/EigenSolver.cpp   
2011-07-31 10:54:51 UTC (rev 38878)
@@ -37,6 +37,10 @@
        
 }
 
+int EigenSolver::num_eigenvalues()
+{
+       return num_eigen_vectors;
+}
 EigenSolver::~EigenSolver()
 {
 }

Modified: branches/soc-2011-avocado/blender/intern/autoseam/EigenSolver.h
===================================================================
--- branches/soc-2011-avocado/blender/intern/autoseam/EigenSolver.h     
2011-07-31 07:58:50 UTC (rev 38877)
+++ branches/soc-2011-avocado/blender/intern/autoseam/EigenSolver.h     
2011-07-31 10:54:51 UTC (rev 38878)
@@ -30,21 +30,30 @@
 #define EIGEN_SOLVER_H
 
 #include "SparseMatrix.h"
+#include <vector>
 
+typedef std::vector<double> eig_vector;
+typedef std::vector<eig_vector> eigen_vectors;
 
-
 class EigenSolver{
        
        protected:
+               
+               eigen_vectors eig_vectors;
                int  matrix_dimension;
-               
+               std::vector<double> eigen_values;
+               int  num_eigen_vectors;
        
        public:
-               int  num_eigen_vectors;
+               
                SparseMatrix<double> sparse_matrix;
                EigenSolver(int dimension);
-               virtual double * calculate_eigen_space() = 0;        // 
Declared it as pure virtual, so that subclasses must have to implement this.
-               ~EigenSolver();
+               virtual int num_eigenvalues();
+               virtual double * solve() = 0;    
+               virtual double eigenvalue(int n) = 0;
+               virtual std::vector<double> eigenvector(int n) = 0;
+       
+               virtual ~EigenSolver();
                
        
 };

Modified: 
branches/soc-2011-avocado/blender/intern/autoseam/EigenSolverArpack.cpp
===================================================================
--- branches/soc-2011-avocado/blender/intern/autoseam/EigenSolverArpack.cpp     
2011-07-31 07:58:50 UTC (rev 38877)
+++ branches/soc-2011-avocado/blender/intern/autoseam/EigenSolverArpack.cpp     
2011-07-31 10:54:51 UTC (rev 38878)
@@ -29,7 +29,9 @@
 #include "EigenSolverArpack.h"
 #include "MEM_guardedalloc.h"
 #include <stdio.h>
+#include <stdexcept>
 
+
 //#define EIGEN_DEBUG_ARPACK 1
 #define NUM_EIGEN_VAL 100
 #define minimum(a,b)  (a <= b) ? a : b;
@@ -53,9 +55,23 @@
        
 }
 
+std::vector<double> EigenSolverArpack::eigenvector(int n){
+       
+       if (n < eig_vectors.size()) {
+               return eig_vectors[n];
+       }
+       else{
+               throw std::out_of_range("Invalid eigen vector requested");
+       }
+       
+}
 
+double EigenSolverArpack:: eigenvalue(int n)
+{
+       return eigen_values[n];
+}
 
-double * EigenSolverArpack:: calculate_eigen_space()
+double * EigenSolverArpack:: solve()
 {
        
 #ifdef WITH_ARPACK
@@ -220,29 +236,29 @@
                        
                } 
                else {
+                       //set the eigen values
+                       int i, j;
+                       eig_vector temp;
                        
-                       // Block to print eigen values and eigen vectors
-                       
-       #ifdef EIGEN_DEBUG_ARPACK
-                       {
-                               int i,j;
+                       //set the eigen vectors and eigen values
+                       for(i = 0; i < nev; i++){
+                               eigen_values.push_back(d__[i]);
+                               temp.clear();
                                
-                               for(i = 0; i < nev; i++)
-                               {
+                               #ifdef EIGEN_DEBUG_ARPACK
                                        printf("eigen value : %f\n", d__[i]);
                                        printf("The eigen vector %d :\n", i);
+                               #endif
+                               
+                               for(j = 0; j < matrix_dimension; j++){
+                                       temp.push_back(v[i*ldv + j]);
                                        
-                                       //prints one eigen vector
-                                       for(j = 0; j < matrix_dimension; j++){
+                                       #ifdef EIGEN_DEBUG_ARPACK
                                                printf("%lf ", v[i*ldv + j]);
-                                       }
+                                       #endif
                                }
+                               eig_vectors.push_back(temp);
                        }
-       #endif
-                       //set the eigen values
-                       int i;
-                       eigen_values = Eigen::VectorXd(nev);
-                       for(i = 0; i < nev; i++) eigen_values(i) = d__[i];
                        
                        //memory deallocation
                        

Modified: branches/soc-2011-avocado/blender/intern/autoseam/EigenSolverArpack.h
===================================================================
--- branches/soc-2011-avocado/blender/intern/autoseam/EigenSolverArpack.h       
2011-07-31 07:58:50 UTC (rev 38877)
+++ branches/soc-2011-avocado/blender/intern/autoseam/EigenSolverArpack.h       
2011-07-31 10:54:51 UTC (rev 38878)
@@ -36,23 +36,13 @@
 
 class EigenSolverArpack: public EigenSolver{
        
-       //member variables
-       private:
-               
-       // Eigen::VectorXd eigen_values;
-               
-
-       
        public:
                
-               //int num_eigen_values;
-               Eigen::VectorXd eigen_values;
-               //Eigen::MatrixXd matrix;
+               //Eigen::VectorXd eigen_values;
                EigenSolverArpack(int dimension);
-               //EigenSolverArpack(int dimension);
-               //initialize_arpack();  // allocate memory and sets variables
-               double * calculate_eigen_space();
-               //int mul_matrix_vector(int dimension, double *vec, double * 
result);
+               double * solve();
+               double eigenvalue(int n);
+               std::vector<double> eigenvector(int n);
                ~EigenSolverArpack();
 
 };

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

Reply via email to