diff --git a/core/src/cluster.cc b/core/src/cluster.cc index 4ccbee05011a57720d975d38a52439ef0188064b..3c579730429acd631911538e2df574101ff955cf 100644 --- a/core/src/cluster.cc +++ b/core/src/cluster.cc @@ -19,12 +19,12 @@ struct Cluster { // gives avg distance between two clusters Real ClusterDistanceAVG(const Cluster& one, const Cluster& two, - Real** dist_matrix) { + const ost::TriMatrix<Real>& dist_matrix) { typedef std::vector<uint>::const_iterator MyIter; Real sum = 0.0; for (MyIter i = one.members.begin(); i != one.members.end(); ++i) { for (MyIter j = two.members.begin(); j != two.members.end(); ++j) { - sum += dist_matrix[*i][*j]; + sum += dist_matrix.Get(*i, *j); } } return sum / (one.members.size() * two.members.size()); @@ -33,13 +33,13 @@ Real ClusterDistanceAVG(const Cluster& one, // gives max distance between two clusters Real ClusterDistanceMAX(const Cluster& one, const Cluster& two, - Real** dist_matrix) { + const ost::TriMatrix<Real>& dist_matrix) { typedef std::vector<uint>::const_iterator MyIter; Real max_dist = -std::numeric_limits<Real>::max(); Real current_dist; for (MyIter i = one.members.begin(); i != one.members.end(); ++i) { for (MyIter j = two.members.begin(); j != two.members.end(); ++j) { - current_dist = dist_matrix[*i][*j]; + current_dist = dist_matrix.Get(*i, *j); if (current_dist > max_dist) max_dist = current_dist; } } @@ -49,13 +49,13 @@ Real ClusterDistanceMAX(const Cluster& one, // gives min distance between two clusters Real ClusterDistanceMIN(const Cluster& one, const Cluster& two, - Real** dist_matrix) { + const ost::TriMatrix<Real>& dist_matrix) { typedef std::vector<uint>::const_iterator MyIter; Real min_dist = std::numeric_limits<Real>::max(); Real current_dist; for (MyIter i = one.members.begin(); i != one.members.end(); ++i) { for (MyIter j = two.members.begin(); j != two.members.end(); ++j) { - current_dist = dist_matrix[*i][*j]; + current_dist = dist_matrix.Get(*i, *j); if (current_dist < min_dist) min_dist = current_dist; } } @@ -98,12 +98,15 @@ bool PositiveCompareQueueEntries(const QueueEntry& a, const QueueEntry& b){ namespace promod3 { namespace core { -void DoClustering(Real** dist_matrix, uint num, DistanceMetric metric, +void DoClustering(const ost::TriMatrix<Real>& dist_matrix, + DistanceMetric metric, Real thresh, char direction, std::vector<std::vector<uint> >& output){ output.clear(); + uint num = dist_matrix.GetSize(); + // do the stupid cases if(num == 0){ return; @@ -129,7 +132,7 @@ void DoClustering(Real** dist_matrix, uint num, DistanceMetric metric, //let's get a function ptr to the right metric function typedef Real (*metric_f_ptr)(const Cluster& one, const Cluster& two, - Real** dist_matrix); + const ost::TriMatrix<Real>& dist_matrix); metric_f_ptr metric_ptr; switch (metric) { @@ -176,7 +179,7 @@ void DoClustering(Real** dist_matrix, uint num, DistanceMetric metric, for(uint i = 0; i < num; ++i){ for(uint j = i + 1; j < num; ++j){ - distance_queue.push(QueueEntry(i, j, dist_matrix[i][j])); + distance_queue.push(QueueEntry(i, j, dist_matrix.Get(i, j))); } } diff --git a/core/src/cluster.hh b/core/src/cluster.hh index 032ed7886163d5d539dd424354963e30ae94c973..5c86bf02796e6566ba7fbcdbc3fef71ec655a46d 100644 --- a/core/src/cluster.hh +++ b/core/src/cluster.hh @@ -4,6 +4,7 @@ #include <vector> #include <limits> #include <ost/base.hh> +#include <ost/tri_matrix.hh> namespace promod3 { namespace core { @@ -14,9 +15,9 @@ enum DistanceMetric { }; -void DoClustering(Real** dist_matrix, uint num, DistanceMetric metric, - Real thresh, char direction, - std::vector<std::vector<uint> >& output); +void DoClustering(const ost::TriMatrix<Real>& dist_matrix, + DistanceMetric metric, Real thresh, char direction, + std::vector<std::vector<uint> >& output); }} //ns diff --git a/core/src/superpose.cc b/core/src/superpose.cc index 7eb504029aace3c2305ae4a438afccbcf0e1e55a..597fa69c5b814409e923ce3a60b7e1f8bfd0cd2c 100644 --- a/core/src/superpose.cc +++ b/core/src/superpose.cc @@ -412,7 +412,7 @@ std::pair<geom::Mat4,Real> Superposition(EMatX3& pos_one, EMatX3& pos_two, return std::make_pair(transform, rmsd); } -void FillRMSDMatrix(EMatX3List& position_list, Real** data){ +void FillRMSDMatrix(EMatX3List& position_list, ost::TriMatrix<Real>& data){ if(position_list.empty()){ throw promod3::Error("Empty position list in FillRMSDMatrix!"); @@ -422,6 +422,11 @@ void FillRMSDMatrix(EMatX3List& position_list, Real** data){ int num_pos = position_list.size(); int pos_size = position_list[0].rows(); + if(num_pos != data.GetSize()) { + throw promod3::Error("Number of positions and size of rmsd matrix is " + "inconsistent in FillRMSDMatrix function!"); + } + if(pos_size < 3) { throw promod3::Error("Observed superposition with < 3 positions to " "superpose!"); @@ -442,11 +447,10 @@ void FillRMSDMatrix(EMatX3List& position_list, Real** data){ Real rmsd; EMat3 rot; for(int i = 0; i < num_pos; ++i){ - data[i][i] = 0.0; + data.Set(i,i,Real(0.0)); for(int j = i + 1; j < num_pos; ++j){ TheobaldRMSD(position_list[i], position_list[j], rmsd, rot); - data[i][j] = rmsd; - data[j][i] = rmsd; + data.Set(i, j, rmsd); } } } diff --git a/core/src/superpose.hh b/core/src/superpose.hh index 8a169a784d23389fe8244108e22e905f12ecd367..8e9839c9575695d1fdc8520250cba9f9b02223e1 100644 --- a/core/src/superpose.hh +++ b/core/src/superpose.hh @@ -3,6 +3,7 @@ #include <ost/geom/vecmat3_op.hh> #include <ost/geom/mat4.hh> +#include <ost/tri_matrix.hh> #include <promod3/core/message.hh> #include <Eigen/SVD> @@ -43,7 +44,7 @@ std::pair<geom::Mat4,Real> Superposition(EMatX3& pos_one, EMatX3& pos_two, // Fill matrix with pairwise RMSD values // The positions you pass will be centered, their mean will be the origin... -void FillRMSDMatrix(EMatX3List& position_list, Real** data); +void FillRMSDMatrix(EMatX3List& position_list, ost::TriMatrix<Real>& data); // ITERATIVE MIN RMSD SUPERPOSITION ALGORITHMS // You'll always know what indices are actually used for the final diff --git a/modelling/src/loop_candidate.cc b/modelling/src/loop_candidate.cc index 49885a31c854a2fa4edec7558196c8ac21f07ac9..82fda8923c1cab9c909f45903756889f6de2f577 100644 --- a/modelling/src/loop_candidate.cc +++ b/modelling/src/loop_candidate.cc @@ -288,10 +288,7 @@ LoopCandidates::GetClusters(Real max_dist, clusters[0].push_back(0); } else if (num_loops > 0) { - Real** rmsd_matrix = new Real*[num_loops]; - for (uint i= 0; i < num_loops; ++i) { - rmsd_matrix[i] = new Real[num_loops]; - } + ost::TriMatrix<Real> rmsd_matrix(num_loops, Real(0.0)); if(superposed_rmsd){ // prepare the Eigen positions @@ -311,24 +308,16 @@ LoopCandidates::GetClusters(Real max_dist, } else{ for(uint i = 0; i < this->size(); ++i){ - rmsd_matrix[i][i] = 0.0; for(uint j = i + 1; j < this->size(); ++j){ Real ca_rmsd = candidates_[i].CARMSD(candidates_[j], false); - rmsd_matrix[i][j] = ca_rmsd; - rmsd_matrix[j][i] = ca_rmsd; + rmsd_matrix.Set(i, j, ca_rmsd); } } } // get clusters - promod3::core::DoClustering(rmsd_matrix, num_loops, - promod3::core::AVG_DIST_METRIC, + promod3::core::DoClustering(rmsd_matrix, promod3::core::AVG_DIST_METRIC, max_dist, '-', clusters); - // clean up - for (uint i = 0; i < num_loops; ++i) { - delete [] rmsd_matrix[i]; - } - delete [] rmsd_matrix; } } @@ -368,10 +357,7 @@ LoopCandidatesPtr LoopCandidates::GetLargestCluster(Real max_dist, return Extract(indices); } else { - Real** rmsd_matrix = new Real*[num_loops]; - for (uint i= 0; i < num_loops; ++i) { - rmsd_matrix[i] = new Real[num_loops]; - } + ost::TriMatrix<Real> rmsd_matrix(num_loops, Real(0.0)); if(superposed_rmsd){ // prepare the Eigen positions @@ -391,11 +377,9 @@ LoopCandidatesPtr LoopCandidates::GetLargestCluster(Real max_dist, } else{ for(uint i = 0; i < this->size(); ++i){ - rmsd_matrix[i][i] = 0.0; for(uint j = i + 1; j < this->size(); ++j){ Real ca_rmsd = candidates_[i].CARMSD(candidates_[j], false); - rmsd_matrix[i][j] = ca_rmsd; - rmsd_matrix[j][i] = ca_rmsd; + rmsd_matrix.Set(i, j, ca_rmsd); } } } @@ -404,11 +388,10 @@ LoopCandidatesPtr LoopCandidates::GetLargestCluster(Real max_dist, int max_num = 0; int max_idx = 0; - // going triangular might be more efficient for(uint i = 0; i < num_loops; ++i){ int num = 0; for(uint j = 0; j < num_loops; ++j){ - if(rmsd_matrix[i][j] < max_dist){ + if(rmsd_matrix.Get(i, j) < max_dist) { ++num; } } @@ -420,17 +403,11 @@ LoopCandidatesPtr LoopCandidates::GetLargestCluster(Real max_dist, std::vector<uint> indices; for(uint i = 0; i < num_loops; ++i){ - if(rmsd_matrix[max_idx][i] < max_dist){ + if(rmsd_matrix.Get(max_idx, i) < max_dist) { indices.push_back(i); } } - // clean up - for (uint i = 0; i < num_loops; ++i) { - delete [] rmsd_matrix[i]; - } - delete [] rmsd_matrix; - return Extract(indices); } } diff --git a/modelling/src/rigid_blocks.cc b/modelling/src/rigid_blocks.cc index 4a4fb3eccbec6809d74db5385d4337017d2a6a6d..ef24abeb7a846f4039e1fd5331a5fc13b954691b 100644 --- a/modelling/src/rigid_blocks.cc +++ b/modelling/src/rigid_blocks.cc @@ -51,10 +51,7 @@ void DoIt(promod3::core::EMatX3& pos_mat_one, initial_transformations); uint num_blocks = initial_indices.size(); - Real** dist_mat = new Real*[num_blocks]; - for(uint i= 0; i < num_blocks; ++i){ - dist_mat[i] = new Real[num_blocks]; - } + ost::TriMatrix<Real> dist_mat(num_blocks, Real(0.0)); //calculate the pairwise distances for(uint i = 0; i < num_blocks; ++i){ @@ -62,22 +59,14 @@ void DoIt(promod3::core::EMatX3& pos_mat_one, Real dist = IndexListSimilarity(initial_indices[i], initial_indices[j], num_rows); - dist_mat[i][j] = dist; - dist_mat[j][i] = dist; + dist_mat.Set(i, j, dist); } } std::vector<std::vector<uint> > clusters; - promod3::core::DoClustering(dist_mat, num_blocks, - promod3::core::MIN_DIST_METRIC, + promod3::core::DoClustering(dist_mat, promod3::core::MIN_DIST_METRIC, cluster_thresh, '+', clusters); - for(uint i = 0; i < num_blocks; ++i){ - delete [] dist_mat[i]; - } - delete [] dist_mat; - - //map over the final indices indices.clear(); std::vector<uint>::iterator it; diff --git a/scoring/src/constraint_constructor.cc b/scoring/src/constraint_constructor.cc index dec98385908c87acd1ceed41d2c4174db6629582..15e200177219085de069322553b78a6615bd9ba3 100644 --- a/scoring/src/constraint_constructor.cc +++ b/scoring/src/constraint_constructor.cc @@ -24,32 +24,22 @@ void ClusterSequences(const ost::seq::AlignmentHandle& aln, //clusters all sequences, neglecting the first int num_sequences = aln.GetCount() - 1; - //pairwise distances come in here - Real** dist_matrix = new Real*[num_sequences]; - for(int i = 0; i < num_sequences; ++i){ - dist_matrix[i] = new Real[num_sequences]; - memset(dist_matrix[i], 0, num_sequences*sizeof(Real)); - } + ost::TriMatrix<Real> dist_matrix(num_sequences, Real(0.0)); //sequence similarity serves as distance for clustering for(int i = 0; i < num_sequences; ++i){ for(int j = i+1; j < num_sequences; ++j){ Real seq_sim = ost::seq::alg::SequenceSimilarity(aln, subst, true, i+1, j+1); - dist_matrix[i][j] = seq_sim; - dist_matrix[j][i] = seq_sim; + dist_matrix.Set(i,j, seq_sim); } } //lets cluster the stuff - promod3::core::DoClustering(dist_matrix, num_sequences, metric, + promod3::core::DoClustering(dist_matrix, metric, cluster_thresh, '+', clusters); - //clean up - for(int i = 0; i < num_sequences; ++i){ - delete [] dist_matrix[i]; - } - delete [] dist_matrix; + } void GenerateClusterWeights(const ost::seq::AlignmentHandle& aln,