[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [38878] branches/soc-2011-avocado/blender/ intern/autoseam: Code cleanup and restructure of eigen solver related classes.

shuvro sarker shuvro05 at gmail.com
Sun Jul 31 12:54:52 CEST 2011


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




More information about the Bf-blender-cvs mailing list