#ifndef FAISS_JACCARD_H
#define FAISS_JACCARD_H

#include <faiss/utils/hamming.h>

#include <stdint.h>

#include <faiss/utils/Heap.h>

/* The Jaccard distance type */
typedef float tadis_t;

namespace faiss {

    extern size_t jaccard_batch_size;

/** Return the k smallest Jaccard distances for a set of binary query vectors,
 * using a max heap.
 * @param a       queries, size ha->nh * ncodes
 * @param b       database, size nb * ncodes
 * @param nb      number of database vectors
 * @param ncodes  size of the binary codes (bytes)
 * @param ordered if != 0: order the results by decreasing distance
 *                (may be bottleneck for k/n > 0.01) */
    void jaccard_knn_hc (
            float_maxheap_array_t * ha,
            const uint8_t * a,
            const uint8_t * b,
            size_t nb,
            size_t ncodes,
            int ordered,
            ConcurrentBitsetPtr bitset = nullptr);

} //namespace faiss

#include <faiss/utils/jaccard-inl.h>

#endif //FAISS_JACCARD_H
