@@ -540,9 +540,9 @@ namespace SPTAG::SPANN {
540540
541541 SPANN ::Index<ValueType>* GetHeadIndex () const { return m_headIndex; }
542542
543- bool CheckIsNeedReassign (std::vector<std::shared_ptr<std::string>>& newHeadsVec, ValueType* data, std::shared_ptr<std::string> splitHeadVec, float_t headToSplitHeadDist, float_t currentHeadDist, bool isInSplitHead)
543+ bool CheckIsNeedReassign (std::vector<std::shared_ptr<std::string>>& newHeadsVec, ValueType* data, ValueType* splitHeadVec, float_t headToSplitHeadDist, float_t currentHeadDist, bool isInSplitHead)
544544 {
545- float_t splitHeadDist = m_headIndex->ComputeDistance (data, splitHeadVec-> data () );
545+ float_t splitHeadDist = m_headIndex->ComputeDistance (data, splitHeadVec);
546546
547547 if (isInSplitHead) {
548548 if (splitHeadDist >= currentHeadDist) return false ;
@@ -752,7 +752,6 @@ namespace SPTAG::SPANN {
752752 std::vector<SizeType> localIndices;
753753 localIndices.reserve (postVectorNum);
754754 uint8_t * vectorId = postingP;
755- SizeType headj = -1 ;
756755 bool hasHead = false ;
757756 for (SizeType j = 0 ; j < postVectorNum; j++, vectorId += m_vectorInfoSize)
758757 {
@@ -774,19 +773,18 @@ namespace SPTAG::SPANN {
774773 }
775774 }
776775
777- if (VID == headID) {
778- headj = j;
779- headVec = std::make_shared<std::string>((char *)vectorId + m_metaDataSize, m_vectorDataSize);
780- }
776+ if (VID == headID) headVec = std::make_shared<std::string>((char *)vectorId, m_vectorInfoSize);
781777 // if (VID >= m_versionMap->Count()) SPTAGLIB_LOG(Helper::LogLevel::LL_Error, "DEBUG: vector ID:%d total size:%d\n", VID, m_versionMap->Count());
782778 if (m_versionMap->Deleted (VID ) || m_versionMap->GetVersion (VID ) != version) continue ;
783779
784780 if (VID == headID) hasHead = true ;
785781 localIndices.push_back (j);
786782 }
787- if (headj < 0 ) {
783+ if (headVec == nullptr ) {
788784 SPTAGLIB_LOG (Helper::LogLevel::LL_Error, " Split fail: cannot find head in posting! headID:%lld\n " , (std::int64_t )headID);
789785 return ErrorCode::Fail;
786+ } else {
787+ *((uint8_t *)(headVec->data () + sizeof (SizeType))) = m_versionMap->GetVersion (headID);
790788 }
791789 // double gcEndTime = sw.getElapsedMs();
792790 // m_splitGcCost += gcEndTime;
@@ -800,8 +798,8 @@ namespace SPTAG::SPANN {
800798 memcpy (ptr, postingList.data () + localIndices[j] * m_vectorInfoSize, m_vectorInfoSize);
801799 }
802800 if (!hasHead) {
803- Serialize (ptr, headID, m_versionMap-> GetVersion (headID), headVec->data ());
804- localIndices.push_back (headj);
801+ memcpy (ptr, headVec->data (), m_vectorInfoSize );
802+ localIndices.push_back (0 ); // just to make sure head is included in posting, the index won't be used
805803 }
806804 postingList.resize (localIndices.size () * m_vectorInfoSize);
807805 if ((ret=PutPostingToDB (headID, postingList, MaxTimeout, &(p_exWorkSpace->m_diskRequests ))) != ErrorCode::Success) {
@@ -842,7 +840,7 @@ namespace SPTAG::SPANN {
842840 memcpy (ptr, postingList.c_str () + localIndices[j] * m_vectorInfoSize, m_vectorInfoSize);
843841 if (*((SizeType*)(ptr)) == headID) hasHead = true ;
844842 }
845- if (!hasHead) memcpy (newpostingList.data (), postingList. c_str () + headj * m_vectorInfoSize , m_vectorInfoSize);
843+ if (!hasHead) memcpy (newpostingList.data (), headVec-> data () , m_vectorInfoSize);
846844 SPTAGLIB_LOG (Helper::LogLevel::LL_Info, " Cluserting Failed (The same vector), Only Keep %d vectors.\n " , cut);
847845
848846 if ((ret=PutPostingToDB (headID, newpostingList, MaxTimeout, &(p_exWorkSpace->m_diskRequests ))) != ErrorCode::Success) {
@@ -857,7 +855,7 @@ namespace SPTAG::SPANN {
857855 }
858856
859857 std::vector<int > ks (2 , 0 );
860- if (m_headIndex->ComputeDistance (args.centers , headVec->c_str ()) < m_headIndex->ComputeDistance (args.centers + args._D , headVec->c_str ())) {
858+ if (m_headIndex->ComputeDistance (args.centers , headVec->c_str () + m_metaDataSize ) < m_headIndex->ComputeDistance (args.centers + args._D , headVec->c_str () + m_metaDataSize )) {
861859 ks[0 ] = 1 ;
862860 } else {
863861 ks[1 ] = 1 ;
@@ -875,14 +873,14 @@ namespace SPTAG::SPANN {
875873 for (int j = 0 ; j < args.counts [k]; j++, ptr += m_vectorInfoSize)
876874 {
877875 memcpy (ptr, postingList.c_str () + localIndices[first + j] * m_vectorInfoSize, m_vectorInfoSize);
878- // Serialize(ptr, localIndicesInsert[localIndices[first + j]], localIndicesInsertVersion[localIndices[first + j]], smallSample[localIndices[first + j]]);
879876 }
880- if (!theSameHead && headVec && m_headIndex->ComputeDistance (args.centers + k * args._D , headVec->c_str ()) < Epsilon) {
877+ if (!theSameHead && m_headIndex->ComputeDistance (args.centers + k * args._D , headVec->c_str () + m_metaDataSize ) < Epsilon) {
881878 newHeadsID[k] = headID;
882- newHeadsVec[k] = headVec;
879+ newHeadsVec[k] = headVec-> substr (m_metaDataSize, m_vectorDataSize) ;
883880 newHeadVID = headID;
884881 theSameHead = true ;
885- if (!hasHead && headj != -1 ) newPostingLists[k] += postingList.substr (headj * m_vectorInfoSize, m_vectorInfoSize);
882+ if (!hasHead) newPostingLists[k] += *headVec;
883+
886884 auto splitPutBegin = std::chrono::high_resolution_clock::now ();
887885 if ((ret=PutPostingToDB (newHeadVID, newPostingLists[k], MaxTimeout, &(p_exWorkSpace->m_diskRequests ))) != ErrorCode::Success) {
888886 SPTAGLIB_LOG (Helper::LogLevel::LL_Error, " Fail to override posting %lld\n " , (std::int64_t )(newHeadVID));
@@ -1181,6 +1179,8 @@ namespace SPTAG::SPANN {
11811179 if (headVec == nullptr ) {
11821180 SPTAGLIB_LOG (Helper::LogLevel::LL_Error, " MergePostings fail: cannot find head vector in posting! headID:%lld\n " , (std::int64_t )headID);
11831181 return ErrorCode::Fail;
1182+ } else {
1183+ *((uint8_t *)(headVec->data () + sizeof (SizeType))) = m_versionMap->GetVersion (headID);
11841184 }
11851185
11861186 if (currentLength > m_mergeThreshold)
@@ -1489,7 +1489,7 @@ namespace SPTAG::SPANN {
14891489 std::vector<std::string> &postingLists, std::vector<SizeType> &newHeadsID, std::vector<std::shared_ptr<std::string>> &newHeadsVec,
14901490 bool theSameHead)
14911491 {
1492- auto headVector = reinterpret_cast <const ValueType*>(headVec->data ());
1492+ auto headVector = reinterpret_cast <const ValueType*>(headVec->data () + m_metaDataSize );
14931493
14941494 // Collect vectors that need reassign, then do RNGSelection inline
14951495 // and batch Append by target head to reduce TiKV RPCs.
@@ -1528,20 +1528,10 @@ namespace SPTAG::SPANN {
15281528 }
15291529 };
15301530
1531- if (m_opt->m_excludehead && !theSameHead)
1532- {
1533- if (!m_versionMap->Deleted (headID))
1534- {
1535- std::shared_ptr<std::string> vectorinfo = std::make_shared<std::string>(m_vectorInfoSize, ' ' );
1536- Serialize (vectorinfo->data (), headID, m_versionMap->GetVersion (headID), headVector);
1537- // excludehead reassign: use the lambda with headPrev=-1
1538- tryBatchReassign (reinterpret_cast <uint8_t *>(vectorinfo->data ()), -1 );
1539- }
1540- }
15411531 std::vector<float > newHeadsDist (2 , 0 .0f );
15421532 std::set<SizeType> reAssignVectorsTopK;
1543- if (newHeadsVec[0 ]) newHeadsDist[0 ] = m_headIndex->ComputeDistance (headVec-> data () , newHeadsVec[0 ]->data ());
1544- if (newHeadsVec[1 ]) newHeadsDist[1 ] = m_headIndex->ComputeDistance (headVec-> data () , newHeadsVec[1 ]->data ());
1533+ if (newHeadsVec[0 ]) newHeadsDist[0 ] = m_headIndex->ComputeDistance (headVector , newHeadsVec[0 ]->data ());
1534+ if (newHeadsVec[1 ]) newHeadsDist[1 ] = m_headIndex->ComputeDistance (headVector , newHeadsVec[1 ]->data ());
15451535 for (int i = 0 ; i < postingLists.size (); i++) {
15461536 if (!newHeadsVec[i]) continue ;
15471537 auto & postingList = postingLists[i];
@@ -1562,7 +1552,7 @@ namespace SPTAG::SPANN {
15621552 if (reAssignVectorsTopK.find (vid) == reAssignVectorsTopK.end () && !m_versionMap->Deleted (vid) && m_versionMap->GetVersion (vid) == version) {
15631553 m_stat.m_reAssignScanNum ++;
15641554 float dist = m_headIndex->ComputeDistance (newHeadsVec[i]->data (), vector);
1565- if (CheckIsNeedReassign (newHeadsVec, vector, headVec , newHeadsDist[i], dist, true )) {
1555+ if (CheckIsNeedReassign (newHeadsVec, vector, headVector , newHeadsDist[i], dist, true )) {
15661556 tryBatchReassign (vectorId, newHeadsID[i]);
15671557 reAssignVectorsTopK.insert (vid);
15681558 }
@@ -1658,7 +1648,7 @@ namespace SPTAG::SPANN {
16581648 if (reAssignVectorsTopK.find (vid) == reAssignVectorsTopK.end () && !m_versionMap->Deleted (vid) && m_versionMap->GetVersion (vid) == version) {
16591649 m_stat.m_reAssignScanNum ++;
16601650 float dist = m_headIndex->ComputeDistance (HeadPrevTopKVec[i]->data (), vector);
1661- if (CheckIsNeedReassign (newHeadsVec, vector, headVec , newHeadsDist[i], dist, false )) {
1651+ if (CheckIsNeedReassign (newHeadsVec, vector, headVector , newHeadsDist[i], dist, false )) {
16621652 tryBatchReassign (vectorId, HeadPrevTopK[i]);
16631653 reAssignVectorsTopK.insert (vid);
16641654 }
0 commit comments