Manuel Giuliani

86 papers A* 5A 4B 22C 1Journal 21Unranked 30
YearRankTypeTitle / Venue / Authors
2026 conf
HRI Companion
Pascal Haberkorn, Corinna Mack, Manuel Giuliani
2026 conf
HRI Companion
Leimin Tian, Ana Kirschbaum, Caterina Neef, Mary Ellen Foster, Sara Cooper, Frauke Zeller, Manuel Giuliani, Alexander Eberhard, Oliver Chojnowski, Nils Mandischer, Utku Norman, Jan Ole Rixen, Pamela Carreno-Medrano, Nick Hawes, Dana Kulic
2025 J jnl
Int. J. Soc. Robotics
Chatchai Chirapornchai, Faatihah Niyi-Odumosu, Manuel Giuliani, Paul Bremner
2025 J jnl
Int. J. Soc. Robotics
Chatchai Chirapornchai, Faatihah Niyi-Odumosu, Manuel Giuliani, Paul Bremner
2025 J jnl
Int. J. Soc. Robotics
Mehdi Sobhani, Manuel Giuliani, Jim Smith, Anthony G. Pipe, Angelika Peer
2025 A* conf
HRI
Leimin Tian, Pamela Carreno-Medrano, Manuel Giuliani, Nick Hawes, Raunak Bhattacharyya, Dana Kulic
2025 conf
TAROS
Alperen Kenan, Sahar Sadeghi Kordkheili, Juan Jose Garcia Cardenas, Alessandro Melone, Changda Tian, Haichuan Li, Hamidreza Raei, Sasanka Kuruppu Arachchige, Yifeng Tang, Adriana Tapus, Aníbal Ollero, Arash Ajudani, Begoña C. Arrue, Dimitrios Papageorgiou, Joni-Kristian Kämäräinen, Jukka Heikkonen, Luis Figueredo, Manuel Giuliani, Panos E. Trahanias, Paul Bremner, Saeed Rafee Nekoo, Simon Watson, Tomi Westerlund
2025 conf
SSRR
Changda Tian, Sasanka Kuruppu Arachchige, Haichuan Li, Juan Jose Garcia Cardenas, Hamidreza Raei, Enes Ulas Dincer, Alperen Kenan, Paul Bremner, Manuel Giuliani, Gerhard Neumann, Arash Ajoudani, Adriana Tapus, Tomi Westerlund, Joni-Kristian Kämäräinen, Luis Figueredo, Simon Watson, Panos E. Trahanias
2025 A conf
IROS
Alperen Kenan, Paul Bremner, Manuel Giuliani
2025 J jnl
Frontiers Robotics AI
Joseph Bolarinwa, Manuel Giuliani, Paul Bremner
2024 J jnl
Frontiers Robotics AI
Mohammed Shabaj Ahmed, Manuel Giuliani, Ute Leonards, Paul Bremner
2024 A conf
IROS
Dominic Murphy, Manuel Giuliani, Paul Bremner
2024 conf
HRI (Companion)
Mohammed Shabaj Ahmed, Manuel Giuliani, Paul Bremner
2024 conf
HRI (Companion)
Nicola Webb, Manuel Giuliani, Séverin Lemaignan
2024 J jnl
J. Field Robotics
Paul Dominick E. Baniqued, Paul Bremner, Melissa Sandison, Samuel Harper, Subham Agrawal, Joseph Bolarinwa, Jamie Blanche, Zhengyi Jiang, Thomas Johnson, Daniel Mitchell, Erwin Jose Lopez Pulgarin, Andrew West, Melissa Willis, Kanzhong Yao, David Flynn, Manuel Giuliani, Keir Groves, Barry Lennox, Simon Watson
2024 conf
ICSR + AI
Mohammed Shabaj Ahmed, Manuel Giuliani, Ute Leonards, Angela Higgins, Paul Bremner
2023 conf
TAROS
Dominic Murphy, Manuel Giuliani, Paul Bremner
2023 J jnl
Frontiers Robotics AI
Chie Takahashi, Barry Lennox, Claudio Semini, Manuel Giuliani, Young Soo Park, William R. Hamel
2023 B conf
RO-MAN
Nicola Webb, Manuel Giuliani, Séverin Lemaignan
2023 J jnl
Frontiers Robotics AI
Frank Förster, Marta Romeo, Patrick Holthaus, Luke J. Wood, Christian Dondrup, Joel E. Fischer, Farhana Ferdousi Liza, Sara Kaszuba, Julian Hough, Birthe Nesset, Daniel Hernández García, Dimosthenis Kontogiorgos, Jennifer Williams, Elif Ecem Özkan, Pepita Barnard, Gustavo Berumen, Dominic Price, Sue Cobb, Martina Wiltschko, Lucien Tisserand, Martin Porcheron, Manuel Giuliani, Gabriel Skantze, Patrick G. T. Healey, Ioannis Papaioannou, Dimitra Gkatzia, Saul Albert, Guanyu Huang, Vladislav Maraev, Epaminondas Kapetanios
2022 conf
INFOCOM Workshops
Joseph Bolarinwa, Alex Smith, Adnan Aijaz, Aleksandar Stanoev, Manuel Giuliani
2022 J jnl
CoRR
Joseph Bolarinwa, Alex Smith, Adnan Aijaz, Aleksandar Stanoev, Manuel Giuliani
2022 conf
SSRR
Joseph Bolarinwa, Alex Smith, Adnan Aijaz, Aleksandar Stanoev, Mahesh Sooriyabandara, Manuel Giuliani
2022 J jnl
CoRR
Joseph Bolarinwa, Alex Smith, Adnan Aijaz, Aleksandar Stanoev, Mahesh Sooriyabandara, Manuel Giuliani
2022 J jnl
Frontiers Robotics AI
Paul Bremner, Manuel Giuliani
2022 conf
TAROS
Jennifer David, Thomas Bridgwater, Andrew West, Barry Lennox, Manuel Giuliani
2022 B conf
RO-MAN
Nicola Webb, Manuel Giuliani, Séverin Lemaignan
2022 J jnl
ACM Trans. Hum. Robot Interact.
Christopher D. Wallbridge, Alex Smith, Manuel Giuliani, Chris Melhuish, Tony Belpaeme, Séverin Lemaignan
2022 conf
SSRR
Mehdi Sobhani, Alex Smith, Manuel Giuliani, Tony Pipe
2022 B conf
RO-MAN
Bethany Ann Mackey, Paul Bremner, Manuel Giuliani
2022 B conf
RO-MAN
Chatchai Chirapornchai, Faatihah Niyi-Odumosu, Manuel Giuliani, Paul Bremner
2021 B conf
ICSR
Dito Eka Cahya, Manuel Giuliani
2021 J jnl
Frontiers Robotics AI
Chie Takahashi, Manuel Giuliani, Barry Lennox, William R. Hamel, Rustam Stolkin, Claudio Semini
2020 A* conf
HRI
Thomas Bridgwater, Manuel Giuliani, Anouk van Maris, Greg Baker, Alan F. T. Winfield, Tony Pipe
2020 conf
HRI (Companion)
Bethany Ann Mackey, Paul A. Bremner, Manuel Giuliani
2020 J jnl
Frontiers Robotics AI
Daniel Carrillo-Zapata, Emma Milner, Julian Hird, Georgios Tzoumas, Paul J. Vardanega, Mahesh Sooriyabandara, Manuel Giuliani, Alan F. T. Winfield, Sabine Hauert
2020 B conf
RO-MAN
Luc Wijnen, Paul Bremner, Séverin Lemaignan, Manuel Giuliani
2020 conf
HRI (Companion)
Bethany Ann Mackey, Paul A. Bremner, Manuel Giuliani
2020 J jnl
CoRR
Greg Baker, Tom Bridgwater, Paul Bremner, Manuel Giuliani
2019 conf
TAROS (1)
Craig West, Farshad Arvin, Wei Cheah, Andrew West, Simon Watson, Manuel Giuliani, Barry Lennox
2019 B conf
ICSR
Dito Eka Cahya, Rahul Ramakrishnan, Manuel Giuliani
2018 conf
TAROS
Lenka Pitonakova, Manuel Giuliani, Anthony G. Pipe, Alan F. T. Winfield
2018 ed.
TAROS
Manuel Giuliani, Tareq Assaf, Maria Elena Giannaccini
2017 J jnl
Int. J. Soc. Robotics
Mary Ellen Foster, Andre Gaschler, Manuel Giuliani
2017 conf
HRI (Companion)
Nicole Mirnig, Gerald Stollnberger, Manuel Giuliani, Manfred Tscheligi
2017 B conf
ICMI
Pauline Trung, Manuel Giuliani, Michael Miksch, Gerald Stollnberger, Susanne Stadler, Nicole Mirnig, Manfred Tscheligi
2017 conf
HRI (Companion)
Susanne Stadler, Nicole Mirnig, Manuel Giuliani, Manfred Tscheligi, Zdenek Materna, Michal Kapinus
2017 conf
HRI (Companion)
Kevin Sebastian Kain, Susanne Stadler, Manuel Giuliani, Nicole Mirnig, Gerald Stollnberger, Manfred Tscheligi
2017 J jnl
Frontiers Robotics AI
Nicole Mirnig, Gerald Stollnberger, Markus Miksch, Susanne Stadler, Manuel Giuliani, Manfred Tscheligi
2017 conf
HRI (Companion)
Zdenek Materna, Michal Kapinus, Vítezslav Beran, Pavel Smrz, Manuel Giuliani, Nicole Mirnig, Susanne Stadler, Gerald Stollnberger, Manfred Tscheligi
2016 B conf
RO-MAN
Susanne Stadler, Kevin Sebastian Kain, Manuel Giuliani, Nicole Mirnig, Gerald Stollnberger, Manfred Tscheligi
2016 C conf
HSI
Krzysztof Arent, Janusz Jakubiak, Michal Drwiega, Mateusz Cholewinski, Gerald Stollnberger, Manuel Giuliani, Manfred Tscheligi, Dorota Szczesniak-Stanczyk, Marcin Janowski, Wojciech Brzozowski, Andrzej Wysokinski
2016 B conf
RO-MAN
Gerald Stollnberger, Manuel Giuliani, Nicole Mirnig, Manfred Tscheligi, Krzysztof Arent, Bogdan Kreczmer, Filip Grzeszczak, Dorota Szczesniak-Stanczyk, Radoslaw Zarczuk, Andrzej Wysokinski
2016 B conf
RO-MAN
Nicole Mirnig, Susanne Stadler, Gerald Stollnberger, Manuel Giuliani, Manfred Tscheligi
2016 B conf
RO-MAN
Gerald Stollnberger, Christiane Moser, Manuel Giuliani, Susanne Stadler, Manfred Tscheligi, Dorota Szczesniak-Stanczyk, Bartlomiej Stanczyk
2015 J jnl
Signal Process.
Guang Chen, Daniel Clarke, Manuel Giuliani, Andre Gaschler, Alois C. Knoll
2015 conf
INTERACT (4)
Martin Murer, Alexander Meschtscherjakov, Verena Fuchsberger, Manuel Giuliani, Katja Neureiter, Christiane Moser, Ilhan Aslan, Manfred Tscheligi
2015 B conf
ICSR
Nicole Mirnig, Manuel Giuliani, Gerald Stollnberger, Susanne Stadler, Roland Buchner, Manfred Tscheligi
2014 A* conf
ICRA
Guang Chen, Manuel Giuliani, Daniel Clarke, Andre Gaschler, Alois C. Knoll
2014 conf
MMRWHRI@ICMI
Manuel Giuliani, Thomas Marschall, Manfred Tscheligi
2014 J jnl
IEEE Trans. Hum. Mach. Syst.
Abolfazl Zaraki, Daniele Mazzei, Manuel Giuliani, Danilo De Rossi
2014 A* conf
HRI
Sebastian Loth, Manuel Giuliani, Jan P. de Ruiter
2014 B conf
RO-MAN
Simon Keizer, Mary Ellen Foster, Andre Gaschler, Manuel Giuliani, Amy Isard, Oliver Lemon
2014 conf
APSIPA
Alina Roitberg, Alexander Clifford Perzylo, Nikhil Somani, Manuel Giuliani, Markus Rickert, Alois C. Knoll
2014 B conf
ICMI
Mary Ellen Foster, Manuel Giuliani, Ronald P. A. Petrick
2014 conf
ECCV Workshops (1)
Guang Chen, Daniel Clarke, Manuel Giuliani, Andre Gaschler, Di Wu, David Weikersdorfer, Alois C. Knoll
2014 ed.
MMRWHRI@ICMI
Mary Ellen Foster, Manuel Giuliani, Ronald P. A. Petrick
2014 conf
SIGDIAL Conference
Manuel Giuliani, Thomas Marschall, Amy Isard
2013 B conf
ICMI
Manuel Giuliani, Ronald P. A. Petrick, Mary Ellen Foster, Andre Gaschler, Amy Isard, Maria Pateraki, Markos Sigalas
2013 B conf
ICMI
Mary Ellen Foster, Andre Gaschler, Manuel Giuliani
2013 A conf
IROS
Andre Gaschler, Ronald P. A. Petrick, Manuel Giuliani, Markus Rickert, Alois C. Knoll
2013 conf
SIGDIAL Conference
Simon Keizer, Mary Ellen Foster, Oliver Lemon, Andre Gaschler, Manuel Giuliani
2013 B conf
ICSR
Guang Chen, Feihu Zhang, Manuel Giuliani, Christian Buckl, Alois C. Knoll
2013 J jnl
Int. J. Soc. Robotics
Manuel Giuliani, Alois C. Knoll
2012 A conf
IROS
Andre Gaschler, Soren Jentzsch, Manuel Giuliani, Kerstin Huth, Jan P. de Ruiter, Alois C. Knoll
2012 B conf
ICMI
Mary Ellen Foster, Andre Gaschler, Manuel Giuliani, Amy Isard, Maria Pateraki, Ronald P. A. Petrick
2011
Manuel Giuliani
2011 B conf
ICSR
Manuel Giuliani, Alois C. Knoll
2010 J jnl
Int. J. Soc. Robotics
Manuel Giuliani, Claus Lenz, Thomas Müller, Markus Rickert, Alois C. Knoll
2010 B conf
INLG
Manuel Giuliani, Mary Ellen Foster, Amy Isard, Colin Matheson, Jon Oberlander, Alois C. Knoll
2009 conf
ACL/IJCNLP
Mary Ellen Foster, Manuel Giuliani, Alois C. Knoll
2009 A* conf
IJCAI
Mary Ellen Foster, Manuel Giuliani, Amy Isard, Colin Matheson, Jon Oberlander, Alois C. Knoll
2008 B conf
ICMI
Manuel Giuliani, Alois C. Knoll
2007 conf
HCI (6)
Markus Rickert, Mary Ellen Foster, Manuel Giuliani, Tomas By, Giorgio Panin, Alois C. Knoll
2007 conf
HCI (6)
Manuel Giuliani, Alois C. Knoll
2006 conf
ISCSLP (Selected Papers)
Manuel Giuliani, Tin Lay Nwe, Haizhou Li
redb/extractors/decompiler/bninja/analysis/cfg.py
← Index redb/extractors/decompiler/bninja/analysis/cfg.py python
from binaryninja.enums import LowLevelILOperation as LLIL_OP

