Naoto Kume

40 papers A* 1Misc 2Journal 5Unranked 32
YearRankTypeTitle / Venue / Authors
2025 conf
HCI (6)
Shinya Somiya, Kimihiko Masui, Naoto Kume, Toshihiro Magaribuchi, Megumi Nakao, Atsuro Sawada, Takashi Kobayashi
2025 conf
MedInfo
Naoto Kume, Satoshi Kato
2025 J jnl
IEEE Access
Wenhui Zhuang, Kimihiko Masui, Naoto Kume, Megumi Nakao
2020 J jnl
J. Medical Syst.
Placide Poba-Nzaou, Naoto Kume, Shinji Kobayashi
2019 conf
MedInfo
Shinji Kobayashi, Naoto Kume, Hiroyuki Yoshihara
2019 conf
MedInfo
Placide Poba-Nzaou, Naoto Kume, Shinji Kobayashi
2019 J jnl
Int. J. Comput. Sci. Eng.
Samar El Helou, Shinji Kobayashi, Goshiro Yamamoto, Naoto Kume, Eiji Kondoh, Shusuke Hiragi, Kazuya Okamoto, Hiroshi Tamura, Tomohiro Kuroda
2019 conf
MedInfo
Naoto Kume, Kenji Suzuki, Shinji Kobayashi, Hiroyuki Yoshihara, Kenji Araki
2018 conf
HCI (2)
Atsuro Sawada, Jin Kono, Atsushi Sengiku, Naoto Kume, Junichi Fukuda, Toshinari Yamasaki, Osamu Ogawa
2017 conf
MedInfo
Kensuke Morris, Naoto Kume, Goshiro Yamamoto, Shinji Kobayashi, Kazuya Okamoto, Hiroshi Tamura, Tomohiro Kuroda
2017 conf
MedInfo
Samar El Helou, Tuukka Karvonen, Goshiro Yamamoto, Naoto Kume, Shinji Kobayashi, Eiji Kondoh, Shusuke Hiragi, Kazuya Okamoto, Hiroshi Tamura, Tomohiro Kuroda
2017 conf
MedInfo
Shinji Kobayashi, Naoto Kume, Hiroyuki Yoshihara
2017 conf
MedInfo
Naoto Kume, Shinji Kobayashi, Kenji Araki, Hiroyuki Yoshihara
2015 Misc conf
AMIA
Naoto Kume, Shinji Kobayashi, Kenji Araki, Satoshi Inoue, Hiroyuki Yoshihara
2015 conf
MedInfo
Naoto Kume, Kenji Suzuki, Shinji Kobayashi, Kenji Araki, Hiroyuki Yoshihara
2015 conf
MedInfo
Shinji Kobayashi, Naoto Kume, Hiroyuki Yoshihara
2014 Misc conf
AMIA
Shinji Kobayashi, Naoto Kume, Tomohiro Kuroda, Hiroyuki Yoshihara
2013 conf
EMBC
Tomohiro Kuroda, Eizen Kimura, Yasushi Matsumura, Yoshinori Yamashita, Haruhiko Hiramatsu, Naoto Kume, Atsushi Sato
2013 J jnl
Virtual Real.
Kazuya Okamoto, Naoto Kume, Tatsuya Tokunaga, Yoko Tanaka, Terasawa Noriaki, Takashi Tsukasa, Tadamasa Takemura, Hiroyuki Yoshihara
2013 conf
MedInfo
Kazuya Okamoto, Toshio Uchiyama, Tadamasa Takemura, Naoto Kume, Takayuki Adachi, Tomohiro Kuroda, Tadasu Uchiyama, Hiroyuki Yoshihara
2013 conf
MMVR
Naoto Kume, Kana Eguchi, Tomohiro Kuroda, Koji Yoshimura, Kazutoshi Okubo, Kazuya Okamoto, Tadamasa Takemura, Hiroyuki Yoshihara
2013 conf
MedInfo
Tomohiro Kuroda, Eizen Kimura, Yasushi Matsumura, Yoshinori Yamashita, Haruhiko Hiramatsu, Naoto Kume
2013 conf
EMBC
Kenta Hori, Yusuke Uchida, Tsukasa Kan, Maya Minami, Chisako Naito, Tomohiro Kuroda, Hideya Takahashi, Masahiko Ando, Takashi Kawamura, Naoto Kume, Kazuya Okamoto, Tadamasa Takemura, Hiroyuki Yoshihara
2013 conf
MedInfo
Tadamasa Takemura, Toshiyuki Tanaka, Kazuya Okamoto, Naoto Kume, Tomohiro Kuroda, Masahiro Hirose, Hiroyuki Yoshihara
2013 conf
NLPHealthcare@IJCNLP
Naoto Kume, Kazuya Okamoto, Tomohiro Kuroda, Hiroyuki Yoshihara
2012 conf
SCIS&ISIS
Kazuya Okamoto, Hiroko Tanaka, Tadamasa Takemura, Naoto Kume, Tomohiro Kuroda, Hiroyuki Yoshihara
2012 J jnl
J. Medical Syst.
Tadamasa Takemura, Kenji Araki, Kenji Arita, Toshiaki Suzuki, Kazuya Okamoto, Naoto Kume, Tomohiro Kuroda, Akira Takada, Hiroyuki Yoshihara
2012 conf
SCIS&ISIS
Tadamasa Takemura, Naoto Kume, Kazuya Okamoto, Tomohiro Kuroda, Hiroyuki Yoshihara
2012 conf
EMBC
Tomohiro Kuroda, Tadamasa Takemura, Haruo Noma, Kazuya Okamoto, Naoto Kume, Hiroyuki Yoshihara
2012 conf
SCIS&ISIS
Naoto Kume, Yosuke Hirayama, Naoki Ohboshi, Kazuya Okamoto, Tadamasa Takemura, Kenji Araki, Hiroyuki Yoshihara
2011 conf
ANT/MobiWIS
Naoto Kume, Mikko J. Rissanen
2008 conf
MMVR
Mikko J. Rissanen, Naoto Kume, Yoshihiro Kuroda, Tomohiro Kuroda, Koji Yoshimura, Hiroyuki Yoshihara
2008 conf
Wireless Days
Antti Alasalmi, Olli Martikainen, Tomohiro Kuroda, Tadamasa Takemura, Naoto Kume, Hiroyuki Yoshihara, Tsuyoshi Nagashima, Naoki Oboshi
2008 A* conf
VR
Megumi Nakao, Kotaro Minato, Naoto Kume, Shin-ichiro Mori, Shinji Tomita
2007 conf
MMVR
Naoto Kume, Yoshihiro Kuroda, Megumi Nakao, Tomohiro Kuroda, Keisuke Nagase, Hiroyuki Yoshihara, Masaru Komori
2007 conf
MMVR
Yoshihiro Kuroda, Tadamasa Takemura, Naoto Kume, Kazuya Okamoto, Kenta Hori, Megumi Nakao, Tomohiro Kuroda, Hiroyuki Yoshihara
2007 conf
WHC
Mikko J. Rissanen, Yoshihiro Kuroda, Megumi Nakao, Naoto Kume, Tomohiro Kuroda, Hiroyuki Yoshihara
2007 conf
HCI (14)
Naoto Kume, Kazuya Okamoto, Takashi Tsukasa, Hiroyuki Yoshihara
2006 conf
ISBMS
Mikko J. Rissanen, Yoshihiro Kuroda, Megumi Nakao, Naoto Kume, Tomohiro Kuroda, Hiroyuki Yoshihara
2006 conf
VRCIA
Mikko J. Rissanen, Yoshihiro Kuroda, Naoto Kume, Megumi Nakao, Tomohiro Kuroda, Hiroyuki Yoshihara
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