Xiaofeng Yin

41 papers A 1C 1Misc 3Journal 23Unranked 13
YearRankTypeTitle / Venue / Authors
2025 J jnl
Eng. Appl. Artif. Intell.
Liyue Fu, Tong Wang, Min Ouyang, Ling Zhao, Xiaofeng Yin
2024 conf
ICDM (Workshops)
Donghao Huang, Xiuju Fu, Xiaofeng Yin, Haibo Pen, Zhaoxia Wang
2024 conf
CAI
Yun Hui Lin, Ping Chong Chua, Xiaofeng Yin, Zizhe Wang, Ning Li, Zhe Xiao, Xiuju Fu, Zheng Qin
2024 conf
CAI
Zizhe Wang, Xiaofeng Yin, Yun Hui Lin, Ping Chong Chua, Ning Li, Xiuju Fu
2024 J jnl
IEEE Access
Haozhe Wang, Chang Shu, Xiaofeng Li, Yu Fu, Zhizhong Fu, Xiaofeng Yin
2023 J jnl
Sensors
Xiaofeng Yin, Peizhen Zhang, Guangbo Zhou, Ziyi Feng
2023 J jnl
Comput. Biol. Medicine
Xu Zhang, Xiaofeng Yin, Lichao Zhang, Zhiqiang Ye, Guangmin Liang
2023 J jnl
BMC Medical Imaging
Dao-xiong Xiao, Jian-ping Zhong, Ji-dong Peng, Cun-geng Fan, Xiao-chun Wang, Xing-lin Wen, Wei-wei Liao, Jun Wang, Xiaofeng Yin
2023 conf
ICEITSA
Liyue Zhang, Hui Yin, Wei Li, Xiaofeng Yin, Zhiyu Wang
2022 J jnl
CoRR
Deqing Zhai, Xiuju Fu, Xiaofeng Yin, Haiyan Xu, Wanbing Zhang, Ning Li
2022 Misc conf
WSC
Yiqi Seow, Xiaofeng Yin, Haiyan Xu, Xiuju Fu, Zheng Qin, Hong Kiat Tan, Li Yang Hsu, Kiesha Prem, Sze Wee Tan
2022 Misc conf
WSC
Rong Zhou, Haiyan Xu, Xiuju Fu, Xiaofeng Yin, Zheng Qin, Liangbin Zhao, Pramod Verma, Mikael Lind
2022 J jnl
CoRR
Deqing Zhai, Xiuju Fu, Xiaofeng Yin, Haiyan Xu, Wanbing Zhang, Ning Li
2022 J jnl
CoRR
Deqing Zhai, Xiuju Fu, Xiaofeng Yin, Haiyan Xu, Wanbing Zhang, Ning Li
2022 J jnl
CoRR
Deqing Zhai, Xiuju Fu, Xiaofeng Yin, Haiyan Xu, Wanbing Zhang
2022 J jnl
Entropy
Chuanmei Xie, Zhanjun Zhang, Jianlan Chen, Xiaofeng Yin
2021 J jnl
Entropy
Chuanmei Xie, Feiyang Wu, Zhanjun Zhang, Jiawei Liang, Xiaofeng Yin
2020 J jnl
Entropy
Chuanmei Xie, Zhanjun Zhang, Jianlan Chen, Xiaofeng Yin
2020 J jnl
Quantum Inf. Process.
Hao Yuan, Wan-bin Zhang, Xiaofeng Yin
2020 J jnl
Comput. Aided Des.
Calvin Chi-Wan Lim, Xiaofeng Yin, Tianyou Zhang, Senthil Kumar Selvaraj, Yi Su, Chi-Keong Goh, Alejandro Moreno, Shahrokh Shahpar
2019 conf
IEEM
Haiyan Xu, Vasundhara Jayaraman, Xiuju Fu, Nasri Bin Othman, Wanbing Zhang, Xiaofeng Yin, Deqing Zhai, Rick Siow Mong Goh
2019 conf
IEEM
Deqing Zhai, Xiuju Fu, Haiyan Xu, Xiaofeng Yin, Jayaraman Vasundhara, Wanbing Zhang, Rick Siow Mong Goh
2018 conf
ICNC-FSKD
Guoqiang Qian, Xiaofeng Yin, Jingjing Ding, Yongxin Yongxindong, Xiaoyin Chen
2018 conf
IMR
Chi-Wan Lim, Xiaofeng Yin, Tianyou Zhang, Yi Su, Chi-Keong Goh, Alejandro Moreno, Shahrokh Shahpar
2018 J jnl
Ann. Oper. Res.
Guilan Kong, Lili Jiang, Xiaofeng Yin, Tianbing Wang, Dong-Ling Xu, Jian-Bo Yang, Yonghua Hu
2018 J jnl
IEEE Trans. Smart Grid
Xiaohua Wu, Xiaosong Hu, Xiaofeng Yin, Scott J. Moura
2017 Misc conf
WSC
Haobin Li, Xiuju Fu, Xiaofeng Yin, Giulia Pedrielli, Loo Hay Lee
2017 J jnl
Bioinform.
Musheng Li, Xueying Xie, Jing Zhou, Mengying Sheng, Xiaofeng Yin, Eun-A Ko, Tong Zhou, Wanjun Gu
2016 J jnl
Knowl. Based Syst.
Guilan Kong, Dong-Ling Xu, Jian-Bo Yang, Xiaofeng Yin, Tianbing Wang, Baoguo Jiang, Yonghua Hu
2016 C conf
ICARCV
Xiaofeng Yin, Xiuju Fu, Loganathan Ponnambalam, Haiyan Xu, Rick Siow Mong Goh
2015 conf
IEEM
Haiyan Xu, Xiuju Fu, Loganathan Ponnambalam, Akira Namatame, Xiaofeng Yin, Rick Siow Mong Goh
2015 J jnl
Quantum Inf. Process.
Guofeng Li, Yimin Liu, Haojie Tang, Xiaofeng Yin, Zhanjun Zhang
2014 J jnl
Quantum Inf. Process.
Qibin Ji, Yimin Liu, Chuanmei Xie, Xiaofeng Yin, Zhanjun Zhang
2013 J jnl
Quantum Inf. Process.
Daochu Liu, Yimin Liu, Chuanmei Xie, Xiaofeng Yin, Xiansong Liu, Zhanjun Zhang
2013 J jnl
Quantum Inf. Process.
Qibin Ji, Yimin Liu, Xiaofeng Yin, Xiansong Liu, Zhanjun Zhang
2013 conf
CASE
Rick Siow Mong Goh, Zhaoxia Wang, Xiaofeng Yin, Xiuju Fu, Loganathan Ponnambalam, Sifei Lu, Xiaorong Li
2013 J jnl
Quantum Inf. Process.
Daochu Liu, Yimin Liu, Chuanmei Xie, Xiaofeng Yin, Xiansong Liu, Zhanjun Zhang
2011 conf
AICI (3)
Wenping Wang, Xiaofeng Yin, Yongzhong Wang, Jianjun Yang
2007 conf
FSKD (4)
Xiaofeng Yin, Dianlun Xue, Yun Cai
2007 conf
ICNC (2)
Jingxing Tan, Xiaofeng Yin, Liang Yin, Ling Zhao
2006 A conf
ESA
Xiaofeng Yin, Daniel L. Kiskis, Daniel Mihalik, Kang G. Shin
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