# Support both package and standalone imports
try:
    from . import cfg_features
except ImportError:
    from redb.extractors.decompiler.bninja.analysis import cfg_features


# ---------------------------------------------------------------------------
# Task 2.2: Build LLIL operation maps at import time using real enum values
# ---------------------------------------------------------------------------

# Prime product map: LLIL operation integer value -> small prime
cfg_features.LLIL_OP_PRIMES = {
    # SET_REG, SET_REG_SPLIT
    LLIL_OP.LLIL_SET_REG.value: 2,
    LLIL_OP.LLIL_SET_REG_SPLIT.value: 2,
    # SET_FLAG
    LLIL_OP.LLIL_SET_FLAG.value: 3,
    # LOAD
    LLIL_OP.LLIL_LOAD.value: 5,
    # STORE
    LLIL_OP.LLIL_STORE.value: 7,
    # PUSH, POP
    LLIL_OP.LLIL_PUSH.value: 11,
    LLIL_OP.LLIL_POP.value: 13,
    # CALL, TAILCALL, SYSCALL
    LLIL_OP.LLIL_CALL.value: 17,
    LLIL_OP.LLIL_TAILCALL.value: 17,
    LLIL_OP.LLIL_SYSCALL.value: 19,
    # RET, NORET
    LLIL_OP.LLIL_RET.value: 23,
    LLIL_OP.LLIL_NORET.value: 23,
    # IF, GOTO
    LLIL_OP.LLIL_IF.value: 29,
    LLIL_OP.LLIL_GOTO.value: 31,
    # ADD, SUB
    LLIL_OP.LLIL_ADD.value: 37,
    LLIL_OP.LLIL_SUB.value: 41,
    # AND, OR, XOR
    LLIL_OP.LLIL_AND.value: 43,
    LLIL_OP.LLIL_OR.value: 47,
    LLIL_OP.LLIL_XOR.value: 53,
    # LSL, LSR, ASR, ROL, ROR
    LLIL_OP.LLIL_LSL.value: 59,
    LLIL_OP.LLIL_LSR.value: 61,
    LLIL_OP.LLIL_ASR.value: 67,
    LLIL_OP.LLIL_ROL.value: 71,
    LLIL_OP.LLIL_ROR.value: 73,
    # MUL, DIVU, DIVS, MODU, MODS
    LLIL_OP.LLIL_MUL.value: 79,
    LLIL_OP.LLIL_DIVU.value: 83,
    LLIL_OP.LLIL_DIVS.value: 83,
    LLIL_OP.LLIL_MODU.value: 89,
    LLIL_OP.LLIL_MODS.value: 89,
    # NEG, NOT
    LLIL_OP.LLIL_NEG.value: 97,
    LLIL_OP.LLIL_NOT.value: 101,
    # CMP_E, CMP_NE, CMP_SLT, CMP_ULT, CMP_SLE, CMP_ULE
    # CMP_SGT, CMP_UGT, CMP_SGE, CMP_UGE
    LLIL_OP.LLIL_CMP_E.value: 103,
    LLIL_OP.LLIL_CMP_NE.value: 103,
    LLIL_OP.LLIL_CMP_SLT.value: 107,
    LLIL_OP.LLIL_CMP_ULT.value: 107,
    LLIL_OP.LLIL_CMP_SLE.value: 109,
    LLIL_OP.LLIL_CMP_ULE.value: 109,
    LLIL_OP.LLIL_CMP_SGT.value: 113,
    LLIL_OP.LLIL_CMP_UGT.value: 113,
    LLIL_OP.LLIL_CMP_SGE.value: 127,
    LLIL_OP.LLIL_CMP_UGE.value: 127,
    # NOP
    LLIL_OP.LLIL_NOP.value: 1,
    # SX, ZX, LOW_PART, BOOL_TO_INT
    LLIL_OP.LLIL_SX.value: 131,
    LLIL_OP.LLIL_ZX.value: 137,
    LLIL_OP.LLIL_LOW_PART.value: 139,
    LLIL_OP.LLIL_BOOL_TO_INT.value: 149,
    # JUMP, JUMP_TO
    LLIL_OP.LLIL_JUMP.value: 151,
    LLIL_OP.LLIL_JUMP_TO.value: 151,
}

