void SimilarViewManager::handleSimilarReady () { sender ()->deleteLater (); auto obj = qobject_cast<Media::IPendingSimilarArtists*> (sender ()); const auto& similar = obj->GetSimilar (); SetInfos (similar); }
void RecommendationsWidget::handleGotRecs () { auto pending = qobject_cast<Media::IPendingSimilarArtists*> (sender ()); if (!pending) { qWarning () << Q_FUNC_INFO << "not a pending sender" << sender (); return; } const auto& similars = pending->GetSimilar (); RecView_->SetSimilarArtists (similars); }
void RecommendationsWidget::InitializeProviders () { const auto& provs = Core::Instance ().GetProxy ()->GetPluginsManager ()-> GetAllCastableTo<Media::IRecommendedArtists*> (); for (auto prov : provs) { const auto pending = prov->RequestRecommended (10); new Util::SlotClosure<Util::DeleteLaterPolicy> { [this, pending] { HandleInfos (pending->GetSimilar ()); }, pending->GetQObject (), SIGNAL (ready ()), pending->GetQObject () }; } }
//------------------------------------------------------------------------------------------------- int CFaceClusters::FaceClusters(int *iface, float th, float tl, int metric) { float *fmat = new float[num*num]; float *fvec = new float[num]; bool *bvec = new bool[num]; int *hist = new int[num]; int i, j, k; for(i=0; i<num; i++) { float *xi = dat+i*dim; for(j=0; j<i; j++) { float *xj = dat+j*dim; float f = GetSimilar(dim, xi, xj, metric); fmat[i*num+j] = fmat[j*num+i] = f;//max(0, f-0.5f); } fmat[i*num+i] = 0; } for(i=0; i<num; i++) { float sum = 0; for(j=0; j<num; j++) if(fmat[i*num+j]>th) sum++; //for(j=0; j<num; j++) sum += fmat[i*num+j]; // 1 fvec[i] = sum; iface[i] = -1; } k = 1; while(true) { float fmax = -1; for(i=0; i<num; i++) if(iface[i]==-1 && fmax<fvec[i]) fmax = fvec[i], j = i; if(fmax==-1) break; //if(fmax<t) printf("%f\n", fmax); //iface[j] = k; if(fmax>0) { iface[j] = k; // find neighbors for(i=0; i<num; i++) if(iface[i]==-1 && fmat[j*num+i]>th) iface[i] = k; // remove unbelievable for(i=0; i<num; i++) { bvec[i] = false; if(i!=j && iface[i]==k) { int num1 = 0, num2 = 0; float *p = fmat+i*num; for(int l=0; l<num; l++) { if(p[l]>th) { num1++; if(iface[l]==k) num2++; } } if(num2<0.6*num1) bvec[i] = true; } } for(i=0; i<num; i++) if(bvec[i]) iface[i] = -1; int numk = 0; for(i=0; i<num; i++) if(iface[i]==k) numk++; if(numk>1) k++; else iface[j] = 0; } else iface[j] = 0; } for(k=0; k<num; k++) { if(iface[k]==0) { float fmax = 0, *p = fmat+k*num; int i0 = 0; for(i=0; i<num; i++) { if(iface[i]==0) continue; if(fmax<p[i]) fmax = p[i], i0 = i; } if(fmax>tl && fvec[k]<=1) iface[k] = iface[i0]; } } int maxid = 0; for(i=0; i<num; i++) if(maxid<iface[i]) maxid = iface[i]; for(i=0; i<num; i++) if(iface[i]==0) iface[i] = maxid++; PrintMsg(num, fmat, fvec, iface); delete []fmat; delete []fvec; delete []bvec; delete []hist; return k-1; }