Rangachar Kasturi

134 papers A* 6A 10B 23C 1Misc 1Journal 56Unranked 35
YearRankTypeTitle / Venue / Authors
2022 J jnl
IEEE Trans. Affect. Comput.
Ghada Zamzmi, Chih-Yun Pai, Dmitry B. Goldgof, Rangachar Kasturi, Terri Ashmeade, Yu Sun
2021 J jnl
Comput. Biol. Medicine
Md Sirajus Salekin, Ghada Zamzmi, Dmitry B. Goldgof, Rangachar Kasturi, Thao Ho, Yu Sun
2020 J jnl
CoRR
Md Sirajus Salekin, Ghada Zamzmi, Dmitry B. Goldgof, Rangachar Kasturi, Thao Ho, Yu Sun
2020 B conf
FG
Md Sirajus Salekin, Ghada Zamzmi, Dmitry B. Goldgof, Rangachar Kasturi, Thao Ho, Yu Sun
2020 J jnl
CoRR
Md Sirajus Salekin, Ghada Zamzmi, Dmitry B. Goldgof, Rangachar Kasturi, Thao Ho, Yu Sun
2019 J jnl
IEEE Trans. Biom. Behav. Identity Sci.
Ghada Zamzmi, Rahul Paul, Md Sirajus Salekin, Dmitry B. Goldgof, Rangachar Kasturi, Thao Ho, Yu Sun
2019 J jnl
CoRR
Md Sirajus Salekin, Ghada Zamzmi, Rahul Paul, Dmitry B. Goldgof, Rangachar Kasturi, Thao Ho, Yu Sun
2019 B conf
SMC
Md Sirajus Salekin, Ghada Zamzmi, Dmitry B. Goldgof, Rangachar Kasturi, Thao Ho, Yu Sun
2019 J jnl
CoRR
Md Sirajus Salekin, Ghada Zamzmi, Dmitry B. Goldgof, Rangachar Kasturi, Thao Ho, Yu Sun
2019 B conf
IJCNN
Ghada Zamzmi, Rahul Paul, Dmitry B. Goldgof, Rangachar Kasturi, Yu Sun
2018 J jnl
CoRR
Ghada Zamzmi, Gabriel Ruiz, Matthew Shreve, Dmitry B. Goldgof, Rangachar Kasturi, Sudeep Sarkar
2018 J jnl
CoRR
Ghada Zamzmi, Dmitry B. Goldgof, Rangachar Kasturi, Yu Sun
2018 conf
UbiComp/ISWC Adjunct
Ghada Zamzmi, Dmitry B. Goldgof, Rangachar Kasturi, Yu Sun
2017 conf
SCIA (2)
Ghada Zamzmi, Chih-Yun Pai, Dmitry B. Goldgof, Rangachar Kasturi, Yu Sun, Terri Ashmeade
2016 J jnl
Pattern Recognit.
Ekambaram Rajmadhan, Sergiy Fefilatyev, Matthew Shreve, Kurt Kramer, Lawrence O. Hall, Dmitry B. Goldgof, Rangachar Kasturi
2016 B conf
ICPR
Ghada Zamzmi, Chih-Yun Pai, Dmitry B. Goldgof, Rangachar Kasturi, Terri Ashmeade, Yu Sun
2016 conf
ECCV Workshops (3)
Mona Fathollahi, Rangachar Kasturi
2016 J jnl
CoRR
Mona Fathollahi, Rangachar Kasturi
2016 conf
3DV
Mona Fathollahi Ghezelghieh, Rangachar Kasturi, Sudeep Sarkar
2016 J jnl
CoRR
Mona Fathollahi Ghezelghieh, Rangachar Kasturi, Sudeep Sarkar
2016 J jnl
CoRR
Ghada Zamzmi, Chih-Yun Pai, Dmitry B. Goldgof, Rangachar Kasturi, Yu Sun, Terri Ashmeade
2015 B conf
FG
Ghada Zamzmi, Gabriel Ruiz, Dmitry B. Goldgof, Rangachar Kasturi, Yu Sun, Terri Ashmeade
2014 J jnl
IEEE Trans. Image Process.
Jing Zhang, Rangachar Kasturi
2014 B conf
ICPR
Rangachar Kasturi, Dmitry B. Goldgof, Ekambaram Rajmadhan, Gill A. Pratt, Eric Krotkov, Douglas Hackett, Yang Ran, Qinfen Zheng, Rajeev Sharma, Mark Anderson, Mark Peot, Mario Aguilar, Deepak Khosla, Yang Chen, Kyungnam Kim, Lior Elazary, Randolph C. Voorhies, Daniel F. Parks, Laurent Itti
2014 C conf
CIARP
Rangachar Kasturi, Ekambaram Rajmadhan
2013 conf
CBDAR
Jing Zhang, Rangachar Kasturi
2012 B conf
ICPR
Sergiy Fefilatyev, Matthew Shreve, Kurt Kramer, Lawrence O. Hall, Dmitry B. Goldgof, Rangachar Kasturi, Kendra Daly, Andrew Remsen, Horst Bunke
2011 conf
ICDM Workshops
Sergiy Fefilatyev, Kurt Kramer, Lawrence O. Hall, Dmitry B. Goldgof, Rangachar Kasturi, Andrew Remsen, Kendra Daly
2010 conf
ACCV (2)
Jing Zhang, Rangachar Kasturi
2010 B conf
ICPR
Joshua Candamo, Dmitry B. Goldgof, Rangachar Kasturi, Sridhar Godavarthy
2010 B conf
ICPR
Jing Zhang, Rangachar Kasturi
2010 J jnl
IEEE Trans. Intell. Transp. Syst.
Joshua Candamo, Matthew Shreve, Dmitry B. Goldgof, Deborah B. Sapper, Rangachar Kasturi
2010 B conf
ICPR
Jing Zhang, Rangachar Kasturi
2009 J jnl
IEEE Trans. Pattern Anal. Mach. Intell.
Rangachar Kasturi, Dmitry B. Goldgof, Padmanabhan Soundararajan, Vasant Manohar, John S. Garofolo, Rachel Bowers, Matthew Boonstra, Valentina N. Korzhova, Jing Zhang
2008 J jnl
Computer
Rangachar Kasturi
2008 B conf
ICPR
Jing Zhang, Dmitry B. Goldgof, Rangachar Kasturi
2008 B conf
ICPR
Himanshu Vajaria, Sudeep Sarkar, Rangachar Kasturi
2008 J jnl
IEEE Trans. Circuits Syst. Video Technol.
Himanshu Vajaria, Sudeep Sarkar, Rangachar Kasturi
2008 J jnl
Image Vis. Comput.
Junghye Min, Rangachar Kasturi, Octavia I. Camps
2008 B conf
Document Analysis Systems
Jing Zhang, Rangachar Kasturi
2008 B conf
ICPR
Rangachar Kasturi, Noah Sulman, Thomas A. Sanocki, Dmitry B. Goldgof
2008 J jnl
Computer
Rangachar Kasturi, Carl K. Chang
2008 J jnl
IEEE Trans. Inf. Forensics Secur.
Pranab K. Mohanty, Sudeep Sarkar, Rangachar Kasturi, P. Jonathon Phillips
2007 J jnl
Pattern Recognit. Lett.
Himanshu Vajaria, Tanmoy Islam, Pranab K. Mohanty, Sudeep Sarkar, Ravi Sankar, Rangachar Kasturi
2007 J jnl
IEEE Trans. Pattern Anal. Mach. Intell.
Pranab K. Mohanty, Sudeep Sarkar, Rangachar Kasturi
2006 conf
ICPR (4)
Pranab K. Mohanty, Sudeep Sarkar, Rangachar Kasturi
2006 conf
ICPR (2)
Himanshu Vajaria, Tanmoy Islam, Sudeep Sarkar, Ravi Sankar, Rangachar Kasturi
2006 conf
ICVGIP
Padmanabhan Soundararajan, Matthew Boonstra, Vasant Manohar, Valentina N. Korzhova, Dmitry B. Goldgof, Rangachar Kasturi, Shubha Prasad, Harish Raju, Rachel Bowers, John S. Garofolo
2006 conf
ACCV (2)
Vasant Manohar, Padmanabhan Soundararajan, Harish Raju, Dmitry B. Goldgof, Rangachar Kasturi, John S. Garofolo
2006 B conf
Document Analysis Systems
Vasant Manohar, Padmanabhan Soundararajan, Matthew Boonstra, Harish Raju, Dmitry B. Goldgof, Rangachar Kasturi, John S. Garofolo
2006 J jnl
IEEE Trans. Image Process.
Tarak Gandhi, Mau-Tsuen Yang, Rangachar Kasturi, Octavia I. Camps, Lee D. Coraor, Jeffrey McCandless
2006 conf
CVPR Workshops
Pranab K. Mohanty, Sudeep Sarkar, Rangachar Kasturi
2005 conf
CVPR Workshops
Pranab K. Mohanty, Sudeep Sarkar, Rangachar Kasturi
2004 conf
ICPR (4)
Junghye Min, Rangachar Kasturi
2004 conf
CVPR Workshops
Junghye Min, Rangachar Kasturi
2004 conf
CVPR (2)
Jin Hyeong Park, Zhenyue Zhang, Hongyuan Zha, Rangachar Kasturi
2004 conf
ECCV (4)
Jin Hyeong Park, Hongyuan Zha, Rangachar Kasturi
2004 conf
ICPR (4)
Jin Hyeong Park, Xiang Ji, Hongyuan Zha, Rangachar Kasturi
2003 J jnl
IEEE Trans. Parallel Distributed Syst.
Mau-Tsuen Yang, Rangachar Kasturi, Anand Sivasubramaniam
2003 A conf
ICDAR
Rangachar Kasturi
2003 conf
SCIA
Junghye Min, Jin Hyeong Park, Rangachar Kasturi
2003 J jnl
Int. J. Document Anal. Recognit.
David J. Crandall, Sameer K. Antani, Rangachar Kasturi
2002 J jnl
Pattern Recognit.
Sameer K. Antani, Rangachar Kasturi, Ramesh C. Jain
2002 J jnl
IEEE Trans. Instrum. Meas.
Srivatsan Chakravarthy, Rajeev Sharma, Rangachar Kasturi
2002 conf
ICPR (3)
Vladimir Y. Mariano, Junghye Min, Jin Hyeong Park, Rangachar Kasturi, David Mihalcik, Huiping Li, David S. Doermann, Thomas Drayer
2002 J jnl
Real Time Imaging
Mau-Tsuen Yang, Tarak Gandhi, Rangachar Kasturi, Lee D. Coraor, Octavia I. Camps, Jeffrey McCandless
2002 J jnl
IEEE Trans. Mob. Comput.
Rangachar Kasturi
2001 A conf
IPDPS
Mau-Tsuen Yang, Rangachar Kasturi, Anand Sivasubramaniam
2001 A conf
ICDAR
David J. Crandall, Rangachar Kasturi
2000 B conf
ICPR
Tarak Gandhi, Rangachar Kasturi, Sameer K. Antani
2000 A* conf
CVPR
Tarak Gandhi, Mau-Tsuen Yang, Rangachar Kasturi, Octavia I. Camps, Lee D. Coraor, Jeffrey McCandless
2000 J jnl
Image Vis. Comput.
Tarak Gandhi, Sadashiva Devadiga, Rangachar Kasturi, Octavia I. Camps
2000 B conf
ICPR
Vladimir Y. Mariano, Rangachar Kasturi
2000 J jnl
IEEE Trans. Circuits Syst. Video Technol.
Ullas Gargi, Rangachar Kasturi, Susan H. Strayer
2000 B conf
ICPR
Sameer K. Antani, David J. Crandall, Rangachar Kasturi
2000 J jnl
IEEE Trans. Pattern Anal. Mach. Intell.
Kevin W. Bowyer, Patrick J. Flynn, Rangachar Kasturi
1999 A conf
ICDAR
Ullas Gargi, David J. Crandall, Sameer K. Antani, Tarak Gandhi, Ryan Keener, Rangachar Kasturi
1999 J jnl
Int. J. Document Anal. Recognit.
Pierre M. Devaux, Daniel B. Lysak, Rangachar Kasturi
1998 B conf
ICPR
Ullas Gargi, Sameer K. Antani, Rangachar Kasturi
1998 conf
SSPR/SPR
Sameer K. Antani, Rangachar Kasturi, Ramesh C. Jain
1998 A* conf
CVPR
Ullas Gargi, Rangachar Kasturi, Sameer K. Antani
1998 B conf
ICPR
Peter Tofani, Rangachar Kasturi
1998 A* conf
CVPR
Ullas Gargi, Sameer K. Antani, Rangachar Kasturi
1997 J jnl
IEEE Trans. Pattern Anal. Mach. Intell.
Rangachar Kasturi
1997 J jnl
Mach. Vis. Appl.
Juan F. Arias, Rangachar Kasturi
1997 conf
GREC
Huizhu Luo, Rangachar Kasturi
1997 A conf
ICDAR
Huizhu Luo, Rangachar Kasturi, Juan F. Arias, Atul K. Chhabra
1997 conf
BSDIA
Rangachar Kasturi, Huizhu Luo
1996 B conf
ICPR
David A. Kosiba, Rangachar Kasturi
1996 A conf
WACV
Tarak Gandhi, Sadashiva Devadiga, Rangachar Kasturi, Octavia I. Camps
1996 B conf
DAS
Juan F. Arias, Rangachar Kasturi, Atul K. Chhabra
1996 ed.
GREC
Rangachar Kasturi, Karl Tombre
1996 J jnl
Int. J. Imaging Syst. Technol.
Surekha Chandran, Sanjay Balasubramanian, Tarak Gandhi, Arathi Prasad, Rangachar Kasturi, Atul K. Chhabra
1996 J jnl
Mach. Vis. Appl.
Yuan-Liang Tang, Rangachar Kasturi
1995 conf
GREC
Bin Kong, Ihsin T. Phillips, Robert M. Haralick, Arathi Prasad, Rangachar Kasturi
1995 J jnl
IEEE Trans. Pattern Anal. Mach. Intell.
Rangachar Kasturi
1995 A conf
ICDAR
Juan F. Arias, Rangachar Kasturi, Atul K. Chhabra
1995 conf
Storage and Retrieval for Image and Video Databases (SPIE)
Ullas Gargi, S. Oswald, D. A. Koshiba, Sadashiva Devadiga, Rangachar Kasturi
1995 J jnl
IEEE Trans. Pattern Anal. Mach. Intell.
Ching-Yao Kao, Soundar R. T. Kumara, Rangachar Kasturi
1995 J jnl
Pattern Recognit. Lett.
Juan F. Arias, Chan Pyng Lai, Surekha Surya, Rangachar Kasturi, Atul K. Chhabra
1995 book
Machine vision.
Ramesh C. Jain, Rangachar Kasturi, Brian G. Schunck
1995 J jnl
Mach. Vis. Appl.
Rangachar Kasturi
1995 conf
Storage and Retrieval for Image and Video Databases (SPIE)
Sadashiva Devadiga, D. A. Koshiba, Ullas Gargi, S. Oswald, Rangachar Kasturi
1995 conf
GREC
Rangachar Kasturi, Karl Tombre
1995 J jnl
Pattern Recognit.
Daniel B. Lysak, Pierre M. Devaux, Rangachar Kasturi
1994 conf
ICPR (1)
David A. Kosiba, Pierre M. Devaux, Sanjay Balasubramanian, Tarak Gandhi, Rangachar Kasturi
1994 J jnl
IEEE Trans. Pattern Anal. Mach. Intell.
Chan Pyng Lai, Rangachar Kasturi
1994 conf
Document Recognition
Chan Pyng Lai, Rangachar Kasturi
1994 conf
Document Recognition
Sanjay Balasubramanian, Surekha Chandran, Juan F. Arias, Rangachar Kasturi, Atul K. Chhabra
1994 A* conf
CVPR
Juan F. Arias, Sanjay Balasubramanian, Arathi Prasad, Rangachar Kasturi, Atul K. Chhabra
1994 conf
ICPR (2)
Juan F. Arias, Arathi Prasad, Rangachar Kasturi, Atul K. Chhabra
1993 A conf
ICDAR
Chan Pyng Lai, Rangachar Kasturi
1993 J jnl
Mach. Vis. Appl.
Rangachar Kasturi, Lawrence O'Gorman
1993 A conf
ICDAR
Juan F. Arias, Chan Pyng Lai, Surekha Chandran, Rangachar Kasturi, Atul K. Chhabra
1993 A* conf
CVPR
Daniel B. Lysak, Rangachar Kasturi
1993 A conf
ICDAR
Surekha Chandran, Rangachar Kasturi
1992 J jnl
Computer
Lawrence O'Gorman, Rangachar Kasturi
1992 J jnl
Mach. Vis. Appl.
Rangachar Kasturi, Lawrence O'Gorman
1992 J jnl
Mach. Vis. Appl.
Rangachar Kasturi, Lawrence O'Gorman
1992 conf
ICPR (2)
Sudha U. Kumar, Rangachar Kasturi
1991 A* conf
CVPR
Chennubhotla S. Chakravarthy, Rangachar Kasturi
1990 J jnl
IEEE Trans. Pattern Anal. Mach. Intell.
Rangachar Kasturi, Sing T. Bow, Wassim El-Masri, Jayesh Shah, James R. Gattiker, Umesh B. Mokate
1990 conf
ICPR (1)
Daniel B. Lysak, Rangachar Kasturi
1990 Misc conf
MVA
Rangachar Kasturi, Senthil Siva, Lawrence O'Gorman
1990 conf
ICPR (1)
David Y. Amamoto, Rangachar Kasturi, Alexander Mamourian
1989 J jnl
Mach. Vis. Appl.
Ching-chuan Shih, Rangachar Kasturi
1989 J jnl
Computer
Rangachar Kasturi, Rodney Fernandez, Mukesh L. Amlani, Wu-chun Feng
1988 J jnl
IEEE Trans. Pattern Anal. Mach. Intell.
Lloyd A. Fletcher, Rangachar Kasturi
1988 B conf
ICPR
Rangachar Kasturi, Sing T. Bow, James R. Gattiker, Jayesh Shah, Wassim El-Masri, Umesh B. Mokate, Suresh Honnenahalli
1988 J jnl
IEEE Trans. Software Eng.
Rangachar Kasturi, Juan Alemany
1988 conf
RIAO
Mukesh L. Amlani, Rangachar Kasturi
1987 J jnl
IEEE Trans. Biomed. Eng.
James S. Mc Glone, Lyndon S. Hibbard, Richard A. Hawkins, Rangachar Kasturi
1985 J jnl
IEEE Trans. Syst. Man Cybern.
Rangachar Kasturi, John F. Walkup, Thomas F. Krile
1984 J jnl
Comput. Vis. Graph. Image Process.
Rangachar Kasturi, John F. Walkup, Thomas F. Krile
tests/unit/test_decompile_similarity.py
← Index tests/unit/test_decompile_similarity.py python
"""Unit tests for similarity modules:
- bninja/similarity/minhashcustom.py
- bninja/similarity/minhasher.py
"""
import numpy as np
import pytest

