Kaoru Sumi

68 papers A* 2B 16C 16Journal 13Unranked 21
YearRankTypeTitle / Venue / Authors
2026 B ed.
PERSUASIVE
Kaoru Sumi, Raian Ali, Roberto Legaspi
2025 J jnl
Frontiers Robotics AI
Ahmed Salem, Kaoru Sumi
2024 B conf
COMPSAC
Ahmed Salem, Kaoru Sumi
2024 J jnl
Frontiers Artif. Intell.
Ahmed Salem, Kaoru Sumi
2024 B conf
COMPSAC
Pinkie Anggia, Kaoru Sumi
2024 B conf
COMPSAC
Shun Furuichi, Kaoru Sumi
2024 C conf
ICCE
Ahmed Salem, Kaoru Sumi
2024 B conf
PERSUASIVE
Rio Harada, Kaoru Sumi
2024 B conf
COMPSAC
Yusuke Sato, Ahmed Salem, Kaoru Sumi
2024 B conf
COMPSAC
Ahmed Salem, Kaoru Sumi
2024 B conf
COMPSAC
Yoshifuru Nakayama, Kaoru Sumi
2024 J jnl
J. Robotics Netw. Artif. Life
Pinkie Anggia, Kaoru Sumi
2023 B conf
PERSUASIVE
Pinkie Anggia, Kaoru Sumi
2022 conf
ACIIW
Nitchan Jianwattanapaisarn, Kaoru Sumi, Akira Utsumi
2022 J jnl
Frontiers Artif. Intell.
Nitchan Jianwattanapaisarn, Kaoru Sumi, Akira Utsumi, Nirattaya Khamsemanan, Cholwich Nattee
2022 J jnl
Frontiers Artif. Intell.
Kaoru Sumi, Shusuke Sato
2022 J jnl
J. Robotics Netw. Artif. Life
Nitchan Jianwattanapaisarn, Kaoru Sumi
2020 conf
VR Workshops
Toshiro Kashiwagi, Kaoru Sumi
2020 C conf
ICCE
Shusuke Sato, Kaoru Sumi
2019 conf
iCAST
Keigo Yabuki, Kaoru Sumi
2019 B conf
ITS
Thomas James Z. Tiam-Lee, Kaoru Sumi
2019 C conf
ICCE
Thomas James Tiam-Lee, Kaoru Sumi
2019 C conf
ICCE
Thomas James Tiam-Lee, Kaoru Sumi
2019 A* conf
VR
Toshiro Kashiwagi, Kaoru Sumi, Sidney S. Fels, Qian Zhou, Fan Wu
2019 conf
AffCon@AAAI
Thomas James Z. Tiam-Lee, Kaoru Sumi
2019 A* conf
VR
Shunki Shimizu, Kaoru Sumi
2018 B conf
SMC
Shogo Hirai, Kaoru Sumi
2018 conf
Edutainment
Keigo Yabuki, Kaoru Sumi
2018 B conf
ITS
Thomas James Z. Tiam-Lee, Kaoru Sumi
2018 B conf
SMC
Quentin Ferre, Tomohiro Mori, Kaoru Sumi
2018 conf
Edutainment
Shogo Hirai, Kaoru Sumi
2018 C conf
ICCE
Thomas James Tiam-Lee, Kaoru Sumi
2018 C conf
ICCE
Thomas James Tiam-Lee, Kaoru Sumi
2018 B conf
SMC
Keigo Yabuki, Kaoru Sumi
2018 B conf
SMC
Thomas James Z. Tiam-Lee, Kaoru Sumi
2017 C conf
ICEC
Nozomu Yahata, Kaoru Sumi
2017 conf
Culture Computing
Thomas James Z. Tiam-Lee, Kaoru Sumi
2017 C conf
ICIDS
Kaoru Sumi, Nozomu Yahata
2017 C conf
ICEC
Shunki Shimizu, Kaoru Sumi
2017 C conf
ICEC
Shogo Hirai, Kaoru Sumi
2016 conf
INTETAIN
Kaoru Sumi, Kodai Kasai
2016 conf
INTETAIN
Kaoru Sumi, Yuki Tsukamoto
2016 J jnl
J. Robotics Netw. Artif. Life
Kaoru Sumi
2014 C conf
ICCE
Kaoru Sumi, Ayaka Kazuhara
2013 conf
HCI (7)
Kaoru Sumi, Mizue Nagata
2013 conf
HCI (13)
Kaoru Sumi, Mizue Nagata
2011 conf
HCI (12)
Kaoru Sumi, Mizue Nagata
2010 C conf
ICIDS
Kaoru Sumi
2009 C conf
ICIDS
Kaoru Sumi
2008 C conf
ICIDS
Kaoru Sumi
2008 conf
Advances in Computer Entertainment Technology
Kaoru Sumi
2008 J jnl
Internet Res.
Hisashi Miyamori, Susumu Akamine, Yoshikiyo Kato, Ken Kaneiwa, Kaoru Sumi, Kentaro Inui, Sadao Kurohashi
2008 B conf
IVA
Kaoru Sumi, Mizue Nagata
2007 conf
International Conference on Virtual Storytelling
Kaoru Sumi
2006 conf
Advances in Computer Entertainment Technology
Kaoru Sumi, Mizue Nagata
2005 C conf
ICEC
Kaoru Sumi, Katsumi Tanaka
2005 conf
International Conference on Virtual Storytelling
Kaoru Sumi, Katsumi Tanaka
2005 conf
AMT
Kaoru Sumi, Katsumi Tanaka
2005 C conf
APWeb
Hisashi Miyamori, Akiyo Nadamoto, Kaoru Sumi, Qiang Ma
2005 conf
WWW (Special interest tracks and posters)
Kaoru Sumi, Katsumi Tanaka
2004 conf
IMTCI
Kaoru Sumi, Katsumi Tanaka
2004 J jnl
J. Decis. Syst.
Kaoru Sumi, Riichiro Mizoguchi
2003 J jnl
Syst. Comput. Jpn.
Kaoru Sumi, Toyoaki Nishida
2001 conf
Web Intelligence
Kaoru Sumi, Riichiro Mizoguchi
2001 J jnl
IEEE Intell. Syst.
Kaoru Sumi, Toyoaki Nishida
2000 J jnl
Syst. Comput. Jpn.
Kaoru Sumi, Yasuyuki Sumi, Kenji Mase, Shinichi Nakasuka, Koichi Hori
2000 conf
Digital Cities
Shintaro Azechi, Nobuhiko Fujihara, Kaoru Sumi, Takashi Hirata, Hiroyuki Yano, Toyoaki Nishida
1999 J jnl
New Gener. Comput.
Toyoaki Nishida, Nobuhiko Fujihara, Shintaro Azechi, Kaoru Sumi, Hiroyuki Yano, Takashi Hirata
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