Karthik Sridharan

131 papers A* 42A 5B 3C 1Journal 63Unranked 17
YearRankTypeTitle / Venue / Authors
2026 J jnl
CoRR
Daniel Yiming Cao, August Y. Chen, Karthik Sridharan, Yuchen Wu
2025 J jnl
CoRR
Atul Ganju, Shashaank Aiyer, Ved Sriraman, Karthik Sridharan
2025 J jnl
CoRR
Daniel Yiming Cao, August Y. Chen, Karthik Sridharan, Benjamin Tang
2025 A* conf
ICML
Karthik Sridharan, Seung Won Wilson Yoo
2025 A* conf
COLT
August Y. Chen, Karthik Sridharan
2025 A* conf
ICML
Linda Lu, Ayush Sekhari, Karthik Sridharan
2025 J jnl
CoRR
Linda Lu, Ayush Sekhari, Karthik Sridharan
2024 J jnl
CoRR
August Y. Chen, Karthik Sridharan
2024 J jnl
CoRR
August Y. Chen, Ayush Sekhari, Karthik Sridharan
2024 J jnl
CoRR
Karthik Sridharan, Seung Won Wilson Yoo
2023 J jnl
CoRR
Ayush Sekhari, Karthik Sridharan, Wen Sun, Runzhe Wu
2023 A* conf
NeurIPS
Ayush Sekhari, Karthik Sridharan, Wen Sun, Runzhe Wu
2023 A* conf
NeurIPS
Ayush Sekhari, Karthik Sridharan, Wen Sun, Runzhe Wu
2023 J jnl
CoRR
Ayush Sekhari, Karthik Sridharan, Wen Sun, Runzhe Wu
2022 A* conf
NeurIPS
Christopher De Sa, Satyen Kale, Jason D. Lee, Ayush Sekhari, Karthik Sridharan
2022 J jnl
CoRR
Satyen Kale, Jason D. Lee, Chris De Sa, Ayush Sekhari, Karthik Sridharan
2022 A* conf
ICML
Christoph Dann, Yishay Mansour, Mehryar Mohri, Ayush Sekhari, Karthik Sridharan
2022 J jnl
CoRR
Christoph Dann, Yishay Mansour, Mehryar Mohri, Ayush Sekhari, Karthik Sridharan
2022 A* conf
NeurIPS
Dylan J. Foster, Alexander Rakhlin, Ayush Sekhari, Karthik Sridharan
2022 J jnl
CoRR
Dylan J. Foster, Alexander Rakhlin, Ayush Sekhari, Karthik Sridharan
2022 J jnl
Math. Oper. Res.
Thodoris Lykouris, Karthik Sridharan, Éva Tardos
2021 A* conf
NeurIPS
Ayush Sekhari, Christoph Dann, Mehryar Mohri, Yishay Mansour, Karthik Sridharan
2021 J jnl
CoRR
Christoph Dann, Yishay Mansour, Mehryar Mohri, Ayush Sekhari, Karthik Sridharan
2021 A* conf
NeurIPS
Ayush Sekhari, Karthik Sridharan, Satyen Kale
2021 J jnl
CoRR
Satyen Kale, Ayush Sekhari, Karthik Sridharan
2020 A* conf
NeurIPS
Kush Bhatia, Karthik Sridharan
2020 J jnl
CoRR
Kush Bhatia, Karthik Sridharan
2020 A* conf
NeurIPS
Christoph Dann, Yishay Mansour, Mehryar Mohri, Ayush Sekhari, Karthik Sridharan
2020 J jnl
CoRR
Christoph Dann, Yishay Mansour, Mehryar Mohri, Ayush Sekhari, Karthik Sridharan
2020 A* conf
COLT
Yossi Arjevani, Yair Carmon, John C. Duchi, Dylan J. Foster, Ayush Sekhari, Karthik Sridharan
2020 J jnl
CoRR
Yossi Arjevani, Yair Carmon, John C. Duchi, Dylan J. Foster, Ayush Sekhari, Karthik Sridharan
2019 A* conf
ICML
Jayadev Acharya, Chris De Sa, Dylan J. Foster, Karthik Sridharan
2019 J jnl
CoRR
Jayadev Acharya, Christopher De Sa, Dylan J. Foster, Karthik Sridharan
2019 A* conf
NeurIPS
Dylan J. Foster, Spencer Greenberg, Satyen Kale, Haipeng Luo, Mehryar Mohri, Karthik Sridharan
2019 J jnl
CoRR
Dylan J. Foster, Spencer Greenberg, Satyen Kale, Haipeng Luo, Mehryar Mohri, Karthik Sridharan
2019 J jnl
J. Mach. Learn. Res.
Andrew Cotter, Heinrich Jiang, Maya R. Gupta, Serena Lutong Wang, Taman Narayan, Seungil You, Karthik Sridharan
2019 A* conf
COLT
Dylan J. Foster, Ayush Sekhari, Ohad Shamir, Nathan Srebro, Karthik Sridharan, Blake E. Woodworth
2019 J jnl
CoRR
Dylan J. Foster, Ayush Sekhari, Ohad Shamir, Nathan Srebro, Karthik Sridharan, Blake E. Woodworth
2019 A* conf
ICML
Andrew Cotter, Maya R. Gupta, Heinrich Jiang, Nathan Srebro, Karthik Sridharan, Serena Lutong Wang, Blake E. Woodworth, Seungil You
2019 B conf
ALT
Andrew Cotter, Heinrich Jiang, Karthik Sridharan
2018 B ed.
ALT
Firdaus Janoos, Mehryar Mohri, Karthik Sridharan
2018 A conf
AISTATS
Dylan J. Foster, Karthik Sridharan, Daniel Reichman
2018 A* conf
COLT
Dylan J. Foster, Satyen Kale, Haipeng Luo, Mehryar Mohri, Karthik Sridharan
2018 J jnl
CoRR
Dylan J. Foster, Satyen Kale, Haipeng Luo, Mehryar Mohri, Karthik Sridharan
2018 A* conf
COLT
Dylan J. Foster, Alexander Rakhlin, Karthik Sridharan
2018 J jnl
CoRR
Dylan J. Foster, Alexander Rakhlin, Karthik Sridharan
2018 J jnl
CoRR
Andrew Cotter, Heinrich Jiang, Serena Lutong Wang, Taman Narayan, Maya R. Gupta, Seungil You, Karthik Sridharan
2018 J jnl
CoRR
Dylan J. Foster, Satyen Kale, Mehryar Mohri, Karthik Sridharan
2018 A* conf
COLT
Thodoris Lykouris, Karthik Sridharan, Éva Tardos
2018 J jnl
CoRR
Andrew Cotter, Maya R. Gupta, Heinrich Jiang, Nathan Srebro, Karthik Sridharan, Serena Lutong Wang, Blake E. Woodworth, Seungil You
2018 J jnl
CoRR
Andrew Cotter, Heinrich Jiang, Karthik Sridharan
2018 A* conf
NeurIPS
Dylan J. Foster, Ayush Sekhari, Karthik Sridharan
2018 J jnl
CoRR
Dylan J. Foster, Ayush Sekhari, Karthik Sridharan
2017 A conf
AISTATS
Alexander Rakhlin, Karthik Sridharan
2017 J jnl
CoRR
Dylan J. Foster, Daniel Reichman, Karthik Sridharan
2017 A* conf
COLT
Alexander Rakhlin, Karthik Sridharan
2017 conf
NIPS
Dylan J. Foster, Satyen Kale, Mehryar Mohri, Karthik Sridharan
2017 J jnl
CoRR
Thodoris Lykouris, Karthik Sridharan, Éva Tardos
2017 A* conf
COLT
Dylan J. Foster, Alexander Rakhlin, Karthik Sridharan
2017 J jnl
CoRR
Dylan J. Foster, Alexander Rakhlin, Karthik Sridharan
2016 J jnl
CoRR
Alexander Rakhlin, Karthik Sridharan
2016 A* conf
ICML
Alexander Rakhlin, Karthik Sridharan
2016 J jnl
CoRR
Alexander Rakhlin, Karthik Sridharan
2016 conf
NIPS
Zeyuan Allen Zhu, Yang Yuan, Karthik Sridharan
2016 J jnl
CoRR
Zeyuan Allen Zhu, Yang Yuan, Karthik Sridharan
2016 J jnl
CoRR
Dylan J. Foster, Zhiyuan Li, Thodoris Lykouris, Karthik Sridharan, Éva Tardos
2016 conf
NIPS
Dylan J. Foster, Zhiyuan Li, Thodoris Lykouris, Karthik Sridharan, Éva Tardos
2016 A conf
AISTATS
Matt J. Kusner, Yu Sun, Karthik Sridharan, Kilian Q. Weinberger
2015 conf
NIPS
Dylan J. Foster, Alexander Rakhlin, Karthik Sridharan
2015 J jnl
CoRR
Dylan J. Foster, Alexander Rakhlin, Karthik Sridharan
2015 A* conf
COLT
Alexander Rakhlin, Karthik Sridharan
2015 J jnl
CoRR
Alexander Rakhlin, Karthik Sridharan
2015 A* conf
COLT
Tengyuan Liang, Alexander Rakhlin, Karthik Sridharan
2015 J jnl
CoRR
Tengyuan Liang, Alexander Rakhlin, Karthik Sridharan
2015 J jnl
CoRR
Alexander Rakhlin, Karthik Sridharan
2015 J jnl
CoRR
Alexander Rakhlin, Karthik Sridharan
2015 A conf
AISTATS
Ali Jadbabaie, Alexander Rakhlin, Shahin Shahrampour, Karthik Sridharan
2015 J jnl
CoRR
Ali Jadbabaie, Alexander Rakhlin, Shahin Shahrampour, Karthik Sridharan
2015 J jnl
J. Mach. Learn. Res.
Alexander Rakhlin, Karthik Sridharan, Ambuj Tewari
2015 J jnl
CoRR
Alexander Rakhlin, Karthik Sridharan
2014 A* conf
COLT
Alexander Rakhlin, Karthik Sridharan
2014 J jnl
CoRR
Alexander Rakhlin, Karthik Sridharan
2013 J jnl
CoRR
Wei Han, Alexander Rakhlin, Karthik Sridharan
2013 A* conf
COLT
Wei Han, Alexander Rakhlin, Karthik Sridharan
2013 J jnl
CoRR
Alexander Rakhlin, Karthik Sridharan, Alexandre B. Tsybakov
2013 A conf
AISTATS
Alexander Rakhlin, Ohad Shamir, Karthik Sridharan
2013 B conf
ITW
Alexander Rakhlin, Karthik Sridharan
2013 A* conf
COLT
Alexander Rakhlin, Karthik Sridharan
2013 conf
NIPS
Alexander Rakhlin, Karthik Sridharan
2013 J jnl
CoRR
Alexander Rakhlin, Karthik Sridharan
2012 J jnl
CoRR
Karthik Sridharan
2012 A* conf
ICML
Alexander Rakhlin, Ohad Shamir, Karthik Sridharan
2012 A* conf
ICML
Shai Ben-David, David Loker, Nathan Srebro, Karthik Sridharan
2012 J jnl
CoRR
Alexander Rakhlin, Karthik Sridharan
2012 J jnl
CoRR
Alexander Rakhlin, Ohad Shamir, Karthik Sridharan
2012 conf
NIPS
Alexander Rakhlin, Ohad Shamir, Karthik Sridharan
2012 J jnl
J. Mach. Learn. Res.
Ofer Dekel, Claudio Gentile, Karthik Sridharan
2011 J jnl
CoRR
Andrew Cotter, Ohad Shamir, Nathan Srebro, Karthik Sridharan
2011 conf
NIPS
Andrew Cotter, Ohad Shamir, Nati Srebro, Karthik Sridharan
2011 A* conf
COLT
Dean P. Foster, Alexander Rakhlin, Karthik Sridharan, Ambuj Tewari
2011 J jnl
SIAM J. Comput.
Shai Shalev-Shwartz, Ohad Shamir, Karthik Sridharan
2011 A* conf
IJCAI
Shai Shalev-Shwartz, Ohad Shamir, Karthik Sridharan
2011 J jnl
CoRR
Nathan Srebro, Karthik Sridharan, Ambuj Tewari
2011 conf
NIPS
Nati Srebro, Karthik Sridharan, Ambuj Tewari
2011 A* conf
COLT
Alexander Rakhlin, Karthik Sridharan, Ambuj Tewari
2011 J jnl
CoRR
Alexander Rakhlin, Karthik Sridharan, Ambuj Tewari
2011 conf
NIPS
Alexander Rakhlin, Karthik Sridharan, Ambuj Tewari
2010 A* conf
COLT
Karthik Sridharan, Ambuj Tewari
2010 J jnl
J. Mach. Learn. Res.
Shai Shalev-Shwartz, Ohad Shamir, Nathan Srebro, Karthik Sridharan
2010 J jnl
CoRR
Shai Shalev-Shwartz, Ohad Shamir, Karthik Sridharan
2010 A* conf
COLT
Shai Shalev-Shwartz, Ohad Shamir, Karthik Sridharan
2010 J jnl
CoRR
Alexander Rakhlin, Karthik Sridharan, Ambuj Tewari
2010 J jnl
CoRR
Alexander Rakhlin, Karthik Sridharan, Ambuj Tewari
2010 conf
NIPS
Alexander Rakhlin, Karthik Sridharan, Ambuj Tewari
2010 A* conf
COLT
Ofer Dekel, Claudio Gentile, Karthik Sridharan
2010 conf
NIPS
Nathan Srebro, Karthik Sridharan, Ambuj Tewari
2010 J jnl
CoRR
Nathan Srebro, Karthik Sridharan, Ambuj Tewari
2009 A* conf
COLT
Shai Shalev-Shwartz, Ohad Shamir, Nathan Srebro, Karthik Sridharan
2009 J jnl
CoRR
Sham M. Kakade, Ohad Shamir, Karthik Sridharan, Ambuj Tewari
2009 A* conf
ICML
Kamalika Chaudhuri, Sham M. Kakade, Karen Livescu, Karthik Sridharan
2009 A* conf
COLT
Shai Shalev-Shwartz, Ohad Shamir, Nathan Srebro, Karthik Sridharan
2009 A* conf
COLT
Shai Shalev-Shwartz, Ohad Shamir, Karthik Sridharan
2008 A* conf
COLT
Karthik Sridharan, Sham M. Kakade
2008 conf
NIPS
Karthik Sridharan, Shai Shalev-Shwartz, Nathan Srebro
2008 conf
NIPS
Sham M. Kakade, Karthik Sridharan, Ambuj Tewari
2006 J jnl
Intell. Data Anal.
K. G. Srinivasa, Karthik Sridharan, P. Deepa Shenoy, K. R. Venugopal, Lalit M. Patnaik
2006 conf
ICPR (2)
Karthik Sridharan, Matthew J. Beal, Venu Govindaraju
2006 conf
ICPR (2)
Faisal Farooq, Karthik Sridharan, Venu Govindaraju
2005 C conf
IDEAL
K. G. Srinivasa, Karthik Sridharan, P. Deepa Shenoy, K. R. Venugopal, Lalit M. Patnaik
2005 conf
AVBPA
Karthik Sridharan, Sankalp Nayak, Sharat Chikkerur, Venu Govindaraju
2005 conf
AutoID
Karthik Sridharan, Venu Govindaraju
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