from redb.extractors.decompiler.bninja.similarity.minhashcustom import MinHashCustom
from redb.extractors.decompiler.bninja.analysis.low_level_normalization import LowLevelNormalization


# ============================================================================
# 2a. MinHashCustom
# ============================================================================

class TestMinHashCustomInit:
    def test_init_empty(self):
        mh = MinHashCustom()
        assert not mh.hasMinHash()
        assert mh.minhash == b""
        assert mh.minhash_int == []

    def test_init_from_signature(self):
        sig = [10, 20, 30, 40]
        mh = MinHashCustom(minhash_signature=sig)
        assert mh.hasMinHash()
        assert mh.minhash_int == sig

    def test_init_from_bytes_uint32(self):
        """Verify round-trip: ints -> bytes -> MinHashCustom -> ints."""
        sig = [100, 200, 300]
        packed = np.array(sig, dtype=np.uint32).tobytes()
        # np.frombuffer returns numpy scalars; setMinHash does % 2**32 which
        # overflows numpy uint32, so verify the raw bytes round-trip instead.
        raw_arr = np.frombuffer(packed, dtype=np.uint32)
        assert list(raw_arr) == sig

    def test_init_from_bytes_uint8(self):
        """Verify round-trip: ints -> bytes -> back."""
        sig = [10, 20, 30]
        packed = np.array(sig, dtype=np.uint8).tobytes()
        raw_arr = np.frombuffer(packed, dtype=np.uint8)
        assert list(raw_arr) == sig

    def test_init_both_raises(self):
        sig = [1, 2, 3]
        packed = np.array(sig, dtype=np.uint32).tobytes()
        with pytest.raises(ValueError, match="only one"):
            MinHashCustom(minhash_bytes=packed, minhash_signature=sig)


