Manfredi Maggiore

79 papers B 1C 15Journal 36Unranked 27
YearRankTypeTitle / Venue / Authors
2025 conf
CDC
Luiz Navarro, Manfredi Maggiore
2024 J jnl
IEEE Trans. Control. Syst. Technol.
Adan Moran-MacDonald, Manfredi Maggiore, Xingbo Wang
2024 J jnl
CoRR
Adan Moran-MacDonald, Manfredi Maggiore, Xingbo Wang
2024 J jnl
IEEE Trans. Autom. Control.
Luiz Navarro, Manfredi Maggiore
2024 J jnl
IEEE Trans. Autom. Control.
Manfredi Maggiore
2023 J jnl
IEEE Control. Syst. Lett.
Manfredi Maggiore
2023 J jnl
IEEE Trans. Control. Syst. Technol.
Emily Kao-Vukovich, Manfredi Maggiore
2023 J jnl
Autom.
Manfredi Maggiore, Antonio Loría, Elena Panteley
2023 J jnl
Autom.
Rein Otsason, Manfredi Maggiore
2019 J jnl
IEEE Trans. Autom. Control.
Ashton Roza, Manfredi Maggiore, Luca Scardovi
2019 conf
CDC
Rein Otsason, Manfredi Maggiore
2019 J jnl
IEEE Trans. Autom. Control.
Manfredi Maggiore, Mario Sassano, Luca Zaccarian
2018 J jnl
IEEE Trans. Control. Netw. Syst.
Ashton Roza, Manfredi Maggiore, Luca Scardovi
2018 J jnl
Autom.
Alireza Mohammadi, Manfredi Maggiore, Luca Consolini
2017 conf
CDC
Ashton Roza, Manfredi Maggiore, Luca Scardovi
2017 J jnl
IEEE Trans. Autom. Control.
Ashton Roza, Manfredi Maggiore, Luca Scardovi
2016 conf
CDC
Ashton Roza, Manfredi Maggiore, Luca Scardovi
2016 J jnl
Autom.
Edoardo Serpelloni, Manfredi Maggiore, Christopher J. Damaren
2016 J jnl
IEEE Trans. Control. Syst. Technol.
Alireza Mohammadi, Ehsan Rezapour, Manfredi Maggiore, Kristin Ytterstad Pettersen
2014 J jnl
IEEE Trans. Autom. Control.
Ashton Roza, Manfredi Maggiore
2014 conf
CDC
Ashton Roza, Manfredi Maggiore, Luca Scardovi
2014 conf
CDC
Edoardo Serpelloni, Manfredi Maggiore, Christopher J. Damaren
2014 conf
CDC
Alireza Mohammadi, Ehsan Rezapour, Manfredi Maggiore, Kristin Ytterstad Pettersen
2014 C conf
CCA
Ehsan Rezapour, Andreas Hofmann, Kristin Ytterstad Pettersen, Alireza Mohammadi, Manfredi Maggiore
2013 J jnl
CoRR
Luca Consolini, Manfredi Maggiore
2013 J jnl
Autom.
Luca Consolini, Manfredi Maggiore
2013 J jnl
IEEE Trans. Autom. Control.
Mohamed I. El-Hawwary, Manfredi Maggiore
2013 J jnl
IEEE Trans. Control. Syst. Technol.
Barry G. Rawn, Peter W. Lehn, Manfredi Maggiore
2013 J jnl
Autom.
Mohamed I. El-Hawwary, Manfredi Maggiore
2013 conf
CDC
Luca Consolini, Manfredi Maggiore
2013 J jnl
IEEE Trans. Autom. Control.
Manfredi Maggiore, Luca Consolini
2013 conf
NOLCOS
Alireza Mohammadi, Manfredi Maggiore, Luca Consolini
2012 J jnl
SIAM J. Control. Optim.
Manfredi Maggiore, Barry G. Rawn, Peter W. Lehn
2012 C conf
ACC
Ashton Roza, Manfredi Maggiore
2012 conf
CDC
Ashton Roza, Manfredi Maggiore
2012 C conf
ACC
Dame Jankuloski, Manfredi Maggiore, Luca Consolini
2011 J jnl
Int. J. Control
Mohamed I. El-Hawwary, Manfredi Maggiore
2011 conf
CDC/ECC
Mohamed I. El-Hawwary, Manfredi Maggiore
2011 conf
CDC/ECC
Mohamed I. El-Hawwary, Manfredi Maggiore
2011 C conf
ACC
Manfredi Maggiore, Barry G. Rawn, Peter W. Lehn
2011 conf
CDC/ECC
Luca Consolini, Manfredi Maggiore
2010 conf
CDC
Luca Consolini, Manfredi Maggiore
2010 J jnl
Autom.
Luca Consolini, Manfredi Maggiore, Christopher Nielsen, Mario Tosques
2010 J jnl
Autom.
Christopher Nielsen, Cameron Fulford, Manfredi Maggiore
2010 J jnl
IEEE Trans. Autom. Control.
Mohamed I. El-Hawwary, Manfredi Maggiore
2009 J jnl
IEEE Trans. Control. Syst. Technol.
Cameron Fulford, Manfredi Maggiore, Jacob Apkarian
2009 C conf
ACC
Luca Consolini, Manfredi Maggiore, Mario Tosques, Christopher Nielsen
2009 C conf
ACC
Christopher Nielsen, Cameron Fulford, Manfredi Maggiore
2008 C conf
ACC
Cameron Fulford, Manfredi Maggiore, Jacob Apkarian
2008 C conf
ACC
Mohamed I. El-Hawwary, Manfredi Maggiore
2008 J jnl
SIAM J. Control. Optim.
Christopher Nielsen, Manfredi Maggiore
2008 conf
CDC
Christopher Nielsen, Luca Consolini, Manfredi Maggiore, Mario Tosques
2008 conf
CDC
Mohamed I. El-Hawwary, Manfredi Maggiore
2008 conf
CDC
Mohamed I. El-Hawwary, Manfredi Maggiore
2007 conf
CDC
Mohamed I. El-Hawwary, Manfredi Maggiore
2007 J jnl
SIAM J. Control. Optim.
Zhiyun Lin, Bruce A. Francis, Manfredi Maggiore
2006 conf
CDC
Christopher Nielsen, Manfredi Maggiore
2006 J jnl
Syst. Control. Lett.
Christopher Nielsen, Manfredi Maggiore
2005 conf
CDC/ECC
Zhiyun Lin, Bruce A. Francis, Manfredi Maggiore
2005 C conf
ACC
Robert Brydon Owen, Manfredi Maggiore
2005 J jnl
IEEE Trans. Autom. Control.
Zhiyun Lin, Bruce A. Francis, Manfredi Maggiore
2005 C conf
CCA
Robert Brydon Owen, Manfredi Maggiore, Jacob Apkarian
2005 J jnl
IEEE Trans. Autom. Control.
Manfredi Maggiore, Kevin M. Passino
2005 conf
CDC/ECC
Christopher Nielsen, Manfredi Maggiore
2004 conf
CDC
Zhiyun Lin, Bruce A. Francis, Manfredi Maggiore
2003 J jnl
IEEE Trans. Autom. Control.
Manfredi Maggiore, Kevin M. Passino
2003 J jnl
IEEE Trans. Autom. Control.
Manfredi Maggiore, Kevin M. Passino
2003 conf
CDC
Michel Levis, Manfredi Maggiore
2003 C conf
ACC
Rafael Becerril-Arreola, Manfredi Maggiore
2003 conf
CDC
Luca Consolini, Manfredi Maggiore
2002 C conf
ACC
Angelo Alessandri, Marcello Sanguineti, Manfredi Maggiore
2002 J jnl
IEEE Trans. Neural Networks
Angelo Alessandri, Marcello Sanguineti, Manfredi Maggiore
2002 conf
CDC
Angelo Alessandri, Marcello Sanguineti, Manfredi Maggiore
2002 conf
CDC
Manfredi Maggiore, Luca Consolini
2001 C conf
ACC
Manfredi Maggiore, Kevin M. Passino
2000 C conf
ACC
Manfredi Maggiore, Kevin M. Passino
2000 C conf
ACC
Manfredi Maggiore, Kevin M. Passino
2000 conf
CDC
Manfredi Maggiore, Kevin M. Passino
1998 B conf
ESANN
Angelo Alessandri, Manfredi Maggiore, Marcello Sanguineti
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