[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