Xiangdong Zhang

66 papers A* 5A 3B 3C 1Journal 42Unranked 12
YearRankTypeTitle / Venue / Authors
2026 J jnl
CoRR
Jingtao Ye, Kexin Zhang, Xunchi Ma, Yuehan Li, Guangming Zhu, Peiyi Shen, Linhua Jiang, Xiangdong Zhang, Liang Zhang
2026 J jnl
CoRR
Boming Tan, Xiangdong Zhang, Ning Liao, Yuqing Zhang, Shaofeng Zhang, Xue Yang, Qi Fan, Yanyong Zhang
2025 A* conf
IJCAI
Qianqian Wang, Bowen Zhao, Zhengming Ding, Xiangdong Zhang, Quanxue Gao
2025 J jnl
J. Comput. Phys.
Xiangdong Zhang, Li Luo, Ye Li, Xiao-Chuan Cai
2025 J jnl
CoRR
Shaofeng Zhang, Xuanqi Chen, Xiangdong Zhang, Sitong Wu, Junchi Yan
2025 A* conf
IJCAI
Qianqian Wang, Haiming Xu, Meiling Liu, Wei Feng, Xiangdong Zhang
2025 J jnl
IEEE Trans. Affect. Comput.
Wei Nie, Hanlin Zhang, Xiangdong Zhang, Zhiyong Wang, Honghai Liu
2025 J jnl
CoRR
Xiangdong Zhang, Shaofeng Zhang, Junchi Yan
2025 J jnl
CoRR
Xiangdong Zhang, Jiaqi Liao, Shaofeng Zhang, Fanqing Meng, Xiangpeng Wan, Junchi Yan, Yu Cheng
2024 conf
OFC
Huihui Zhu, Haosen Chen, Hong Cai, Tian Chen, Lip Ket Chin, Xiangdong Zhang, Ai Qun Liu
2024 conf
ICIRA (5)
Wenze Huang, Jin Li, Haoyu Ji, Boyu Ying, Xiaoxia Ma, Xiangdong Zhang, Zhiyong Wang
2024 B conf
SMC
Xinming Wang, Xiangdong Zhang, Zhiyong Wang, Wei Nie, Hanlin Zhang, Xiu Xu, Honghai Liu
2024 J jnl
Neurocomputing
Yang Lu, Qin Li, Xiangdong Zhang, Quanxue Gao
2024 J jnl
Pattern Recognit.
Xiangdong Zhang, Fangfang Li, Zhaoyang Shi, Ming Yang
2024 A* conf
NeurIPS
Xiangdong Zhang, Shaofeng Zhang, Junchi Yan
2024 J jnl
CoRR
Xiangdong Zhang, Shaofeng Zhang, Junchi Yan
2024 J jnl
CoRR
Jing Qiu, Jiancheng Huang, Xiangdong Zhang, Zeng Lin, Minglei Pan, Zengding Liu, Fen Miao
2024 J jnl
Symmetry
Yongbin Du, Haida Li, Xiangdong Zhang
2023 J jnl
Adv. Intell. Syst.
Yingji Zhang, Tian Chen, Xiaoxue Tong, Naiqiao Pan, Xiangdong Zhang
2023 J jnl
Adv. Intell. Syst.
Deyuan Zou, Naiqiao Pan, Tian Chen, Houjun Sun, Xiangdong Zhang
2023 J jnl
Entropy
Longhan Wang, Yifan Sun, Xiangdong Zhang
2023 J jnl
IEEE Trans. Multim.
Xiaochuang Shu, Xiangdong Zhang, Quanxue Gao, Ming Yang, Rong Wang, Xinbo Gao
2023 J jnl
CoRR
Shaobo Wang, Xiangdong Zhang, Junchi Yan
2023 A conf
INTERSPEECH
Bajian Xiang, Hongkun Liu, Zedong Wu, Su Shen, Xiangdong Zhang
2022 J jnl
Neurocomputing
Han Lu, Quanxue Gao, Xiangdong Zhang, Wei Xia
2022 conf
ICCT
Wenting Wei, Xiangdong Zhang, Siduo Pan, Lizhe Liu, Qingyi Wang
2022 J jnl
Quantum Inf. Process.
Tingting Ji, Naiqiao Pan, Tian Chen, Xiangdong Zhang
2022 J jnl
Neurocomputing
Yujiao Zhao, Yu Yun, Xiangdong Zhang, Qin Li, Quanxue Gao
2022 J jnl
IEEE Trans. Cybern.
Wei Xia, Xiangdong Zhang, Quanxue Gao, Xiaochuang Shu, Jungong Han, Xinbo Gao
2022 J jnl
IEEE Trans. Multim.
Wei Xia, Qianqian Wang, Quanxue Gao, Xiangdong Zhang, Xinbo Gao
2022 J jnl
Neurocomputing
Xiaochuang Shu, Xiangdong Zhang, Qianqian Wang
2022 J jnl
IEEE Trans. Image Process.
Ziyu Lv, Quanxue Gao, Xiangdong Zhang, Qin Li, Ming Yang
2021 conf
ICAIIS
Yuliang Shi, Xin Liu, Song Han, Yingguang Lu, Xiangdong Zhang
2021 J jnl
Neurocomputing
Wei Xia, Xiangdong Zhang, Quanxue Gao, Xinbo Gao
2021 A* conf
ICCV
Mingtao Feng, Zhen Li, Qi Li, Liang Zhang, Xiangdong Zhang, Guangming Zhu, Hui Zhang, Yaonan Wang, Ajmal Mian
2021 J jnl
CoRR
Mingtao Feng, Zhen Li, Qi Li, Liang Zhang, Xiangdong Zhang, Guangming Zhu, Hui Zhang, Yaonan Wang, Ajmal Mian
2021 J jnl
Neurocomputing
Ying Dou, Yu Yun, Quanxue Gao, Xiangdong Zhang
2021 J jnl
Neurocomputing
Shiwen Kou, Wei Xia, Xiangdong Zhang, Quanxue Gao, Xinbo Gao
2020 J jnl
Neural Networks
De-Yan Xie, Quanxue Gao, Qianqian Wang, Xiangdong Zhang, Xinbo Gao
2020 J jnl
Multim. Tools Appl.
Hongsheng Li, Liang Zhang, Xiangdong Zhang, Meili Zhang, Guangming Zhu, Peiyi Shen, Ping Li, Mohammed Bennamoun, Syed Afaq Ali Shah
2020 J jnl
Sensors
Junhua Ye, Xin Li, Xiangdong Zhang, Qin Zhang, Wu Chen
2020 J jnl
Neurocomputing
Mingzhen Hou, Wei Xia, Xiangdong Zhang, Quanxue Gao
2020 J jnl
CoRR
Xiangdong Zhang, Tengjun Wang, Yun Yang
2020 J jnl
Neural Networks
Huiling Xu, Xiangdong Zhang, Wei Xia, Quanxue Gao, Xinbo Gao
2020 J jnl
IEEE Trans. Cybern.
De-Yan Xie, Xiangdong Zhang, Quanxue Gao, Jiale Han, Song Xiao, Xinbo Gao
2020 J jnl
IEEE Trans. Biomed. Eng.
Xiangdong Zhang, Dan Wu, Fen Miao, Hao Liu, Ye Li
2019 conf
AIAM (IEEE)
Aiguo Zhao, Qianjin Xiao, Tao Wu, Xiangdong Zhang, Mangong Zhang, Zhigao Zhao, Jiachang Qian, Hao Zhang, Hong Chen
2019 J jnl
Entropy
Ye-Chao Liu, Jiangwei Shang, Xiangdong Zhang
2019 J jnl
Neurocomputing
Pu Zhang, Siyang Deng, Feiping Nie, Yang Liu, Xiangdong Zhang, Quanxue Gao
2019 B conf
ICIP
Xiangdong Zhang, Meili Zhang, Liang Zhang, Peiyi Shen, Guangming Zhu, Ping Li
2019 conf
ICBDT
Bin Xue, Bo Zou, Xiangdong Zhang, Yongming Guan, Liang Lv
2019 A* conf
IJCAI
Shuangli Liao, Quanxue Gao, Feiping Nie, Yang Liu, Xiangdong Zhang
2018 C conf
CSCWD
Wenlin Xie, Wei Zhou, Lanju Kong, Xiangdong Zhang, Xinping Min, Zongshui Xiao, Qingzhong Li
2018 J jnl
IET Image Process.
Liang Zhang, Qing Xu, Guangming Zhu, Juan Song, Xiangdong Zhang, Peiyi Shen, Wei Wei, Syed Afaq Ali Shah, Mohammed Bennamoun
2018 J jnl
Neurocomputing
Liang Zhang, Le Wang, Xiangdong Zhang, Peiyi Shen, Mohammed Bennamoun, Guangming Zhu, Syed Afaq Ali Shah, Juan Song
2017 conf
CCCV (1)
Qing Xu, Xiangdong Zhang, Liang Zhang, Guangming Zhu, Juan Song, Peiyi Shen
2016 J jnl
Neurocomputing
Yuanmei Tian, Juan Song, Xiangdong Zhang, Peiyi Shen, Liang Zhang, Weibin Gong, Wei Wei, Guangming Zhu
2015 conf
CCCV (2)
Xiangdong Zhang, Peiyi Shen, Juan Song, Liang Zhang, Weibin Gong, Wei Wei, Yuanmei Tian, Guangming Zhu
2013 conf
ISR
Peiyi Shen, Liang Zhang, Juan Song, L. Si, X. Wu, J. Ding, Y. Zhang, Xiangdong Zhang, Wei Wei, Bin Leng, M. Zeng, W. Zhang
2012 conf
IC-NIDC
Peiyi Shen, Liang Zhang, Zhijian Wang, Wei Shao, Zhengchuan Hu, Xiangdong Zhang, Yi-Zhe Song
2012 B conf
ICPR
Xiangdong Zhang, Peiyi Shen, Lingli Luo, Liang Zhang, Juan Song
2001 J jnl
Fuzzy Sets Syst.
Liang Chen, Naoyuki Tokuda, Xiangdong Zhang, Yongbao He
2000 conf
ISCSLP
Xiangdong Zhang, Baosheng Yuan, Ying Jia, Lingyun Tuo, Yonghong Yan
2000 A conf
INTERSPEECH
Baosheng Yuan, Qingwei Zhao, Qing Guo, Xiangdong Zhang, Zhiwei Lin
2000 A conf
INTERSPEECH
Qing Guo, Yonghong Yan, Baosheng Yuan, Xiangdong Zhang, Ying Jia, Xiaoxing Liu
1998 conf
ICSLP
Dinghua Guan, Min Chu, Quan Zhang, Jian Liu, Xiangdong Zhang
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