class TestMinHashCustomSetGet:
    def test_set_and_get_minhash(self):
        mh = MinHashCustom()
        sig = [5, 10, 15]
        mh.setMinHash(sig)
        raw = mh.getMinHash()
        assert raw == np.array(sig, dtype=np.uint32).tobytes()
        assert mh.getMinHashInt() == sig

    def test_minhash_int_truncation(self):
        mh = MinHashCustom(minhash_bits=8)
        # Values > 256 should be truncated mod 2^8
        mh.setMinHash([300, 500, 256])
        for val in mh.minhash_int:
            assert 0 <= val < 256


class TestMinHashCustomHashData:
    def test_hash_data_string(self):
        result = MinHashCustom.hashData("hello", 42)
        assert isinstance(result, int)
        assert 0 <= result <= 0xFFFFFFFF

    def test_hash_data_bytes(self):
        result = MinHashCustom.hashData(b"bytes", 42)
        assert isinstance(result, int)
        assert 0 <= result <= 0xFFFFFFFF

    def test_hash_data_list(self):
        result = MinHashCustom.hashData([1, 2, 3], 42)
        assert isinstance(result, int)
        assert 0 <= result <= 0xFFFFFFFF

    def test_hash_data_unsupported_type(self):
        with pytest.raises(NotImplementedError, match="Type not supported"):
            MinHashCustom.hashData(123, 42)

    def test_hash_data_deterministic(self):
        assert MinHashCustom.hashData("test", 7) == MinHashCustom.hashData("test", 7)


