Ilkka Jormanainen

68 papers B 10C 3Misc 1Journal 19Unranked 32
YearRankTypeTitle / Venue / Authors
2025 J jnl
Educ. Inf. Technol.
Amos Oyelere Sunday, Friday Joseph Agbo, Jarkko Suhonen, Ilkka Jormanainen, Markku Tukiainen
2024 B conf
ICALT
Ilkka Jormanainen, Henriikka Vartiainen, Juho Kahila, Matti Tedre
2024 J jnl
ACM SIGCSE Bull.
Andreas Mühling, Ilkka Jormanainen
2024 J jnl
Informatics Educ.
Juho Kahila, Henriikka Vartiainen, Matti Tedre, Eetu Arkko, Anssi Lin, Nicolas Pope, Ilkka Jormanainen, Teemu Valtonen
2024 conf
SIIE
Miguel Á. Conde, Francisco Jesús Rodríguez-Sedano, Francisco J. García-Peñalvo, José Gonçalves, Ilkka Jormanainen, Andrea Anzanello, Jonny Filipe Ribeiro Alves, Raquel Fernández Hernández, Alina-Andreia Ailincai
2023 ch.
Past, Present and Future of Computing Education Research
Lauri Malmi, Arto Hellas, Petri Ihantola, Ville Isomöttönen, Ilkka Jormanainen, Terhi Kilamo, Antti Knutas, Ari Korhonen, Mikko-Jussi Laakso, Sonsoles López-Pernas, Timo Poranen, Tapio Salakoski, Jarkko Suhonen
2023 J jnl
ACM SIGCSE Bull.
Andreas Mühling, Ilkka Jormanainen
2023 J jnl
ACM SIGCSE Bull.
Andreas Mühling, Ilkka Jormanainen
2023 J jnl
ACM SIGCSE Bull.
Andreas Mühling, Ilkka Jormanainen
2023 J jnl
ACM SIGCSE Bull.
Andrew Petersen, Ilkka Jormanainen
2023 conf
ICSOB
Riina Piiroinen, Ilkka Jormanainen, Markku Tukiainen
2023 ed.
Koli Calling
Andreas Mühling, Ilkka Jormanainen
2023 C conf
EDUCON
Sahi Joshi, Friday Joseph Agbo, Ilkka Jormanainen
2022 J jnl
Syst.
Samuel Tewelde Yigzaw, Ilkka Jormanainen, Markku Tukiainen
2022 J jnl
Sensors
Annastasia Shipepe, Lannie Uwu-Khaeb, Carmen De Villiers, Ilkka Jormanainen, Erkki Sutinen
2022 conf
CHI Extended Abstracts
Tapani Toivonen, Ilkka Jormanainen, Matti Tedre, Radu Mariescu-Istodor, Teemu Valtonen, Henriikka Vartiainen, Juho Kahila
2022 ed.
Koli Calling
Ilkka Jormanainen, Andrew Petersen
2022 J jnl
ACM SIGCSE Bull.
Andrew Petersen, Ilkka Jormanainen
2022 J jnl
ACM SIGCSE Bull.
Andrew Petersen, Ilkka Jormanainen
2022 J jnl
ACM SIGCSE Bull.
Andrew Petersen, Ilkka Jormanainen
2022 conf
Koli Calling
Ismaila Temitayo Sanusi, Ilkka Jormanainen, Solomon Sunday Oyelere, Vaishali Mahipal, Fred G. Martin
2022 conf
RiE
Bjarke Kristian Maigaard Kjær Pedersen, Vuyelwa David Ruwodo, Annastasia Shipepe, Lannie Uwu-Khaeb, Samuel Tewelde Yigzaw, Ilkka Jormanainen, Jacob Nielsen, Erkki Sutinen
2021 J jnl
Int. J. Web Based Communities
Anthony-Paul Cooper, Ilkka Jormanainen, Annastasia Shipepe, Erkki Sutinen
2021 conf
TEEM
Samuel Tewelde Yigzaw, Ilkka Jormanainen, Markku Tukiainen
2021 J jnl
Int. J. Child Comput. Interact.
Henriikka Vartiainen, Tapani Toivonen, Ilkka Jormanainen, Juho Kahila, Matti Tedre, Teemu Valtonen
2021 conf
TEEM
Miguel Ángel Conde, Camino Fernández, Francisco Jesús Rodríguez-Sedano, Covadonga González-Barrientos, Maria Ramos, Manuel Jesus, José Gonçalves, Daniela Reimann, Francisco José García-Peñalvo, Ilkka Jormanainen
2021 J jnl
IEEE Access
Matti Tedre, Tapani Toivonen, Juho Kahila, Henriikka Vartiainen, Teemu Valtonen, Ilkka Jormanainen, Arnold Pears
2021 J jnl
CoRR
Matti Tedre, Tapani Toivonen, Juho Kahila, Henriikka Vartiainen, Teemu Valtonen, Ilkka Jormanainen, Arnold Pears
2021 conf
TEEM
Salseng Mrong, Ilkka Jormanainen, Tapani Toivonen
2020 conf
TEEM
Miguel Ángel Conde, Francisco Jesús Rodríguez-Sedano, Camino Fernández, María-João Ramos, Jonny Alves, Susana Celis-Tena, José Gonçalves, José Lima, Daniela Reimann, Ilkka Jormanainen, Francisco José García-Peñalvo
2020 conf
TEEM
Ilkka Jormanainen, Markku Tukiainen
2020 B conf
ICALT
Tapani Toivonen, Ilkka Jormanainen, Juho Kahila, Matti Tedre, Teemu Valtonen, Henriikka Vartiainen
2020 conf
TEEM
Annastasia Shipepe, Ilkka Jormanainen, Erkki Sutinen
2020 conf
Koli Calling
Juho Kahila, Tuomo Parkki, Anssi Gröhn, Atte Karvinen, Elmeri Telimaa, Pekka Riikonen, Riku Tiitta, Pasi Haantio, Anssi Keinänen, Tero Kerkkänen, Ilkka Jormanainen, Silja Penttinen, Matti Tedre
2020 conf
HCI (25)
Miguel Á. Conde, Francisco Jesús Rodríguez-Sedano, Camino Fernández Llamas, Manuel Jesus, María-João Ramos, Susana Celis-Tena, José Gonçalves, Ilkka Jormanainen, Francisco J. García-Peñalvo
2020 C conf
FIE
Matti Tedre, Henriikka Vartiainen, Juho Kahila, Tapani Toivonen, Ilkka Jormanainen, Teemu Valtonen
2020 C conf
FIE
Henriikka Vartiainen, Tapani Toivonen, Ilkka Jormanainen, Juho Kahila, Matti Tedre, Teemu Valtonen
2020 B conf
ICALT
Annastasia Shipepe, Ilkka Jormanainen, Marcus Duveskog, Erkki Sutinen
2019 B conf
EC-TEL
Mohammed Saqr, Jalal Nouri, Ilkka Jormanainen
2019 J jnl
Smart Learn. Environ.
Tapani Toivonen, Ilkka Jormanainen, Markku Tukiainen
2019 conf
TEEM
Alem Mare, Ilkka Jormanainen, Matti Tedre
2019 conf
TEEM
Tapani Toivonen, Ilkka Jormanainen
2019 conf
Koli Calling
Radu Mariescu-Istodor, Ilkka Jormanainen
2019 conf
TEEM
Miguel Á. Conde, Camino Fernández, Jonny Alves, María-João Ramos, Susana Celis-Tena, José Gonçalves, José Lima, Daniela Reimann, Ilkka Jormanainen, Francisco J. García-Peñalvo
2019 conf
TEEM
Samuel Tewelde Yigzaw, Ilkka Jormanainen, Markku Tukiainen
2018 conf
Koli Calling
Ilkka Jormanainen
2017 conf
AFRICON
Edward Mutafungwa, Jyri Hämäläinen, Samuel Tewelde Yigzaw, Rediet Kifle, Teklay Tesfazghi, Andrés Moreno, Marcus Duveskog, Ilkka Jormanainen
2017 conf
RiE
Tapani Toivonen, Ilkka Jormanainen, Markku Tukiainen
2016 conf
TEEM
Francisco J. García-Peñalvo, Angela Marie Rees, Jenny Hughes, Ilkka Jormanainen, Tapani Toivonen, Jens Vermeersch
2016 conf
iTAG
Meurig Beynon, Russell Boyatt, Jonathan Foss, Chris Hall, Elizabeth Hudnott, Nick Pope, Steve Russ, Hamish Macleod, Dimitris Alimisis, Rene Alimisi, Emmanouil Zoulias, Ilkka Jormanainen, Tapani Toivonen, Piet Kommers, Peter Tomcsányi, Michal Winczer
2016 conf
EDUROBOTICS
Calkin Suero Montero, Ilkka Jormanainen
2015 conf
iTAG
Meurig Beynon, Jonathan Foss, Elizabeth Hudnott, Steve Russ, Chris Hall, Russell Boyatt, Emma King, Erkki Sutinen, Ilkka Jormanainen, Carolina Islas Sedano, Andrés Moreno, Hamish Macleod, Jen Ross, Piet Kommers, Dimitris Alimisis, Emmanouil Zoulias, Rene Alimisi, Peter Tomcsányi, Michal Winczer
2015 conf
Koli Calling
Mikko Laamanen, Ilkka Jormanainen, Erkki Sutinen
2015 conf
Koli Calling
Meurig Beynon, Russell Boyatt, Ilkka Jormanainen, Andrés Moreno
2014 B conf
ICALT
Ilkka Jormanainen, Sami Pietinen, Markku Tukiainen, Tapani Innanen, Eveliina Ojala
2014 J jnl
J. Educ. Technol. Soc.
Ilkka Jormanainen, Erkki Sutinen
2013 conf
Koli Calling
Ilkka Jormanainen, Erkki Sutinen
2012 conf
DIGITEL
Ilkka Jormanainen, Erkki Sutinen
2010 conf
Koli Calling
Ilkka Jormanainen, Pauliina Korhonen
2009 Misc conf
IDC
Antony Harfield, Ilkka Jormanainen, Hassan Shujau
2009 B conf
ICALT
Ilkka Jormanainen, Antony Harfield, Erkki Sutinen
2008 B conf
ICALT
Yuejun Zhang, Kinshuk, Ilkka Jormanainen, Erkki Sutinen
2007 B conf
ICALT
Ilkka Jormanainen, Eija Kärnä-Lin, Lauri Lahti, Kaisa Pihlainen-Bednarik, Erkki Sutinen, Jorma Tarhio, Marjo Virnes
2007 conf
DIGITEL
Ilkka Jormanainen, Yuejun Zhang, Kinshuk, Erkki Sutinen
2006 B conf
ICALT
Ilkka Jormanainen, Yuejun Zhang, Erkki Sutinen, Kinshuk
2006 conf
WMTE
Ilkka Jormanainen, Chiara Moroni, Yuejun Zhang, Kinshuk, Erkki Sutinen
2006 J jnl
J. Educ. Technol. Soc.
Justus J. Randolph, Marjo Virnes, Ilkka Jormanainen, Pasi J. Eronen
2005 B conf
ICALT
Pasi J. Eronen, Ilkka Jormanainen, Erkki Sutinen, Marjo Virnes
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