diff --git a/CMakeLists.txt b/CMakeLists.txt index 413959a6b913767e97ea83e7a8a06720d4235952..fea7a6b8f88ff46894ae742808e5e2ec75d15aa0 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -154,8 +154,6 @@ else() set(_UBUNTU_LAYOUT OFF) endif() -add_definitions(-DEIGEN2_SUPPORT) - if (COMPOUND_LIB) set(_COMP_LIB "${COMPOUND_LIB}") if (NOT IS_ABSOLUTE "${COMPOUND_LIB}") diff --git a/modules/geom/src/vec3.cc b/modules/geom/src/vec3.cc index a36db7122a72a7f043a6a3cc160788987fd8088c..d55ab5d2ca8ec784ee4e637a40b4de2e6d200b46 100644 --- a/modules/geom/src/vec3.cc +++ b/modules/geom/src/vec3.cc @@ -60,7 +60,7 @@ Mat3 Vec3List::GetPrincipalAxes() const Mat3 inertia=this->GetInertia(); EMat3 inertia_mat(inertia.Data()); - Eigen::SVD<EMat3> svd(inertia_mat); + Eigen::JacobiSVD<EMat3> svd(inertia_mat,Eigen::ComputeThinU); EMat3 rot=svd.matrixU(); Mat3 axes(rot.data()); return axes; diff --git a/modules/gfx/src/impl/cartoon_renderer.cc b/modules/gfx/src/impl/cartoon_renderer.cc index f9eee510679686554c1f7bfac9fd6550f7e3f837..00894483df3e7c0e3433463810fb403a80a84a46 100644 --- a/modules/gfx/src/impl/cartoon_renderer.cc +++ b/modules/gfx/src/impl/cartoon_renderer.cc @@ -23,10 +23,7 @@ #include "cartoon_renderer.hh" -#include <Eigen/Core> -#include <Eigen/Array> #include <Eigen/SVD> -#include <Eigen/LU> #include <ost/gfx/entity.hh> #include <ost/gfx/impl/tabulated_trig.hh> @@ -138,7 +135,7 @@ namespace { A.row(i)=to_eigen(points[i]-cen); } - Eigen::SVD<EMatX> svd(A); + Eigen::JacobiSVD<EMatX> svd(A,Eigen::ComputeThinV); EMatX V=svd.matrixV(); geom::Vec3 ax(V(0,0),V(1,0),V(2,0)); diff --git a/modules/mol/alg/src/superpose_frames.cc b/modules/mol/alg/src/superpose_frames.cc index f5cbba61073416b7c47dd05393c9104f4ee0b0b2..8c7c789a7dcbf664262e05703469bc3cb5bc84c8 100644 --- a/modules/mol/alg/src/superpose_frames.cc +++ b/modules/mol/alg/src/superpose_frames.cc @@ -17,10 +17,7 @@ // 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA //------------------------------------------------------------------------------ -#include <Eigen/Core> -#include <Eigen/Array> -#include <Eigen/SVD> -#include <Eigen/LU> +#include <Eigen/Eigenvalues> #include <ost/message.hh> #include <ost/mol/mol.hh> #include <ost/mol/alg/superpose_frames.hh> @@ -100,7 +97,7 @@ void AddSuperposedFrame(CoordGroupHandle& superposed, EMatX3& ref_mat,EMatX3& re frame_center=frame_mat.rowwise().sum()/frame_mat.cols(); frame_centered=row_sub(frame_mat, frame_center); //single value decomposition - Eigen::SVD<EMat3> svd(frame_centered*ref_centered); + Eigen::JacobiSVD<EMat3> svd(frame_centered*ref_centered,Eigen::ComputeThinU | Eigen::ComputeThinV); EMat3 matrixVT=svd.matrixV().transpose(); //determine rotation Real detv=matrixVT.determinant(); diff --git a/modules/mol/alg/src/svd_superpose.cc b/modules/mol/alg/src/svd_superpose.cc index fd789b867c8f5f1383319b04628dbe2452c4868f..c8c068c0be576bab51592b701f83c07d598670f0 100644 --- a/modules/mol/alg/src/svd_superpose.cc +++ b/modules/mol/alg/src/svd_superpose.cc @@ -21,10 +21,8 @@ #include <iostream> #include <boost/bind.hpp> -#include <Eigen/Core> -#include <Eigen/Array> #include <Eigen/SVD> -#include <Eigen/LU> +#include <Eigen/Geometry> #include <ost/base.hh> #include <ost/geom/vec3.hh> @@ -94,7 +92,7 @@ Real calc_rmsd_for_ematx(const EMatX& atoms1, const EMatX& atoms2, const EMat4& transformation) { - EMatX transformed_atoms1 = EMatX::Zero(atoms1.rows(), 3); + EMatX transformed = EMatX::Zero(atoms1.rows(), 3); EMatX vector = EMatX::Zero(4,1); EMatX transformed_vector = EMatX::Zero(4,1); @@ -103,17 +101,12 @@ Real calc_rmsd_for_ematx(const EMatX& atoms1, for(int i=0;i<atoms1.rows();++i){ vector.block<3,1>(0,0)=atoms1.block<1,3>(i,0).transpose(); transformed_vector = transformation*vector; - transformed_atoms1.block<1,3>(i,0)=transformed_vector.block<3,1>(0,0).transpose(); + transformed.block<1,3>(i,0)=transformed_vector.block<3,1>(0,0).transpose(); } - EMatX diff = EMatX::Zero(atoms1.rows(),atoms1.cols()); - EMatX squared_dist = EMatX::Zero(atoms1.rows(),1); - - diff = transformed_atoms1-atoms2; - squared_dist = (diff.cwise()*diff).rowwise().sum(); - - return sqrt(squared_dist.sum()/squared_dist.rows()); - + transformed = transformed - atoms2; + transformed = transformed.array()*transformed.array(); + return sqrt(transformed.rowwise().sum().sum()/atoms1.rows()); } Real CalculateRMSD(const mol::EntityView& ev1, @@ -204,7 +197,8 @@ public: EMatX TransformEMatX(const EMatX& mat, const EMat4& transformation) const; - std::vector<int> CreateMatchingSubsets(const EMatX& atoms, const EMatX& atoms_ref, Real distance_threshold) const; + void CreateMatchingSubsets(std::vector<int>& matching_subset, const EMatX& atoms, + const EMatX& atoms_ref, Real distance_threshold) const; SuperpositionResult IterativeMinimize(int ncycles, Real distance_threshold) const; @@ -287,7 +281,7 @@ SuperpositionResult MeanSquareMinimizerImpl::IterativeMinimize(int max_cycles, R for(;cycles<max_cycles;++cycles){ transformed_atoms = this->TransformEMatX(atoms1_, transformation_matrix); - matching_indices = this->CreateMatchingSubsets(transformed_atoms, atoms2_, distance_threshold); + this->CreateMatchingSubsets(matching_indices, transformed_atoms, atoms2_, distance_threshold); if(matching_indices.size()<3){ std::stringstream ss; @@ -312,7 +306,7 @@ SuperpositionResult MeanSquareMinimizerImpl::IterativeMinimize(int max_cycles, R diff = transformation_matrix_old-transformation_matrix; - if(diff.cwise().abs().sum()<0.0001){ + if(diff.array().abs().sum()<0.0001){ ++cycles; break; } @@ -348,24 +342,25 @@ EMatX MeanSquareMinimizerImpl::TransformEMatX(const EMatX& mat, const EMat4& tra return transformed_mat; } -std::vector<int> MeanSquareMinimizerImpl::CreateMatchingSubsets(const EMatX& atoms, const EMatX& atoms_ref, Real distance_threshold) const{ +void MeanSquareMinimizerImpl::CreateMatchingSubsets(std::vector<int>& matching_subset, + const EMatX& atoms, const EMatX& atoms_ref, + Real distance_threshold) const{ - std::vector<int> return_vec; + matching_subset.clear(); EMatX diff = EMatX::Zero(atoms.rows(),atoms.cols()); EMatX dist = EMatX::Zero(atoms.rows(),1); diff = atoms-atoms_ref; - dist = (diff.cwise()*diff).rowwise().sum(); - dist = dist.cwise().sqrt(); + dist = (diff.array()*diff.array()).rowwise().sum(); + + Real squared_dist_threshold = distance_threshold * distance_threshold; for(int i=0; i<dist.rows(); ++i){ - if(dist(i,0) <= distance_threshold){ - return_vec.push_back(i); + if(dist(i,0) <= squared_dist_threshold){ + matching_subset.push_back(i); } } - - return return_vec; } @@ -381,7 +376,7 @@ SuperpositionResult MeanSquareMinimizerImpl::Minimize(const EMatX& atoms, const EMatX atoms_ref_shifted = MatrixShiftedBy(atoms_ref, avg_ref).transpose(); // determine rotational component - Eigen::SVD<EMat3> svd(atoms_ref_shifted*atoms_shifted); + Eigen::JacobiSVD<EMat3> svd(atoms_ref_shifted*atoms_shifted,Eigen::ComputeThinU | Eigen::ComputeThinV); EMatX matrixVT=svd.matrixV().transpose(); //determine rotation diff --git a/modules/mol/base/src/bounding_box.cc b/modules/mol/base/src/bounding_box.cc index 4b70f78172ecdfde25af3d612944823423b46138..85c40ed1acbb0832893da76f57af96815a3829cc 100644 --- a/modules/mol/base/src/bounding_box.cc +++ b/modules/mol/base/src/bounding_box.cc @@ -22,7 +22,7 @@ */ #include <limits> -#include <Eigen/QR> +#include <Eigen/Eigenvalues> #include <ost/mol/mol.hh> #include <ost/mol/bounding_box.hh> namespace ost { namespace mol {