class TestMinHashCustomScore:
    def test_score_identical(self):
        sig = [1, 2, 3, 4, 5]
        mh1 = MinHashCustom(minhash_signature=sig)
        mh2 = MinHashCustom(minhash_signature=sig)
        score = MinHashCustom.calculateMinHashScore(
            mh1.getMinHash(), mh2.getMinHash()
        )
        assert score == 100.0

    def test_score_different(self):
        mh1 = MinHashCustom(minhash_signature=[1, 2, 3, 4, 5])
        mh2 = MinHashCustom(minhash_signature=[6, 7, 8, 9, 10])
        score = MinHashCustom.calculateMinHashScore(
            mh1.getMinHash(), mh2.getMinHash()
        )
        assert score < 100.0

    def test_score_against(self):
        sig1 = [1, 2, 3, 4, 5]
        sig2 = [1, 2, 99, 4, 5]
        mh1 = MinHashCustom(minhash_signature=sig1)
        mh2 = MinHashCustom(minhash_signature=sig2)
        instance_score = mh1.scoreAgainst(mh2)
        static_score = MinHashCustom.calculateMinHashScore(
            mh1.getMinHash(), mh2.getMinHash()
        )
        assert instance_score == static_score


class TestMinHashCustomBitModes:
    def test_8bit_mode(self):
        mh = MinHashCustom(minhash_bits=8)
        mh.setMinHash([10, 20, 30])
        raw = mh.getMinHash()
        arr = np.frombuffer(raw, dtype=np.uint8)
        assert list(arr) == [10, 20, 30]

    def test_32bit_mode(self):
        mh = MinHashCustom(minhash_bits=32)
        mh.setMinHash([10, 20, 30])
        raw = mh.getMinHash()
        arr = np.frombuffer(raw, dtype=np.uint32)
        assert list(arr) == [10, 20, 30]


