[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [38885] branches/soc-2011-avocado/blender/ intern/autoseam: Code restructure and clean up.
shuvro sarker
shuvro05 at gmail.com
Mon Aug 1 04:40:09 CEST 2011
Revision: 38885
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=38885
Author: shuvro
Date: 2011-08-01 02:40:09 +0000 (Mon, 01 Aug 2011)
Log Message:
-----------
Code restructure and clean up. Class level and function level comments added in the EigenSolverArpack class.
Modified Paths:
--------------
branches/soc-2011-avocado/blender/intern/autoseam/AutoseamAdjacency.cpp
branches/soc-2011-avocado/blender/intern/autoseam/AutoseamEigenspace.cpp
branches/soc-2011-avocado/blender/intern/autoseam/AutoseamEigenspace.h
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 22:59:36 UTC (rev 38884)
+++ branches/soc-2011-avocado/blender/intern/autoseam/AutoseamAdjacency.cpp 2011-08-01 02:40:09 UTC (rev 38885)
@@ -112,8 +112,7 @@
bool AutoseamAdjacency::generate_seam()
{
-
- double *eigen_vectors;
+ eigen_vectors vectors;
MatrixXd& a = m_adjacency;
clear_eigenspaces();
@@ -127,13 +126,8 @@
a(i,i) = -rowsum;
}
- //eigen_vectors = calculate_eigen_arpack();
-
-
-
-
EigenSolverArpack solver(matrix_dimension);
- //solver.matrix = a;
+
// We need to set up our matrix here.
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
@@ -143,9 +137,9 @@
}
}
- eigen_vectors = solver.solve();
+ vectors = solver.solve();
- if(a.rows() && a.cols() && eigen_vectors != NULL){
+ if(a.rows() && a.cols() && vectors.size()){
int f = 0;
bool found = false;
@@ -158,21 +152,7 @@
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++){
-
- //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.eigenvalue(f), eigen_vector);
+ AutoseamEigenspace* aes = new AutoseamEigenspace(solver.eigenvalue(f), solver.eigenvector(f));
// 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);
@@ -191,11 +171,10 @@
f++;
}
- MEM_freeN(eigen_vectors);
+
return found;
}
- MEM_freeN(eigen_vectors);
return 0;
}
Modified: branches/soc-2011-avocado/blender/intern/autoseam/AutoseamEigenspace.cpp
===================================================================
--- branches/soc-2011-avocado/blender/intern/autoseam/AutoseamEigenspace.cpp 2011-07-31 22:59:36 UTC (rev 38884)
+++ branches/soc-2011-avocado/blender/intern/autoseam/AutoseamEigenspace.cpp 2011-08-01 02:40:09 UTC (rev 38885)
@@ -31,7 +31,8 @@
#define THRESHOLD_ZERO 0.0001
-AutoseamEigenspace::AutoseamEigenspace(double eigenval, const Eigen::VectorXd& eigenvector)
+//AutoseamEigenspace::AutoseamEigenspace(double eigenval, const Eigen::VectorXd& eigenvector)
+AutoseamEigenspace::AutoseamEigenspace(double eigenval, const std::vector<double> eigenvector)
: e(eigenval), v(eigenvector)
{
@@ -114,6 +115,14 @@
void AutoseamEigenspace::debug(std::ofstream& fout)
{
+ int i, length_vector;
fout << "Eigenvalue: " << e << std::endl;
- fout << "Eigenvector: " << (Eigen::VectorXd)v << std::endl;
+
+ fout << "Eigenvector: " ;
+ length_vector = v.size();
+ for (i = 0; i < length_vector; i++) {
+ fout << v[i] << " ";
+ }
+ fout << std::endl;
+
}
\ No newline at end of file
Modified: branches/soc-2011-avocado/blender/intern/autoseam/AutoseamEigenspace.h
===================================================================
--- branches/soc-2011-avocado/blender/intern/autoseam/AutoseamEigenspace.h 2011-07-31 22:59:36 UTC (rev 38884)
+++ branches/soc-2011-avocado/blender/intern/autoseam/AutoseamEigenspace.h 2011-08-01 02:40:09 UTC (rev 38885)
@@ -35,7 +35,8 @@
class AutoseamEigenspace
{
public:
- AutoseamEigenspace(double eigenval, const Eigen::VectorXd& eigenvector);
+ //AutoseamEigenspace(double eigenval, const Eigen::VectorXd& eigenvector);
+ AutoseamEigenspace(double eigenval, const std::vector<double> eigenvector);
void split();
void fill_adjacency(const Eigen::MatrixXd& adj, Eigen::MatrixXd& adj_plus, Eigen::MatrixXd& adj_minus);
void get(int *fplus, unsigned int* nplus, int* fminus, unsigned int* nminus);
@@ -45,7 +46,8 @@
private:
double e;
- Eigen::VectorXd v;
+ //Eigen::VectorXd v;
+ std::vector<double> v;
std::vector<int> m_fplus;
std::vector<int> m_fminus;
Modified: branches/soc-2011-avocado/blender/intern/autoseam/EigenSolver.h
===================================================================
--- branches/soc-2011-avocado/blender/intern/autoseam/EigenSolver.h 2011-07-31 22:59:36 UTC (rev 38884)
+++ branches/soc-2011-avocado/blender/intern/autoseam/EigenSolver.h 2011-08-01 02:40:09 UTC (rev 38885)
@@ -49,7 +49,7 @@
SparseMatrix<double> sparse_matrix;
EigenSolver(int dimension);
virtual int num_eigenvalues();
- virtual double * solve() = 0;
+ virtual eigen_vectors solve() = 0;
virtual double eigenvalue(int n) = 0;
virtual std::vector<double> eigenvector(int n) = 0;
Modified: branches/soc-2011-avocado/blender/intern/autoseam/EigenSolverArpack.cpp
===================================================================
--- branches/soc-2011-avocado/blender/intern/autoseam/EigenSolverArpack.cpp 2011-07-31 22:59:36 UTC (rev 38884)
+++ branches/soc-2011-avocado/blender/intern/autoseam/EigenSolverArpack.cpp 2011-08-01 02:40:09 UTC (rev 38885)
@@ -26,6 +26,12 @@
* ***** END GPL LICENSE BLOCK *****
*/
+
+/**
+ * This class calculates eigen values and eigen vectors using the routines of
+ * the numerical library ARPACK.
+ */
+
#include "EigenSolverArpack.h"
#include "MEM_guardedalloc.h"
#include <stdio.h>
@@ -50,11 +56,14 @@
EigenSolverArpack::EigenSolverArpack(int dimension) : EigenSolver(dimension)
{
- //
- // Allocate memories for eigenspace
-
+
}
+/**
+ * Returns the nth eigen vector. n must be less than the number
+ * of eigen vectors calculated. It will be avaiable to call after the
+ * execution of the solve function.
+ */
std::vector<double> EigenSolverArpack::eigenvector(int n){
if (n < eig_vectors.size()) {
@@ -66,12 +75,21 @@
}
+/**
+ * Returns the nth eigen value. It will be avaiable to call after the
+ * execution of the solve function.
+ */
double EigenSolverArpack:: eigenvalue(int n)
{
return eigen_values[n];
}
-double * EigenSolverArpack:: solve()
+
+/**
+ * Calculates the eigen values and eigen vectors using ARPACK functions
+ * and returns a vector of eigen vectors
+ */
+eigen_vectors EigenSolverArpack:: solve()
{
#ifdef WITH_ARPACK
@@ -127,27 +145,25 @@
if (n > ldv) {
printf(" ERROR with _SSIMP: N is greater than MAXN \n");
- //goto L9000;
- return NULL;
+ eig_vectors.clear();
+ return eig_vectors;
}
else if (nev > NUM_EIGEN_VAL) {
printf(" ERROR with _SSIMP: NEV is greater than MAXNEV \n");
- //goto L9000;
- return NULL;
+ eig_vectors.clear();
+ return eig_vectors;
}
else if (ncv <= nev || ncv > n) {
printf(" ERROR with _SSIMP: NCV is greater than MAXNCV \n");
- // goto L9000;
- return NULL;
+ eig_vectors.clear();
+ return eig_vectors;
}
- //vectors_size = matrix_dimension * nev;
vectors_size = ldv * ncv;
v = (doublereal*)MEM_callocN(vectors_size * sizeof(doublereal), "eigen_vectors");
workl = (doublereal*)MEM_callocN((ncv*ncv + 8*ncv) * sizeof(doublereal), "workl");
- //d__ = (doublereal*)MEM_callocN(2*matrix_dimension * sizeof(doublereal), "eigen_values");
d__ = (doublereal*)MEM_callocN(2*ncv * sizeof(doublereal), "eigen_values");
resid = (doublereal*)MEM_callocN(matrix_dimension * sizeof(doublereal), "resid");
@@ -172,7 +188,6 @@
iparam[6] = mode1;
// main loop
- //L10:
while (true) {
@@ -190,10 +205,7 @@
if (ido == -1 || ido == 1) {
//perform matrix-vector multiplication
- //av_(&nx, &workd[ipntr[0] - 1], &workd[ipntr[1] - 1]);
- //mul_matrix_vector(n, &workd[ipntr[0] - 1], &workd[ipntr[1] - 1]);
sparse_matrix.mul_matrix_vector(n, &workd[ipntr[0] - 1], &workd[ipntr[1] - 1]);
- //goto L10;
}
else{
break;
@@ -267,11 +279,12 @@
MEM_freeN(workd);
MEM_freeN(workl);
MEM_freeN(select);
+ MEM_freeN(v);
// return the eigen vectors
- return v;
+ return eig_vectors;
}
@@ -285,10 +298,11 @@
MEM_freeN(workd);
MEM_freeN(workl);
MEM_freeN(select);
+ MEM_freeN(v);
- *v = NULL;
+ eig_vectors.clear();
- return v;
+ return eig_vectors;
#endif
Modified: branches/soc-2011-avocado/blender/intern/autoseam/EigenSolverArpack.h
===================================================================
--- branches/soc-2011-avocado/blender/intern/autoseam/EigenSolverArpack.h 2011-07-31 22:59:36 UTC (rev 38884)
+++ branches/soc-2011-avocado/blender/intern/autoseam/EigenSolverArpack.h 2011-08-01 02:40:09 UTC (rev 38885)
@@ -40,7 +40,7 @@
//Eigen::VectorXd eigen_values;
EigenSolverArpack(int dimension);
- double * solve();
+ eigen_vectors solve();
double eigenvalue(int n);
std::vector<double> eigenvector(int n);
~EigenSolverArpack();
More information about the Bf-blender-cvs
mailing list