Jakub Stankowski

41 papers A 1B 3C 6Misc 1Journal 12Unranked 18
YearRankTypeTitle / Venue / Authors
2026 J jnl
SoftwareX
Jakub Stankowski, Adrian Dziembowski
2025 J jnl
SoftwareX
Jakub Stankowski, Krzysztof Klimaszewski, Adam Grzelka
2025 J jnl
EURASIP J. Image Video Process.
Slawomir Rózek, Olgierd Stankiewicz, Slawomir Mackowiak, Tomasz Grajek, Jakub Stankowski, Maciej Wawrzyniak, Mateusz Lorkiewicz, Ding Ding, Shan Liu, Marek Domanski
2024 J jnl
SoftwareX
Blazej Szydelko, Dawid Mieloch, Adrian Dziembowski, Jakub Stankowski, Dominika Klóska, Jun Young Jeong, Gwangsoon Lee
2024 conf
VISIGRAPP (3): VISAPP
Jakub Stankowski, Adrian Dziembowski
2024 conf
ICME Workshops
Olgierd Stankiewicz, Tomasz Grajek, Slawomir Mackowiak, Jakub Stankowski, Slawomir Rózek, Mateusz Lorkiewicz, Maciej Wawrzyniak, Marek Domanski
2024 J jnl
SoftwareX
Jakub Stankowski, Adrian Dziembowski
2023 J jnl
SoftwareX
Jakub Stankowski, Adrian Dziembowski
2022 conf
EUSIPCO
Jakub Stankowski, Marek Domanski, Tomasz Grajek
2022 J jnl
IEEE Trans. Circuits Syst. Video Technol.
Adrian Dziembowski, Dawid Mieloch, Jakub Stankowski, Adam Grzelka
2020 C conf
MMSP
Krzysztof Wegner, Jakub Stankowski, Olgierd Stankiewicz, Hubert Zabinski, Krzysztof Klimaszewski, Tomasz Grajek
2019 J jnl
IEEE Access
Tomasz Grajek, Jakub Stankowski, Damian Karwowski, Krzysztof Klimaszewski, Olgierd Stankiewicz, Krzysztof Wegner
2019 C conf
PCS
Adam Grzelka, Adrian Dziembowski, Dawid Mieloch, Olgierd Stankiewicz, Jakub Stankowski, Marek Domanski
2018 conf
IWSSIP
Mateusz Lorkiewicz, Jakub Stankowski, Krzysztof Klimaszewski
2018 J jnl
J. Electronic Imaging
Krzysztof Wegner, Damian Karwowski, Jakub Stankowski, Tomasz Grajek, Krzysztof Klimaszewski, Olgierd Stankiewicz
2018 conf
IP&C
Jakub Stankowski, Mateusz Lorkiewicz, Krzysztof Klimaszewski
2018 conf
IWSSIP
Krzysztof Wegner, Tomasz Grajek, Jakub Stankowski, Marek Domanski
2017 J jnl
CoRR
Tomasz Grajek, Jakub Stankowski, Damian Karwowski, Krzysztof Klimaszewski, Olgierd Stankiewicz, Krzysztof Wegner
2017 B conf
ICIP
Marek Domanski, Adrian Dziembowski, Tomasz Grajek, Adam Grzelka, Krzysztof Klimaszewski, Dawid Mieloch, Robert Ratajczak, Olgierd Stankiewicz, Jakub Siast, Jakub Stankowski, Krzysztof Wegner
2017 conf
IWSSIP
Jaroslaw Samelak, Jakub Stankowski, Marek Domanski
2017 conf
IWSSIP
Olgierd Stankiewicz, Krzysztof Wegner, Damian Karwowski, Jakub Stankowski, Krzysztof Klimaszewski, Tomasz Grajek
2017 conf
IWSSIP
Krzysztof Wegner, Damian Karwowski, Krzysztof Klimaszewski, Jakub Stankowski, Olgierd Stankiewicz, Tomasz Grajek
2017 J jnl
CoRR
Krzysztof Wegner, Tomasz Grajek, Jakub Stankowski, Marek Domanski
2016 conf
IP&C
Damian Karwowski, Tomasz Grajek, Krzysztof Klimaszewski, Olgierd Stankiewicz, Jakub Stankowski, Krzysztof Wegner
2016 conf
IWSSIP
Jakub Stankowski, Damian Karwowski, Krzysztof Klimaszewski, Krzysztof Wegner, Olgierd Stankiewicz, Tomasz Grajek
2016 A conf
ICME
Marek Domanski, Maciej Bartkowiak, Adrian Dziembowski, Tomasz Grajek, Adam Grzelka, Adam Luczak, Dawid Mieloch, Jaroslaw Samelak, Olgierd Stankiewicz, Jakub Stankowski, Krzysztof Wegner
2016 conf
IWSSIP
Adrian Dziembowski, Marek Domanski, Adam Grzelka, Dawid Mieloch, Jakub Stankowski, Krzysztof Wegner
2015 conf
3DTV-Conference
Jakub Stankowski, Lukasz Kowalski, Jaroslaw Samelak, Marek Domanski, Tomasz Grajek, Krzysztof Wegner
2015 conf
IP&C
Tomasz Grajek, Damian Karwowski, Jakub Stankowski
2015 conf
ICME Workshops
Marek Domanski, Adrian Dziembowski, Tomasz Grajek, Adam Grzelka, Lukasz Kowalski, Maciej Kurc, Adam Luczak, Dawid Mieloch, Robert Ratajczak, Jaroslaw Samelak, Olgierd Stankiewicz, Jakub Stankowski, Krzysztof Wegner
2015 C conf
PCS
Jakub Stankowski, Cezary Korzeniewski, Marek Domanski, Tomasz Grajek
2014 Misc conf
ICCVG
Jakub Stankowski, Tomasz Grajek, Damian Karwowski, Krzysztof Klimaszewski, Olgierd Stankiewicz, Krzysztof Wegner, Marek Domanski
2014 conf
IWSSIP
Tomasz Grajek, Jakub Stankowski, Krzysztof Wegner, Marek Domanski
2013 C conf
PCS
Jakub Siast, Jakub Stankowski, Tomasz Grajek, Marek Domanski
2013 J jnl
IEEE Trans. Image Process.
Marek Domanski, Olgierd Stankiewicz, Krzysztof Wegner, Maciej Kurc, Jacek Konieczny, Jakub Siast, Jakub Stankowski, Robert Ratajczak, Tomasz Grajek
2012 B conf
ICIP
Marek Domanski, Jacek Konieczny, Maciej Kurc, Robert Ratajczak, Jakub Siast, Olgierd Stankiewicz, Jakub Stankowski, Krzysztof Wegner
2012 C conf
PCS
Marek Domanski, Tomasz Grajek, Damian Karwowski, Jacek Konieczny, Maciej Kurc, Adam Luczak, Robert Ratajczak, Jakub Siast, Olgierd Stankiewicz, Jakub Stankowski, Krzysztof Wegner
2012 B conf
ICIP
Jakub Stankowski, Marek Domanski, Olgierd Stankiewicz, Jacek Konieczny, Jakub Siast, Krzysztof Wegner
2012 C conf
PCS
Jakub Stankowski, Tomasz Grajek, Marek Domanski
2010 conf
IP&C
Jakub Stankowski, Krzysztof Klimaszewski
2010 conf
FMN
Marek Domanski, Krzysztof Klimaszewski, Olgierd Stankiewicz, Jakub Stankowski, Krzysztof Wegner
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