void pdist_cosine(const double *X, double *dm, int m, int n, const double *norms) { int i, j; const double *u, *v; double *it = dm; for (i = 0; i < m; i++) { for (j = i + 1; j < m; j++, it++) { u = X + (n * i); v = X + (n * j); *it = cosine_distance(u, v, n, norms[i], norms[j]); } } }
void rank_for_vector(void *fv_pointer,size_t query_index, vector<vector<pair<size_t ,float>>> &results, size_t size_rows, size_t size_cols, size_t results_pos) { float similarities[NN]; size_t neighbors[NN]; vector<pair<size_t, float>> result(NN); for (int i = 0; i < NN; i++) similarities[i] = OVERFLOW_DISTANCE; if (float **feature_vectors = reinterpret_cast<float **>(fv_pointer)) { // timestamp_t t0 = get_timestamp(); for (size_t target_index = 0; target_index < size_rows; target_index++) { if (query_index != target_index) { // skipping itself float target_distance = cosine_distance(feature_vectors[query_index], feature_vectors[target_index], size_cols); if (target_distance >= similarities[NN - 1]) { float hold_similarity = target_distance; size_t hold_neighbor = target_index; // Rearrange neighbors for (size_t counter = 0; counter < NN; counter++) { if ((hold_similarity >= similarities[counter])) { float aux_distance = similarities[counter]; size_t aux_neighbor = neighbors[counter]; similarities[counter] = hold_similarity; neighbors[counter] = hold_neighbor; result[counter] = make_pair(hold_neighbor, hold_similarity); hold_similarity = aux_distance; hold_neighbor = aux_neighbor; } } } } } // timestamp_t t1 = get_timestamp(); // float secs = (t1 - t0) / 1000000.0L; // // cout << "Item Ranking:" << secs << endl; } // mtx.lock(); results[results_pos] = result; // mtx.unlock(); }
void cdist_cosine(const double *XA, const double *XB, double *dm, int mA, int mB, int n, const double *normsA, const double *normsB) { int i, j; const double *u, *v; double *it = dm; for (i = 0; i < mA; i++) { for (j = 0; j < mB; j++, it++) { u = XA + (n * i); v = XB + (n * j); *it = cosine_distance(u, v, n, normsA[i], normsB[j]); } } }