2424#include < vector>
2525#include < map>
2626#include < iostream>
27+ #include < parallel/algorithm>
28+ #include < mutex>
2729
2830template <typename T>
2931inline
@@ -60,12 +62,12 @@ class FingerprintManager
6062 std::pair<int , double > compareSongs (long songID1, long songID2, double cancelThreshold=0.55 );
6163 boost::python::list compareSongsVerbose (long songID1, long songID2);
6264
63- std::pair<int , double > compareChromaprintFingerprintsAndOffset (std::vector<int > fp1, std::vector<int > fp2, double cancelThreshold) const ;
65+ std::pair<int , double > compareChromaprintFingerprintsAndOffset (const std::vector<int > & fp1, const std::vector<int > & fp2, double cancelThreshold) const ;
6466 boost::python::list compareChromaprintFingerprintsAndOffsetVerbose (std::vector<int > fp1, std::vector<int > fp2) const ;
6567
6668private:
6769 int m_maxoffset;
68- std::map<int , std::vector<int > > m_fingerprints;
70+ std::map<int , std::vector<int >> m_fingerprints;
6971};
7072
7173FingerprintManager::FingerprintManager (): m_maxoffset(50 )
@@ -92,32 +94,30 @@ void FingerprintManager::addSong(long songID, boost::python::list &fingerprint)
9294
9395boost::python::list FingerprintManager::addSongAndCompare (long songID, boost::python::list &fingerprint, double cancelThreshold)
9496{
97+ std::mutex result_mutex;
9598 boost::python::list result;
9699 auto v = to_std_vector<int >(fingerprint);
97- // std::cout << "len: " << v.size() << std::endl;
98100 v.insert (v.begin (), m_maxoffset, 0 );
99- // std::cout << "new len: " << v.size() << std::endl;
100- for (auto & [itSongID, itFingerprint]: m_fingerprints)
101- {
102- auto [offset, similarity] = compareChromaprintFingerprintsAndOffset (itFingerprint, v, cancelThreshold);
103- if (similarity > cancelThreshold)
104- {
105- // std::cout << "****" << songID << " " << itSongID << " " << offset << " " << similarity << std::endl;
106- result.append (boost::python::make_tuple (itSongID, offset, similarity));
107- } /* else {
108- if (similarity < 0 )
109- std::cout << songID << " " << itSongID << " different" << std::endl;
110- else
111- std::cout << songID << " " << itSongID << " " << offset << " " << similarity << std::endl;
112- }*/
113101
114- }
102+ auto vectorizedFP = std::vector<std::pair< int ,std::vector< int >>>(m_fingerprints. begin (), m_fingerprints. end ());
115103
104+ __gnu_parallel::for_each (vectorizedFP.begin (), vectorizedFP.end (),
105+ [&](const auto &itSong)
106+ {
107+ auto & [itSongID, itFingerprint] = itSong;
108+ auto [offset, similarity] = compareChromaprintFingerprintsAndOffset (itFingerprint, v, cancelThreshold);
109+ if (similarity > cancelThreshold)
110+ {
111+ result_mutex.lock ();
112+ result.append (boost::python::make_tuple (itSongID, offset, similarity));
113+ result_mutex.unlock ();
114+ }
115+ }, __gnu_parallel::parallel_balanced);
116116 m_fingerprints[songID]=v;
117117 return result;
118118}
119119
120- std::pair<int , double > FingerprintManager::compareChromaprintFingerprintsAndOffset (std::vector<int > fp1, std::vector<int > fp2, double cancelThreshold) const
120+ std::pair<int , double > FingerprintManager::compareChromaprintFingerprintsAndOffset (const std::vector<int > & fp1, const std::vector<int > & fp2, double cancelThreshold) const
121121{
122122 std::vector<int >::const_iterator it1, it2;
123123 int offset;
0 commit comments