# Category map: LLIL operation integer value -> category index
_ARITHMETIC = {
    LLIL_OP.LLIL_ADD, LLIL_OP.LLIL_ADC, LLIL_OP.LLIL_SUB, LLIL_OP.LLIL_SBB,
    LLIL_OP.LLIL_MUL, LLIL_OP.LLIL_MULU_DP, LLIL_OP.LLIL_MULS_DP,
    LLIL_OP.LLIL_DIVU, LLIL_OP.LLIL_DIVU_DP, LLIL_OP.LLIL_DIVS,
    LLIL_OP.LLIL_DIVS_DP, LLIL_OP.LLIL_MODU, LLIL_OP.LLIL_MODS,
    LLIL_OP.LLIL_NEG,
}
_LOGIC = {
    LLIL_OP.LLIL_AND, LLIL_OP.LLIL_OR, LLIL_OP.LLIL_XOR, LLIL_OP.LLIL_NOT,
    LLIL_OP.LLIL_LSL, LLIL_OP.LLIL_LSR, LLIL_OP.LLIL_ASR,
    LLIL_OP.LLIL_ROL, LLIL_OP.LLIL_RLC, LLIL_OP.LLIL_ROR, LLIL_OP.LLIL_RRC,
}
_TRANSFER = {
    LLIL_OP.LLIL_SET_REG, LLIL_OP.LLIL_SET_REG_SPLIT, LLIL_OP.LLIL_SET_FLAG,
    LLIL_OP.LLIL_GOTO, LLIL_OP.LLIL_IF, LLIL_OP.LLIL_JUMP, LLIL_OP.LLIL_JUMP_TO,
    LLIL_OP.LLIL_RET, LLIL_OP.LLIL_NORET, LLIL_OP.LLIL_PUSH, LLIL_OP.LLIL_POP,
}
_CALL = {
    LLIL_OP.LLIL_CALL, LLIL_OP.LLIL_TAILCALL, LLIL_OP.LLIL_SYSCALL,
}
_COMPARISON = {
    LLIL_OP.LLIL_CMP_E, LLIL_OP.LLIL_CMP_NE,
    LLIL_OP.LLIL_CMP_SLT, LLIL_OP.LLIL_CMP_ULT,
    LLIL_OP.LLIL_CMP_SLE, LLIL_OP.LLIL_CMP_ULE,
    LLIL_OP.LLIL_CMP_SGE, LLIL_OP.LLIL_CMP_UGE,
    LLIL_OP.LLIL_CMP_SGT, LLIL_OP.LLIL_CMP_UGT,
    LLIL_OP.LLIL_TEST_BIT, LLIL_OP.LLIL_FLAG_COND,
}
_MEMORY = {
    LLIL_OP.LLIL_LOAD, LLIL_OP.LLIL_STORE,
}

