TVec<TPair<TFltV, TFltV> > TLSHash::GetAllCandidatePairs() { THashSet<TPair<TInt, TInt> > CandidateIdPairs; for (int i=0; i<Bands; i++) { TVec<TIntV> BucketVV; SigBucketVHV[i].GetDatV(BucketVV); for (int j=0; j<BucketVV.Len(); j++) { TIntV BucketV = BucketVV[j]; for (int k=0; k<BucketV.Len(); k++) { for (int l=k+1; l<BucketV.Len(); l++) { int First = BucketV[k], Second = BucketV[l]; if (First > Second) { int Temp = First; First = Second; Second = Temp; } CandidateIdPairs.AddKey(TPair<TInt, TInt> (First, Second)); } } } } TVec<TPair<TFltV, TFltV> > CandidatePairs; int Ind = CandidateIdPairs.FFirstKeyId(); while (CandidateIdPairs.FNextKeyId(Ind)) { TPair<TInt, TInt> IdPair = CandidateIdPairs[Ind]; TPair<TFltV, TFltV> Pair(DataV[IdPair.GetVal1()], DataV[IdPair.GetVal2()]); CandidatePairs.Add(Pair); } return CandidatePairs; }
TVec<TFltV> TLSHash::GetCandidates(TFltV Datum) { THashSet<TInt> CandidateIds; for (int i=0; i<Bands; i++) { TInt Sig = ComputeSignature(Datum, i); THash<TInt, TIntV>& SigBucketVH = SigBucketVHV[i]; if (!SigBucketVH.IsKey(Sig)) { continue; } CandidateIds.AddKeyV(SigBucketVH.GetDat(Sig)); } TVec<TFltV> Candidates; int Ind = CandidateIds.FFirstKeyId(); while(CandidateIds.FNextKeyId(Ind)) { int Id = CandidateIds[Ind]; Candidates.Add(DataV[Id]); } return Candidates; }