Radoslaw P. Katarzyniak

63 papers A 1B 9C 2Misc 3Journal 10Unranked 34
YearRankTypeTitle / Venue / Authors
2022 B conf
KES
Wojciech A. Lorkiewicz, Mariusz Mulka, Radoslaw P. Katarzyniak
2022 B conf
KES
Marcin Zurawski, Grzegorz Popek, Radoslaw P. Katarzyniak
2020 B conf
KES
Radoslaw P. Katarzyniak, Grzegorz Popek, Marcin Zurawski
2019 conf
ICNC-FSKD
Mariusz Mulka, Wojciech A. Lorkiewicz, Radoslaw P. Katarzyniak
2017 conf
CISP-BMEI
Mariusz Mulka, Wojciech A. Lorkiewicz, Radoslaw P. Katarzyniak
2017 conf
ICNC-FSKD
Radoslaw P. Katarzyniak, Wojciech A. Lorkiewicz, Mariusz Mulka, Ondrej Krejcar
2016 conf
ICEIS (1)
Radoslaw P. Katarzyniak, Wojciech A. Lorkiewicz, Ondrej Krejcar
2016 conf
ICNC-FSKD
Radoslaw P. Katarzyniak, Wojciech A. Lorkiewicz, Dominik P. Wiecek
2016 conf
ICNC-FSKD
Radoslaw P. Katarzyniak, Grzegorz Popek, Mariusz Mulka, Marcin Zurawski
2015 conf
DSDIS
Radoslaw P. Katarzyniak, Wojciech A. Lorkiewicz, Janusz Sobecki
2015 conf
DSDIS
Radoslaw P. Katarzyniak, Wojciech A. Lorkiewicz, Janusz Sobecki
2015 conf
ISAT (2)
Wojciech A. Lorkiewicz, Radoslaw P. Katarzyniak
2013 book
Ngoc Thanh Nguyen, Bogdan Trawinski, Radoslaw P. Katarzyniak, GeunSik Jo
2013 conf
FSKD
Wojciech A. Lorkiewicz, Radoslaw P. Katarzyniak
2013 J jnl
Int. J. Softw. Eng. Knowl. Eng.
Jason J. Jung, Radoslaw P. Katarzyniak, Ngoc Thanh Nguyen
2013 J jnl
Int. J. Softw. Eng. Knowl. Eng.
Radoslaw P. Katarzyniak, Grzegorz Popek
2013 conf
FSKD
Grzegorz Popek, Radoslaw P. Katarzyniak
2013 C conf
HSI
Wojciech A. Lorkiewicz, Grzegorz Popek, Radoslaw P. Katarzyniak
2012 conf
ACIIDS (1)
Grzegorz Skorupa, Wojciech A. Lorkiewicz, Radoslaw P. Katarzyniak
2012 C conf
IEA/AIE
Wojciech A. Lorkiewicz, Grzegorz Skorupa, Radoslaw P. Katarzyniak
2012 conf
ICCCI (1)
Radoslaw P. Katarzyniak, Dominik P. Wiecek
2012 J jnl
Trans. Comput. Collect. Intell.
Wojciech A. Lorkiewicz, Radoslaw P. Katarzyniak, Ryszard Kowalczyk
2012 conf
ICCCI (2)
Grzegorz Popek, Ryszard Kowalczyk, Radoslaw P. Katarzyniak
2012 conf
ICCCI (1)
Grzegorz Skorupa, Radoslaw P. Katarzyniak
2011 conf
ICCCI (2)
Wojciech A. Lorkiewicz, Grzegorz Popek, Radoslaw P. Katarzyniak, Ryszard Kowalczyk
2011 conf
ACIIDS (1)
Grzegorz Skorupa, Radoslaw P. Katarzyniak
2011 conf
ICCCI (2)
Grzegorz Skorupa, Radoslaw P. Katarzyniak
2011 A conf
AAMAS
Wojciech A. Lorkiewicz, Ryszard Kowalczyk, Radoslaw P. Katarzyniak, Quoc Bao Vo
2010 book
Advances in Intelligent Information and Database Systems
Ngoc Thanh Nguyen, Radoslaw P. Katarzyniak, Shyi-Ming Chen
2010 conf
KES (1)
Grzegorz Skorupa, Radoslaw P. Katarzyniak
2010 conf
ICCCI (3)
Grzegorz Skorupa, Radoslaw P. Katarzyniak
2010 conf
KES-AMSTA (1)
Piotr Kalinowski, Radoslaw P. Katarzyniak
2010 J jnl
New Gener. Comput.
Radoslaw P. Katarzyniak, Ngoc Thanh Nguyen, Tzung-Pei Hong
2010 J jnl
Appl. Intell.
Ngoc Thanh Nguyen, Radoslaw P. Katarzyniak, Adam Janiak
2009 conf
KES-AMSTA
Jakub Gieryluk, Radoslaw P. Katarzyniak, Przemyslaw Maciejczyk, Magdalena Sendal, Grzegorz Skorupa
2009 J jnl
Knowl. Inf. Syst.
Ngoc Thanh Nguyen, Radoslaw P. Katarzyniak
2009 B conf
ACIIDS
Grzegorz Popek, Radoslaw P. Katarzyniak
2009 conf
ICCCI (SCI Volume)
Wojciech A. Lorkiewicz, Radoslaw P. Katarzyniak
2009 ed.
ICCCI (SCI Volume)
Ngoc Thanh Nguyen, Radoslaw P. Katarzyniak, Adam Janiak
2009 B conf
ACIIDS
Wojciech A. Lorkiewicz, Radoslaw P. Katarzyniak
2009 B conf
ICCCI
Grzegorz Skorupa, Radoslaw P. Katarzyniak
2008 conf
KES-AMSTA
Radoslaw P. Katarzyniak, Ngoc Thanh Nguyen, Lakhmi C. Jain
2008 conf
KES-AMSTA
Grzegorz Popek, Radoslaw P. Katarzyniak
2008 book
New Challenges in Applied Intelligence Technologies
Ngoc Thanh Nguyen, Radoslaw P. Katarzyniak
2008 conf
KES-AMSTA
Wojciech A. Lorkiewicz, Radoslaw P. Katarzyniak
2007 conf
KES (1)
Radoslaw P. Katarzyniak, Ngoc Thanh Nguyen, Lakhmi C. Jain
2006 Misc conf
International Conference on Computational Science (3)
Krzysztof Juszczyszyn, Ngoc Thanh Nguyen, Grzegorz Kolaczek, Adam Grzech, Agnieszka Pieczynska, Radoslaw P. Katarzyniak
2006 J jnl
J. Intell. Fuzzy Syst.
Radoslaw P. Katarzyniak, Agnieszka Pieczynska-Kuchtiak
2006 conf
KES (3)
Radoslaw P. Katarzyniak
2006 J jnl
J. Intell. Fuzzy Syst.
Ngoc Thanh Nguyen, Radoslaw P. Katarzyniak
2006 J jnl
J. Intell. Fuzzy Syst.
Radoslaw P. Katarzyniak
2006 Misc conf
International Conference on Computational Science (3)
Radoslaw P. Katarzyniak, Agnieszka Pieczynska
2005 conf
KES (2)
Grzegorz Kolaczek, Agnieszka Pieczynska-Kuchtiak, Krzysztof Juszczyszyn, Adam Grzech, Radoslaw P. Katarzyniak, Ngoc Thanh Nguyen
2005 conf
KES (2)
Radoslaw P. Katarzyniak
2005 J jnl
J. Univers. Comput. Sci.
Radoslaw P. Katarzyniak
2004 B conf
Discovery Science
Radoslaw P. Katarzyniak
2004 B conf
KES
Radoslaw P. Katarzyniak
2004 Misc conf
International Conference on Computational Science
Agnieszka Pieczynska-Kuchtiak, Radoslaw P. Katarzyniak
2003 conf
Modelling, Identification and Control
Radoslaw P. Katarzyniak, Agnieszka Pieczynska-Kuchtiak
2003 conf
Applied Informatics
Radoslaw P. Katarzyniak
2002 conf
Rough Sets and Current Trends in Computing
Radoslaw P. Katarzyniak, Ngoc Thanh Nguyen
2002 B conf
SOFSEM
Radoslaw P. Katarzyniak, Ngoc Thanh Nguyen
2001 conf
Intelligent Information Systems
Radoslaw P. Katarzyniak
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