diff --git a/src/mlpack/methods/lsh/lsh_search_impl.hpp b/src/mlpack/methods/lsh/lsh_search_impl.hpp index bd022c8234..ac65a86a6c 100644 --- a/src/mlpack/methods/lsh/lsh_search_impl.hpp +++ b/src/mlpack/methods/lsh/lsh_search_impl.hpp @@ -555,11 +555,16 @@ void LSHSearch::Serialize(Archive& ar, arma::Mat tmpSecondHashTable; ar & CreateNVP(tmpSecondHashTable, "secondHashTable"); + // The old secondHashTable was stored in row-major format, so we transpose + // it. + tmpSecondHashTable = tmpSecondHashTable.t(); + secondHashTable.resize(tmpSecondHashTable.n_cols); for (size_t i = 0; i < tmpSecondHashTable.n_cols; ++i) { // Find length of each column. We know we are at the end of the list when // the value referenceSet->n_cols is seen. + size_t len = 0; for ( ; len < tmpSecondHashTable.n_rows; ++len) if (tmpSecondHashTable(len, i) == referenceSet->n_cols) @@ -599,29 +604,24 @@ void LSHSearch::Serialize(Archive& ar, if (version == 0) { // The vector was stored in the old uncompressed form. So we need to shrink - // it. + // it. But we can't do that until we have bucketRowInHashTable, so we also + // have to load that. arma::Col tmpBucketContentSize; ar & CreateNVP(tmpBucketContentSize, "bucketContentSize"); + ar & CreateNVP(bucketRowInHashTable, "bucketRowInHashTable"); // Compress into a smaller vector by just dropping all of the zeros. bucketContentSize.set_size(secondHashTable.size()); - size_t loc = 0; for (size_t i = 0; i < tmpBucketContentSize.n_elem; ++i) - { if (tmpBucketContentSize[i] > 0) - bucketContentSize[loc++] = tmpBucketContentSize[i]; - - // Terminate early, if we can. - if (loc == bucketContentSize.n_elem) - break; - } + bucketContentSize[bucketRowInHashTable[i]] = tmpBucketContentSize[i]; } else { ar & CreateNVP(bucketContentSize, "bucketContentSize"); + ar & CreateNVP(bucketRowInHashTable, "bucketRowInHashTable"); } - ar & CreateNVP(bucketRowInHashTable, "bucketRowInHashTable"); ar & CreateNVP(distanceEvaluations, "distanceEvaluations"); }