Skip to content
BitVecCosineSimilarity

BitVecCosineSimilarity

Description

Calculate cosine similarity between two bitvectors. Treats bitvectors as binary vectors and computes cosine of angle between them.

Parameters

Name Direction Description
bv1 in First bitvector
bv2 in Second bitvector

Usage example (from documentation)

  double similarity = BitVecCosineSimilarity(&bv1, &bv2);

Success

Returns the cosine similarity coefficient in [0.0, 1.0]. Neither operand is modified.

Failure

Returns 0.0 when either operand has no set bits (degenerate magnitude); the caller cannot distinguish that from a true zero coefficient.

Usage example (Cross-references)

Usage examples (Cross-references)
    }
    
    double BitVecCosineSimilarity(BitVec *bv1, BitVec *bv2) {
        ValidateBitVec(bv1);
        ValidateBitVec(bv2);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        WriteFmt("Testing BitVecCosineSimilarity basic functionality\n");
    
        BitVec bv1    = BitVecInit(ALLOCATOR_OF(&alloc));
        BitVecPush(&bv2, true);
    
        double similarity = BitVecCosineSimilarity(&bv1, &bv2);
        result            = result && (F64Abs(similarity - 1.0) < 0.001);
        BitVecPush(&bv2, true);
    
        similarity = BitVecCosineSimilarity(&bv1, &bv2);
        result     = result && (F64Abs(similarity - 0.0) < 0.001);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        WriteFmt("Testing BitVecCosineSimilarity edge cases\n");
    
        BitVec bv1    = BitVecInit(ALLOCATOR_OF(&alloc));
        BitVecPush(&bv2, false);
    
        double similarity = BitVecCosineSimilarity(&bv1, &bv2);
        result            = result && (similarity == 0.0);
        BitVecPush(&bv2, false);
    
        similarity = BitVecCosineSimilarity(&bv1, &bv2);
        result     = result && (similarity == 0.0);
        u64    hamming     = BitVecHammingDistance(&bv1, &bv2);
        double jaccard     = BitVecJaccardSimilarity(&bv1, &bv2);
        double cosine      = BitVecCosineSimilarity(&bv1, &bv2);
        u64    dot_prod    = BitVecDotProduct(&bv1, &bv2);
        double correlation = BitVecCorrelation(&bv1, &bv2);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        WriteFmt("Testing BitVecCosineSimilarity(NULL, bv2) - should fatal\n");
        BitVec bv2 = BitVecInit(ALLOCATOR_OF(&alloc));
        BitVecPush(&bv2, true);
        BitVec bv2 = BitVecInit(ALLOCATOR_OF(&alloc));
        BitVecPush(&bv2, true);
        BitVecCosineSimilarity(NULL, &bv2);
        BitVecDeinit(&bv2);
        DefaultAllocatorDeinit(&alloc);
        DefaultAllocator alloc = DefaultAllocatorInit();
    
        WriteFmt("Testing BitVecCosineSimilarity(bv1, NULL) - should fatal\n");
        BitVec bv1 = BitVecInit(ALLOCATOR_OF(&alloc));
        BitVecPush(&bv1, true);
        BitVec bv1 = BitVecInit(ALLOCATOR_OF(&alloc));
        BitVecPush(&bv1, true);
        BitVecCosineSimilarity(&bv1, NULL);
        BitVecDeinit(&bv1);
        DefaultAllocatorDeinit(&alloc);
Last updated on