Ramasuri Narayanam

59 papers A* 14A 7B 3Misc 3Journal 19Unranked 12
YearRankTypeTitle / Venue / Authors
2025 conf
EMNLP (Industry Track)
Chetan Sharma, Ramasuri Narayanam, Soumyabrata Pal, Kalidas Yeturu, Shiv Kumar Saini, Koyel Mukherjee
2025 A* conf
AAAI
Manisha Padala, Lokesh Nagalapatti, Atharv Tyagi, Ramasuri Narayanam, Shiv Kumar Saini
2025 J jnl
CoRR
Manisha Padala, Lokesh Nagalapatti, Atharv Tyagi, Ramasuri Narayanam, Shiv Kumar Saini
2024 J jnl
CoRR
Adit Jain, Soumyabrata Pal, Sunav Choudhary, Ramasuri Narayanam, Vikram Krishnamurthy
2023 A conf
ECAI
Arvindh Arun, Aakash Aanegola, Amul Agrawal, Ramasuri Narayanam, Ponnurangam Kumaraguru
2023 J jnl
CoRR
Arvindh Arun, Aakash Aanegola, Amul Agrawal, Ramasuri Narayanam, Ponnurangam Kumaraguru
2022 J jnl
Soc. Netw. Anal. Min.
Shweta Garg, Ramasuri Narayanam, Sambaran Bandyopadhyay
2022 A* conf
AAAI
Lokesh Nagalapatti, Ruhi Sharma Mittal, Ramasuri Narayanam
2021 conf
PAKDD (1)
Ritwik Chaudhuri, Kushal Mukherjee, Ramasuri Narayanam, Rohith Dwarakanath Vallam
2021 A* conf
AAAI
Lokesh Nagalapatti, Ramasuri Narayanam
2021 J jnl
CoRR
Lokesh Nagalapatti, Ramasuri Narayanam
2021 A* conf
ICDE
Eitan Farchi, Ramasuri Narayanam, Lokesh Nagalapatti
2019 J jnl
CoRR
Sambaran Bandyopadhyay, Anirban Biswas, M. Narasimha Murty, Ramasuri Narayanam
2019 A conf
AAMAS
Ritwik Chaudhuri, Kushal Mukherjee, Ramasuri Narayanam, Rohith Dwarakanath Vallam, Ayush Kumar, Antriksh Mathur, Shweta Garg, Sudhanshu Singh, Gyana R. Parija
2019 A* conf
IJCAI
Phani Raj Lolakapuri, Umang Bhaskar, Ramasuri Narayanam, Gyana R. Parija, Pankaj S. Dayama
2019 J jnl
CoRR
Phani Raj Lolakapuri, Umang Bhaskar, Ramasuri Narayanam, Gyana R. Parija, Pankaj S. Dayama
2019 A conf
AAMAS
Rohith Dwarakanath Vallam, Ramasuri Narayanam, Srikanth G. Tamilselvam, Nicholas Mattei, Sudhanshu S. Singh, Shweta Garg, Gyana R. Parija
2019 A conf
AAMAS
Rohith Dwarakanath Vallam, Sarthak Ahuja, Surya Shravan Kumar Sajja, Ritwik Chaudhuri, Rakesh Pimplikar, Kushal Mukherjee, Ramasuri Narayanam, Gyana R. Parija
2018 B conf
ICPR
Sambaran Bandyopadhyay, Ramasuri Narayanam, M. Narasimha Murty
2017 J jnl
CoRR
Sambaran Bandyopadhyay, M. Narasimha Murty, Ramasuri Narayanam
2017 J jnl
CoRR
Rakesh Rameshrao Pimplikar, Kushal Mukherjee, Gyana R. Parija, Harit Vishwakarma, Ramasuri Narayanam, Sarthak Ahuja, Rohith Dwarakanath Vallam, Ritwik Chaudhuri, Joydeep Mondal
2016 A* conf
EMNLP
Tanmoy Chakraborty, Ramasuri Narayanam
2016 J jnl
CoRR
Tanmoy Chakraborty, Ramasuri Narayanam
2016 A* conf
AAAI
Sambaran Bandyopadhyay, Ramasuri Narayanam, Pratyush Kumar, Sarvapali D. Ramchurn, Vijay Arya, Iskandarbin Petra
2016 A* conf
ICDE
Tanmoy Chakraborty, Ramasuri Narayanam
2016 conf
SocInf@IJCAI
Varun Gangal, Balaraman Ravindran, Ramasuri Narayanam
2016 J jnl
CoRR
Varun Gangal, Balaraman Ravindran, Ramasuri Narayanam
2016 A* conf
AAAI
Varun Gangal, Abhishek Narwekar, Balaraman Ravindran, Ramasuri Narayanam
2015 J jnl
Soc. Netw. Anal. Min.
Hemank Lamba, Ramasuri Narayanam
2015 J jnl
SIGecom Exch.
Tomasz P. Michalak, Talal Rahwan, Stefano Moretti, Ramasuri Narayanam, Oskar Skibski, Piotr L. Szczepanski, Michael J. Wooldridge
2015 A* conf
IJCAI
Sambaran Bandyopadhyay, Ramasuri Narayanam, Ramachandra Kota, Pg Mohammad Iskandarbin Pg Hj Petra, Zainul Charbiwala
2015 A* conf
ICDE
Tanmoy Chakraborty, Natwar Modani, Ramasuri Narayanam, Seema Nagar
2015 A conf
AAMAS
Ramakumar Pasumarthi, Ramasuri Narayanam, Balaraman Ravindran
2014 A conf
ECAI
Ramasuri Narayanam, Oskar Skibski, Hemank Lamba, Tomasz P. Michalak
2014 J jnl
Knowl. Inf. Syst.
Ramasuri Narayanam, Amit Anil Nanavati
2014 Misc conf
COMSNETS
Ramasuri Narayanam, Dinesh Garg, Hemank Lamba
2014 Misc conf
COMSNETS
Madhav V. Marathe, Y. Narahari, Ramasuri Narayanam
2013 conf
WISE (2)
Hemank Lamba, Ramasuri Narayanam
2013 A conf
MSR
Senthil Mani, Seema Nagar, Debdoot Mukherjee, Ramasuri Narayanam, Vibha Singhal Sinha, Amit Anil Nanavati
2013 A* conf
IJCAI
Tomasz P. Michalak, Talal Rahwan, Piotr L. Szczepanski, Oskar Skibski, Ramasuri Narayanam, Nicholas R. Jennings, Michael J. Wooldridge
2013 A* conf
IJCAI
Priyanka Agrawal, Vikas K. Garg, Ramasuri Narayanam
2013 conf
CASE
Rohith Dwarakanath Vallam, C. A. Subramanian, Yadati Narahari, Ramasuri Narayanam, Srinath Narasimha
2012 conf
SRII Global Conference
Ramasuri Narayanam
2012 B conf
ICPR
Ramasuri Narayanam, Yadati Narahari
2012 J jnl
CoRR
Rohith Dwarakanath Vallam, C. A. Subramanian, Ramasuri Narayanam, Yadati Narahari, Srinath Narasimha
2012 conf
ECML/PKDD (2)
Ramasuri Narayanam, Amit Anil Nanavati
2011 J jnl
IEEE Trans Autom. Sci. Eng.
Ramasuri Narayanam, Yadati Narahari
2011 conf
WWW (Companion Volume)
Yadati Narahari, Ramasuri Narayanam
2011 Misc conf
COMAD
Sameep Mehta, Ramasuri Narayanam, Vinayaka Pandit
2011 J jnl
Soc. Networks
Ramasuri Narayanam, Y. Narahari
2009 J jnl
CoRR
Ramasuri Narayanam, Y. Narahari
2009 book
Y. Narahari, Dinesh Garg, Ramasuri Narayanam, V. Hastagiri Prakash
2009 B conf
CEC
Ramasuri Narayanam, Y. Narahari
2008 conf
IEEE SCC (1)
Prasad M. Deshpande, Dinesh Garg, Ramasuri Narayanam
2008 J jnl
IEEE J. Sel. Areas Commun.
Ramasuri Narayanam, Y. Narahari
2008 conf
AAMAS (3)
Ramasuri Narayanam, Y. Narahari
2007 conf
PKDD
Ramasuri Narayanam, V. Santosh Srinivas, M. Narasimha Murty
2007 conf
COMSWARE
Ramasuri Narayanam, Y. Narahari
2006 A* conf
INFOCOM
Ramasuri Narayanam
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