cfg_features.LLIL_OP_CATEGORIES = {}
for _op in _ARITHMETIC:
    cfg_features.LLIL_OP_CATEGORIES[_op.value] = cfg_features.CAT_ARITHMETIC
for _op in _LOGIC:
    cfg_features.LLIL_OP_CATEGORIES[_op.value] = cfg_features.CAT_LOGIC
for _op in _TRANSFER:
    cfg_features.LLIL_OP_CATEGORIES[_op.value] = cfg_features.CAT_TRANSFER
for _op in _CALL:
    cfg_features.LLIL_OP_CATEGORIES[_op.value] = cfg_features.CAT_CALL
for _op in _COMPARISON:
    cfg_features.LLIL_OP_CATEGORIES[_op.value] = cfg_features.CAT_COMPARISON
for _op in _MEMORY:
    cfg_features.LLIL_OP_CATEGORIES[_op.value] = cfg_features.CAT_MEMORY

# Set of CALL operation values for counting
_CALL_OPS = {op.value for op in _CALL}


# ---------------------------------------------------------------------------
# Task 2.1 + 2.3: Rewritten CFGAnalysis
# ---------------------------------------------------------------------------

class CFGAnalysis:
    def __init__(self, function, llil_function=None):
        self.function = function
        self.llil_function = llil_function

    def extract_function_cfg(self):
        """Extract function-level CFG features as a flat dictionary."""

        if self.function is None:
            return None

        blocks = list(self.function.basic_blocks)
        if not blocks:
            return None

        n = len(blocks)

        # 1. Build index-based adjacency from Binary Ninja blocks
        addr_to_idx = {b.start: i for i, b in enumerate(blocks)}
        successors = [[] for _ in range(n)]
        predecessors = [[] for _ in range(n)]
        for i, block in enumerate(blocks):
            for edge in block.outgoing_edges:
                if edge.target is None:
                    continue
                target_idx = addr_to_idx.get(edge.target.start)
                if target_idx is not None:
                    successors[i].append(target_idx)
                    predecessors[target_idx].append(i)

        # 2. BFS order (reusable across multiple features)
        bfs = cfg_features.bfs_order(successors, n)

        # 3. Collect per-block LLIL operations (for prime product + ACFG features)
        block_llil_ops = self._collect_block_llil_ops(blocks, addr_to_idx, n)
        all_llil_ops = [op for block_ops in block_llil_ops for op in block_ops]

        # 4. Structural counts
        edge_count = sum(len(s) for s in successors)
        total_llil = sum(len(ops) for ops in block_llil_ops)
        call_count = sum(
            1 for ops in block_llil_ops for op in ops
            if op in _CALL_OPS
        )

        # 5. Compute all features
        bb_features = cfg_features.build_block_features(block_llil_ops, successors, n)

        return {
            "cfg_topology_hash": cfg_features.compute_topology_hash(successors, bfs, n),
            "block_count": n,
            "edge_count": edge_count,
            "llil_total_operations": total_llil,
            "call_count": call_count,
            "cyclomatic_complexity": edge_count - n + 2,
            "loop_count": cfg_features.count_back_edges(successors, n),
            "max_depth": cfg_features.bfs_max_depth(successors, n),
            "max_fan_out": max((len(s) for s in successors), default=0),
            "md_index_topdown": cfg_features.compute_md_index_topdown(successors, predecessors, bfs),
            "md_index_bottomup": cfg_features.compute_md_index_bottomup(successors, predecessors, n),
            "prime_product_llil": cfg_features.compute_prime_product(all_llil_ops),
            "cfg_feature_tlsh": cfg_features.compute_cfg_feature_tlsh(bb_features, bfs),
            "wl_minhash": cfg_features.compute_wl_minhash(successors, predecessors, bb_features, n),
            "bb_features": bb_features,
            "cfg_adjacency": cfg_features.pack_adjacency(successors),
        }

    def _collect_block_llil_ops(self, blocks, addr_to_idx, n):
        """
        Collect LLIL operation integers per native basic block.
        Walks the full expression tree of each instruction so that
        nested operations (e.g. ADD inside SET_REG) are captured.
        Returns list of n lists, one per block.
        """
        block_ops = [[] for _ in range(n)]

        if self.llil_function is None:
            return block_ops

        try:
            for llil_block in self.llil_function.basic_blocks:
                # Map LLIL block to native block via source_block
                if llil_block.source_block is not None:
                    native_idx = addr_to_idx.get(llil_block.source_block.start)
                    if native_idx is not None:
                        for instr in llil_block:
                            self._walk_llil_ops(instr, block_ops[native_idx])
        except Exception:
            pass  # Return empty ops — LLIL-dependent fields will be 0/null

        return block_ops

    @staticmethod
    def _walk_llil_ops(expr, ops_list):
        """Collect operation values from an LLIL expression tree iteratively."""
        stack = [expr]
        while stack:
            node = stack.pop()
            if hasattr(node, 'operation'):
                ops_list.append(node.operation.value)
            if hasattr(node, 'operands'):
                for operand in node.operands:
                    if hasattr(operand, 'operation'):
                        stack.append(operand)