# ============================================================================
# 2b. MinHasher
# ============================================================================


class MockILNode:
    """Mock IL node with operation and operands for normalization."""
    def __init__(self, operation, operands=None):
        self.operation = operation
        self.operands = operands or []


class MockLLILBasicBlock:
    """Mock LLIL basic block that yields IL instructions."""
    def __init__(self, instructions):
        self._instructions = instructions

    def __iter__(self):
        return iter(self._instructions)


class MockLLILFunction:
    """Mock LLIL function with basic blocks."""
    def __init__(self, basic_blocks):
        self.basic_blocks = basic_blocks


# Import MinHasher after we know the module can handle the import
from redb.extractors.decompiler.bninja.similarity.minhasher import (
    MinHasher,
    MINHASH_SIGNATURE_LENGTH,
    MINHASH_SIGNATURE_BITS,
)


class TestMinHasherMakeNgrams:
    def setup_method(self):
        # Create a minimal minhasher with a mock LLIL function
        empty_func = MockLLILFunction([])
        self.hasher = MinHasher(seed=42, il_function=empty_func)

    def test_make_ngrams_basic(self):
        result = self.hasher.make_ngrams(["a", "b", "c", "d"], n=3)
        assert result == [("a", "b", "c"), ("b", "c", "d")]

    def test_make_ngrams_short_input(self):
        result = self.hasher.make_ngrams(["a", "b"], n=3)
        assert result == []

    def test_make_ngrams_exact_n(self):
        result = self.hasher.make_ngrams(["a", "b", "c"], n=3)
        assert result == [("a", "b", "c")]


class TestMinHasherCalculate:
    def _make_llil_function(self, num_instructions=10):
        """Create a mock LLIL function with enough instructions."""
        instructions = [
            MockILNode(operation=i % 20) for i in range(num_instructions)
        ]
        bb = MockLLILBasicBlock(instructions)
        return MockLLILFunction([bb])

    def test_calculate_minhash_empty_function(self):
        # Function with < 3 LLIL instructions -> empty list
        func = self._make_llil_function(num_instructions=2)
        hasher = MinHasher(seed=42, il_function=func)
        result = hasher.calculateMinHash()
        assert result == []

    def test_calculate_minhash_deterministic(self):
        func = self._make_llil_function(num_instructions=20)
        h1 = MinHasher(seed=42, il_function=func)
        h2 = MinHasher(seed=42, il_function=func)
        assert h1.calculateMinHash() == h2.calculateMinHash()

    def test_calculate_minhash_length(self):
        func = self._make_llil_function(num_instructions=20)
        hasher = MinHasher(seed=42, il_function=func)
        result = hasher.calculateMinHash()
        assert len(result) == MINHASH_SIGNATURE_LENGTH

    def test_calculate_minhash_value_range(self):
        func = self._make_llil_function(num_instructions=20)
        hasher = MinHasher(seed=42, il_function=func)
        result = hasher.calculateMinHash()
        for val in result:
            assert 0 <= val < 2 ** MINHASH_SIGNATURE_BITS

    def test_shingle_hash_deterministic(self):
        func = self._make_llil_function(num_instructions=5)
        hasher = MinHasher(seed=42, il_function=func)
        shingle = ([1, 2], [3, 4], [5, 6])
        assert hasher.shingle_hash(shingle, 99) == hasher.shingle_hash(shingle, 99)

    def test_seed_reproducibility(self):
        func = self._make_llil_function(num_instructions=20)
        h1 = MinHasher(seed=1, il_function=func)
        h2 = MinHasher(seed=2, il_function=func)
        r1 = h1.calculateMinHash()
        r2 = h2.calculateMinHash()
        # Different seeds should (very likely) produce different results
        assert r1 != r2