Xi Chen

209 papers A* 56A 12B 4C 2Misc 4Journal 115Unranked 11
YearRankTypeTitle / Venue / Authors
2026 J jnl
CoRR
Xi Chen, William Pires, Toniann Pitassi, Rocco A. Servedio
2026 A* conf
SODA
Xi Chen, Anindya De, Yizhi Huang, Shivam Nadimpalli, Rocco A. Servedio, Tianqi Yang
2026 J jnl
CoRR
Xi Chen, Yuhao Li, Mihalis Yannakakis
2026 J jnl
SIAM J. Comput.
Xi Chen, Yuhao Li, Mihalis Yannakakis
2026 A conf
ITCS
Julian Asilis, Xi Chen, Dutch Hansen, Shang-Hua Teng
2025 J jnl
CoRR
Xi Chen, Shyamal Patel, Rocco A. Servedio
2025 J jnl
J. ACM
Xi Chen, Yuhao Li, Mihalis Yannakakis
2025 J jnl
CoRR
Xi Chen, Anindya De, Yizhi Huang, Shivam Nadimpalli, Rocco A. Servedio, Tianqi Yang
2025 A* conf
SODA
Xi Chen, Anindya De, Shivam Nadimpalli, Rocco A. Servedio, Erik Waingarten
2025 J jnl
CoRR
Xi Chen, Anindya De, Yizhi Huang, Shivam Nadimpalli, Rocco A. Servedio, Tianqi Yang
2025 A* conf
STOC
Deeparnab Chakrabarty, Xi Chen, Simeon Ristic, C. Seshadhri, Erik Waingarten
2025 J jnl
CoRR
Deeparnab Chakrabarty, Xi Chen, Simeon Ristic, C. Seshadhri, Erik Waingarten
2025 J jnl
ACM Trans. Algorithms
Xi Chen, Anindya De, Chin Ho Lee, Rocco A. Servedio, Sandip Sinha
2025 A* conf
ICALP
Xi Chen, William Pires, Toniann Pitassi, Rocco A. Servedio
2025 A* conf
SODA
Xi Chen, Anindya De, Yizhi Huang, Yuhao Li, Shivam Nadimpalli, Rocco A. Servedio, Tianqi Yang
2025 J jnl
CoRR
Xi Chen, William Pires, Toniann Pitassi, Rocco A. Servedio
2025 J jnl
CoRR
Xi Chen, Diptaksho Palit, Kabir Peshawaria, William Pires, Rocco A. Servedio, Yiding Zhang
2025 J jnl
CoRR
Julian Asilis, Xi Chen, Dutch Hansen, Shang-Hua Teng
2025 A* conf
COLT
Xi Chen, William Pires, Toniann Pitassi, Rocco A. Servedio
2025 J jnl
CoRR
Xi Chen, William Pires, Toniann Pitassi, Rocco A. Servedio
2025 A conf
ESA
Xi Chen, Shivam Nadimpalli, Tim Randolph, Rocco A. Servedio, Or Zamir
2024 A* conf
STOC
Xi Chen, Yuhao Li, Mihalis Yannakakis
2024 J jnl
CoRR
Xi Chen, Yuhao Li, Mihalis Yannakakis
2024 J jnl
Electron. Colloquium Comput. Complex.
Xi Chen, Yuhao Li, Mihalis Yannakakis
2024 A* conf
STOC
Xi Chen, Yumou Fei, Shyamal Patel
2024 J jnl
CoRR
Xi Chen, Anindya De, Shivam Nadimpalli, Rocco A. Servedio, Erik Waingarten
2024 A* conf
SODA
Xi Chen, Anindya De, Yuhao Li, Shivam Nadimpalli, Rocco A. Servedio
2024 J jnl
CoRR
Xi Chen, Anindya De, Yizhi Huang, Yuhao Li, Shivam Nadimpalli, Rocco A. Servedio, Tianqi Yang
2024 A* conf
SODA
Xi Chen, Chenghao Guo, Emmanouil V. Vlatakis-Gkaragkounis, Mihalis Yannakakis
2024 A conf
ITCS
Xi Chen, Anindya De, Yuhao Li, Shivam Nadimpalli, Rocco A. Servedio
2024 J jnl
CoRR
Xi Chen, Shivam Nadimpalli, Tim Randolph, Rocco A. Servedio, Or Zamir
2024 J jnl
Math. Oper. Res.
Xi Chen, Christian Kroer, Rachitesh Kumar
2024 A conf
APPROX/RANDOM
Xi Chen, Anindya De, Chin Ho Lee, Rocco A. Servedio
2024 J jnl
CoRR
Xi Chen, Anindya De, Chin Ho Lee, Rocco A. Servedio
2024 A* conf
SODA
Xi Chen, Cassandra Marcussen
2023 A* conf
SODA
Xi Chen, Anindya De, Chin Ho Lee, Rocco A. Servedio, Sandip Sinha
2023 A* conf
STOC
Xi Chen, Binghui Peng
2023 J jnl
CoRR
Xi Chen, Binghui Peng
2023 J jnl
CoRR
Xi Chen, Binghui Peng
2023 J jnl
CoRR
Xi Chen, Anindya De, Yuhao Li, Shivam Nadimpalli, Rocco A. Servedio
2023 A conf
CCC
Xi Chen, Yuhao Li, Mihalis Yannakakis
2023 J jnl
Electron. Colloquium Comput. Complex.
Xi Chen, Yuhao Li, Mihalis Yannakakis
2023 J jnl
CoRR
Xi Chen, Chenghao Guo, Emmanouil V. Vlatakis-Gkaragkounis, Mihalis Yannakakis
2023 A* conf
STOC
Xi Chen, Vincent Cohen-Addad, Rajesh Jayaram, Amit Levi, Erik Waingarten
2023 A conf
APPROX/RANDOM
Xi Chen, Yaonan Jin, Tim Randolph, Rocco A. Servedio
2023 J jnl
CoRR
Xi Chen, Yaonan Jin, Tim Randolph, Rocco A. Servedio
2023 J jnl
CoRR
Xi Chen, Anindya De, Yuhao Li, Shivam Nadimpalli, Rocco A. Servedio
2022 J jnl
ACM Trans. Algorithms
Xi Chen, Tim Randolph, Rocco A. Servedio, Timothy Sun
2022 J jnl
CoRR
Xi Chen, Anindya De, Chin Ho Lee, Rocco A. Servedio, Sandip Sinha
2022 A* conf
SODA
Xi Chen, Yaonan Jin, Tim Randolph, Rocco A. Servedio
2022 A* conf
SODA
Thomas Chen, Xi Chen, Binghui Peng, Mihalis Yannakakis
2022 A* conf
EC
Xi Chen, Yuhao Li
2022 J jnl
CoRR
Xi Chen, Yuhao Li
2022 A* conf
FOCS
Xi Chen, Christos H. Papadimitriou, Binghui Peng
2022 J jnl
CoRR
Xi Chen, Christos H. Papadimitriou, Binghui Peng
2022 A* conf
SODA
Xi Chen, Anindya De, Chin Ho Lee, Rocco A. Servedio, Sandip Sinha
2022 A* conf
STOC
Xi Chen, Rajesh Jayaram, Amit Levi, Erik Waingarten
2022 J jnl
SIAM J. Comput.
Xi Chen, Ilias Diakonikolas, Anthi Orfanou, Dimitris Paparas, Xiaorui Sun, Mihalis Yannakakis
2022 A* conf
STOC
Xi Chen, Binghui Peng
2022 J jnl
CoRR
Jingfan Yu, Mengqian Zhang, Xi Chen, Zhixuan Fang
2022 J jnl
CoRR
Vincent Cohen-Addad, Xi Chen, Rajesh Jayaram, Amit Levi, Erik Waingarten
2021 J jnl
CoRR
Xi Chen, Yaonan Jin, Tim Randolph, Rocco A. Servedio
2021 J jnl
CoRR
Thomas Chen, Xi Chen, Binghui Peng, Mihalis Yannakakis
2021 A* conf
COLT
Xi Chen, Rajesh Jayaram, Amit Levi, Erik Waingarten
2021 J jnl
CoRR
Xi Chen, Anindya De, Chin Ho Lee, Rocco A. Servedio, Sandip Sinha
2021 J jnl
CoRR
Xi Chen, Rajesh Jayaram, Amit Levi, Erik Waingarten
2021 J jnl
CoRR
Xi Chen, Binghui Peng
2021 A conf
ITCS
Xi Chen, Anindya De, Chin Ho Lee, Rocco A. Servedio, Sandip Sinha
2021 A* conf
SODA
Xi Chen, Anindya De, Chin Ho Lee, Rocco A. Servedio, Sandip Sinha
2021 A* conf
SODA
Clément L. Canonne, Xi Chen, Gautam Kamath, Amit Levi, Erik Waingarten
2021 A* conf
EC
Xi Chen, Christian Kroer, Rachitesh Kumar
2021 J jnl
CoRR
Xi Chen, Christian Kroer, Rachitesh Kumar
2021 conf
WINE
Xi Chen, Christian Kroer, Rachitesh Kumar
2021 J jnl
CoRR
Xi Chen, Christian Kroer, Rachitesh Kumar
2020 A* conf
SODA
Xi Chen, Tim Randolph, Rocco A. Servedio, Timothy Sun
2020 A* conf
NeurIPS
Xi Chen, Binghui Peng
2020 J jnl
CoRR
Xi Chen, Binghui Peng
2020 J jnl
CoRR
Xi Chen, Rajesh Jayaram, Amit Levi, Erik Waingarten
2020 A* conf
SODA
Xi Chen, Amit Levi, Erik Waingarten
2020 J jnl
CoRR
Xi Chen, Anindya De, Chin Ho Lee, Rocco A. Servedio, Sandip Sinha
2020 J jnl
CoRR
Xi Chen, Anindya De, Chin Ho Lee, Rocco A. Servedio, Sandip Sinha
2020 A* conf
STOC
Xi Chen, Chenghao Guo, Emmanouil V. Vlatakis-Gkaragkounis, Mihalis Yannakakis, Xinzhi Zhang
2019 J jnl
CoRR
Xi Chen, Tim Randolph, Rocco A. Servedio, Timothy Sun
2019 J jnl
Comput. Complex.
Jin-Yi Cai, Xi Chen
2019 B conf
AFT
Xi Chen, Christos H. Papadimitriou, Tim Roughgarden
2019 J jnl
CoRR
Xi Chen, Christos H. Papadimitriou, Tim Roughgarden
2019 A* conf
FOCS
Frank Ban, Xi Chen, Adam Freilich, Rocco A. Servedio, Sandip Sinha
2019 J jnl
CoRR
Frank Ban, Xi Chen, Adam Freilich, Rocco A. Servedio, Sandip Sinha
2019 conf
NAACL-HLT (2)
Wei Yang, Luchen Tan, Chunwei Lu, Anqi Cui, Han Li, Xi Chen, Kun Xiong, Muzi Wang, Ming Li, Jian Pei, Jimmy Lin
2019 J jnl
ACM Trans. Algorithms
Zhengyang Liu, Xi Chen, Rocco A. Servedio, Ying Sheng, Jinyu Xie
2019 conf
APPROX-RANDOM
Frank Ban, Xi Chen, Rocco A. Servedio, Sandip Sinha
2019 J jnl
CoRR
Frank Ban, Xi Chen, Rocco A. Servedio, Sandip Sinha
2019 J jnl
CoRR
Xi Chen, Amit Levi, Erik Waingarten
2019 J jnl
CoRR
Clément L. Canonne, Xi Chen, Gautam Kamath, Amit Levi, Erik Waingarten
2019 J jnl
Electron. Colloquium Comput. Complex.
Clément L. Canonne, Xi Chen, Gautam Kamath, Amit Levi, Erik Waingarten
2019 J jnl
CoRR
Xi Chen, Chenghao Guo, Emmanouil V. Vlatakis-Gkaragkounis, Mihalis Yannakakis, Xinzhi Zhang
2019 J jnl
CoRR
Xi Chen, Erik Waingarten
2019 A* conf
STOC
Xi Chen, Erik Waingarten
2018 J jnl
CoRR
Xi Chen, Zhengyang Liu, Rocco A. Servedio, Ying Sheng, Jinyu Xie
2018 A* conf
STOC
Zhengyang Liu, Xi Chen, Rocco A. Servedio, Ying Sheng, Jinyu Xie
2018 A* conf
SODA
Xi Chen, George Matikas, Dimitris Paparas, Mihalis Yannakakis
2018 J jnl
J. ACM
Xi Chen, Rocco A. Servedio, Li-Yang Tan, Erik Waingarten, Jinyu Xie
2018 J jnl
Games Econ. Behav.
Xi Chen, Ilias Diakonikolas, Dimitris Paparas, Xiaorui Sun, Mihalis Yannakakis
2017 conf
APPROX-RANDOM
Xi Chen, Rocco A. Servedio, Li-Yang Tan, Erik Waingarten
2017 J jnl
CoRR
Xi Chen, Rocco A. Servedio, Li-Yang Tan, Erik Waingarten
2017 A* conf
STOC
Xi Chen, Igor C. Oliveira, Rocco A. Servedio
2017 J jnl
CoRR
Xi Chen, Erik Waingarten, Jinyu Xie
2017 A* conf
STOC
Xi Chen, Erik Waingarten, Jinyu Xie
2017 J jnl
CoRR
Xi Chen, Erik Waingarten, Jinyu Xie
2017 A* conf
FOCS
Xi Chen, Erik Waingarten, Jinyu Xie
2017 J jnl
J. ACM
Jin-Yi Cai, Xi Chen
2017 J jnl
CoRR
Xi Chen, George Matikas, Dimitris Paparas, Mihalis Yannakakis
2017 conf
APPROX-RANDOM
Xi Chen, Adam Freilich, Rocco A. Servedio, Timothy Sun
2017 J jnl
CoRR
Xi Chen, Adam Freilich, Rocco A. Servedio, Timothy Sun
2017 A conf
CCC
Xi Chen, Rocco A. Servedio, Li-Yang Tan, Erik Waingarten, Jinyu Xie
2017 J jnl
CoRR
Xi Chen, Rocco A. Servedio, Li-Yang Tan, Erik Waingarten, Jinyu Xie
2017 J jnl
Electron. Colloquium Comput. Complex.
Xi Chen, Rocco A. Servedio, Li-Yang Tan, Erik Waingarten, Jinyu Xie
2017 J jnl
J. ACM
Xi Chen, Dimitris Paparas, Mihalis Yannakakis
2017 A conf
ITCS
Xi Chen, Yu Cheng, Bo Tang
2016 J jnl
Electron. Colloquium Comput. Complex.
Xi Chen, Yu Cheng, Bo Tang
2016 ch.
Encyclopedia of Algorithms
Jin-Yi Cai, Xi Chen, Pinyan Lu
2016 A* conf
STOC
Xi Chen, Igor C. Oliveira, Rocco A. Servedio, Li-Yang Tan
2016 ch.
Encyclopedia of Algorithms
Xi Chen, Xiaotie Deng
2016 J jnl
SIAM J. Comput.
Jin-Yi Cai, Xi Chen, Pinyan Lu
2016 conf
NIPS
Xi Chen, Yu Cheng, Bo Tang
2016 A* conf
SODA
Xi Chen, Jinyu Xie
2015 J jnl
CoRR
Xi Chen, Igor C. Oliveira, Rocco A. Servedio
2015 J jnl
Electron. Colloquium Comput. Complex.
Xi Chen, Igor Carboni Oliveira, Rocco A. Servedio
2015 A* conf
STOC
Xi Chen, Anindya De, Rocco A. Servedio, Li-Yang Tan
2015 J jnl
CoRR
Xi Chen, Igor C. Oliveira, Rocco A. Servedio, Li-Yang Tan
2015 A* conf
STOC
Xi Chen, David Durfee, Anthi Orfanou
2015 A* conf
FOCS
Xi Chen, Ilias Diakonikolas, Anthi Orfanou, Dimitris Paparas, Xiaorui Sun, Mihalis Yannakakis
2015 J jnl
J. Comput. Syst. Sci.
Xi Chen, Martin E. Dyer, Leslie Ann Goldberg, Mark Jerrum, Pinyan Lu, Colin McQuillan, David Richerby
2015 J jnl
CoRR
Xi Chen, Jinyu Xie
2015 J jnl
CoRR
Xi Chen, Yu Cheng, Bo Tang
2014 J jnl
CoRR
Xi Chen, Anindya De, Rocco A. Servedio, Li-Yang Tan
2014 A* conf
FOCS
Xi Chen, Rocco A. Servedio, Li-Yang Tan
2014 J jnl
CoRR
Xi Chen, Rocco A. Servedio, Li-Yang Tan
2014 J jnl
CoRR
Xi Chen, David Durfee, Anthi Orfanou
2014 A* conf
SODA
Xi Chen, Ilias Diakonikolas, Dimitris Paparas, Xiaorui Sun, Mihalis Yannakakis
2013 A* conf
FOCS
László Babai, Xi Chen, Xiaorui Sun, Shang-Hua Teng, John Wilmes
2013 J jnl
SIAM J. Comput.
Jin-Yi Cai, Xi Chen, Pinyan Lu
2013 J jnl
SIAM J. Comput.
Boaz Barak, Mark Braverman, Xi Chen, Anup Rao
2013 A* conf
STOC
Xi Chen, Xiaorui Sun, Shang-Hua Teng
2013 J jnl
CoRR
Xi Chen, Ilias Diakonikolas, Dimitris Paparas, Xiaorui Sun, Mihalis Yannakakis
2013 A conf
STACS
Xi Chen, Martin E. Dyer, Leslie Ann Goldberg, Mark Jerrum, Pinyan Lu, Colin McQuillan, David Richerby
2013 A* conf
STOC
Xi Chen, Dimitris Paparas, Mihalis Yannakakis
2012 A* conf
STOC
Jin-Yi Cai, Xi Chen
2012 J jnl
CoRR
Jin-Yi Cai, Xi Chen, Heng Guo, Pinyan Lu
2012 C conf
COCOA
Jin-Yi Cai, Xi Chen, Heng Guo, Pinyan Lu
2012 J jnl
CoRR
Xi Chen, Dimitris Paparas, Mihalis Yannakakis
2012 J jnl
CoRR
Xi Chen, Martin E. Dyer, Leslie Ann Goldberg, Mark Jerrum, Pinyan Lu, Colin McQuillan, David Richerby
2011 A conf
ICS
Xi Chen, Shang-Hua Teng
2011 J jnl
CoRR
Jin-Yi Cai, Xi Chen
2011 J jnl
SIGACT News
Xi Chen
2011 A conf
CCC
Jin-Yi Cai, Xi Chen, Pinyan Lu
2011 J jnl
Algorithmica
Xi Chen, Xiaotie Deng, Becky Jie Liu
2011 J jnl
Found. Trends Theor. Comput. Sci.
Xi Chen, Neeraj Kayal, Avi Wigderson
2010 J jnl
CoRR
Xi Chen, Shang-Hua Teng
2010 J jnl
CoRR
Jin-Yi Cai, Xi Chen
2010 A* conf
FOCS
Jin-Yi Cai, Xi Chen
2010 conf
ICALP (1)
Jin-Yi Cai, Xi Chen, Pinyan Lu
2010 A* conf
STOC
Boaz Barak, Mark Braverman, Xi Chen, Anup Rao
2010 J jnl
CoRR
Jin-Yi Cai, Xi Chen, Pinyan Lu
2010 J jnl
CoRR
Jin-Yi Cai, Xi Chen, Richard J. Lipton, Pinyan Lu
2010 Misc conf
FAW
Jin-Yi Cai, Xi Chen, Richard J. Lipton, Pinyan Lu
2010 conf
BQGT
Xi Chen, Decheng Dai, Ye Du, Shang-Hua Teng
2010 J jnl
Comput. Complex.
Jin-Yi Cai, Xi Chen, Dong Li
2010 J jnl
Algorithmica
Xi Chen, Xiaoming Sun, Shang-Hua Teng
2009 J jnl
Algorithmica
Xi Chen, Xiaotie Deng
2009 J jnl
Electron. Colloquium Comput. Complex.
Boaz Barak, Mark Braverman, Xi Chen, Anup Rao
2009 J jnl
CoRR
Jin-Yi Cai, Xi Chen, Pinyan Lu
2009 J jnl
Theor. Comput. Sci.
Xi Chen, Li-Sha Huang, Shang-Hua Teng
2009 J jnl
Theor. Comput. Sci.
Xi Chen, Xiaotie Deng
2009 J jnl
CoRR
Xi Chen, Decheng Dai, Ye Du, Shang-Hua Teng
2009 A* conf
FOCS
Xi Chen, Decheng Dai, Ye Du, Shang-Hua Teng
2009 J jnl
J. ACM
Xi Chen, Xiaotie Deng, Shang-Hua Teng
2009 B conf
ISAAC
Xi Chen, Shang-Hua Teng
2009 J jnl
CoRR
Xi Chen, Shang-Hua Teng
2008 A* conf
STOC
Jin-Yi Cai, Xi Chen, Dong Li
2008 ch.
Encyclopedia of Algorithms
Xi Chen, Xiaotie Deng
2008 ch.
Encyclopedia of Algorithms
Xi Chen, Xiaotie Deng
2008 J jnl
J. ACM
Xi Chen, Xiaotie Deng
2008 ch.
Encyclopedia of Algorithms
Xi Chen, Xiaotie Deng
2008 Misc conf
COCOON
Xi Chen, Xiaoming Sun, Shang-Hua Teng
2007 J jnl
Theor. Comput. Sci.
Lan Liu, Xi Chen, Jing Xiao, Tao Jiang
2007 B conf
CPM
Jing Zhang, Xi Chen, Ming Li
2007 J jnl
Theor. Comput. Sci.
Yongxi Cheng, Xi Chen, Yiqun Lisa Yin
2007 J jnl
CoRR
Xi Chen, Shang-Hua Teng
2007 A* conf
FOCS
Xi Chen, Shang-Hua Teng
2007 J jnl
Comput. Sci. Rev.
Xi Chen, Xiaotie Deng
2007 J jnl
CoRR
Xi Chen, Xiaotie Deng, Shang-Hua Teng
2007 A* conf
SODA
Xi Chen, Shang-Hua Teng, Paul Valiant
2006 Misc conf
COCOON
Xi Chen, Xiaotie Deng
2006 J jnl
CoRR
Xi Chen, Xiaotie Deng, Shang-Hua Teng
2006 A* conf
FOCS
Xi Chen, Xiaotie Deng, Shang-Hua Teng
2006 J jnl
Electron. Colloquium Comput. Complex.
Xi Chen, Xiaotie Deng, Shang-Hua Teng
2006 C conf
AAIM
Xi Chen, Xiaotie Deng
2006 conf
WINE
Xi Chen, Li-Sha Huang, Shang-Hua Teng
2006 Misc conf
COCOON
Xi Chen, Xiaotie Deng, Becky Jie Liu
2006 conf
ICALP (1)
Xi Chen, Xiaotie Deng
2006 J jnl
Electron. Colloquium Comput. Complex.
Xi Chen, Xiaotie Deng
2006 A* conf
FOCS
Xi Chen, Xiaotie Deng
2006 conf
WINE
Xi Chen, Xiaotie Deng, Shang-Hua Teng
2005 J jnl
Electron. Colloquium Comput. Complex.
Xi Chen, Xiaotie Deng
2005 B conf
ISAAC
Lan Liu, Xi Chen, Jing Xiao, Tao Jiang
2005 J jnl
CoRR
Yongxi Cheng, Xi Chen, Yiqun Lisa Yin
2005 A* conf
STOC
Xi Chen, Xiaotie Deng
2005 J jnl
Electron. Colloquium Comput. Complex.
Xi Chen, Xiaotie Deng
redb/extractors/decompiler/bninja/analysis/cfg-old.py
← Index redb/extractors/decompiler/bninja/analysis/cfg-old.py python
from collections import deque
from enum import Enum

from binaryninja.enums import (
    BranchType,
    InstructionTextTokenType,
)

# Support both package and standalone imports
try:
    from ..utils.hashes import calculate_md5, calculate_sha256
except ImportError:
    # Fallback to absolute imports (for multiprocessing spawned processes)
    from redb.extractors.decompiler.bninja.utils.hashes import calculate_md5, calculate_sha256


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

    def determine_block_type(self, block) -> str:
        """Determine the type of a basic block."""
        # Check if it's a thunk function (usually just a jump or call)
        if len(block.disassembly_text) <= 2 and any(
            "jmp" in line.tokens[0].text.lower() for line in block.disassembly_text
        ):
            return "THUNK"

        # Check if it contains only data (no valid instructions)
        if all(not line.tokens for line in block.disassembly_text):
            return "DATA"

        # Default to code
        return "CODE"

    def extract_cyclomatic_complexity(self):
        """
        Cyclomatic complexity (McCabe’s metric) measures the number of linearly independent paths
        through a function’s control flow graph (CFG).
        The standard formula is:

            M = E - N + 2

        where:
            - E = number of edges in the CFG
            - N = number of nodes (basic blocks)
            - 2 accounts for the entry and exit nodes of a single connected graph
        """
        if self.function is None:
            return 0

        # number of basic blocks
        num_blocks = len(self.function.basic_blocks)
        # number of edges in the graph
        num_edges = sum(
            len(basic_block.outgoing_edges)
            for basic_block in self.function.basic_blocks
        )
        return num_edges - num_blocks + 2

    def extract_function_cfg(self):
        """Extract information about a function CFG and return it as a dictionary."""

        function = self.function
        function_data = {
            "function_address": self.function.start,
            "blocks": [],
            "measures": {
                "cyclomatic_complexity": self.extract_cyclomatic_complexity(),
            },
        }

        if self.function is None:
            return function_data

        # Get the map of the depth associated to every block
        depths = self.get_map_depth()

        # Get the map of the positions associated to every block
        id_maps = self.get_block_id_map()

        # Extract block data with graph structure information
        for block in function.basic_blocks:
            # dominators per every block translated
            dominators = sorted(self.extract_dominators(block, id_maps))

            # post dominators
            post_dominators = sorted(self.extract_post_dominators(block, id_maps))

            # Build block instructions string
            block_instructions = "\n".join(str(line) for line in block.disassembly_text)

            # Determine block type
            block_type = self.determine_block_type(block)

            # Extract successors directly from basic block
            successor_blocks = [edge.target.start for edge in block.outgoing_edges]
            # We ensure a canonical order and we sort the edges
            successor_blocks.sort()

            # Extract predecessors directly from basic block
            predecessor_blocks = [edge.source.start for edge in block.incoming_edges]
            # We ensure a canonical order and we sort the edges
            predecessor_blocks.sort()

            # Determine branch type from outgoing edges
            branch_type = self.determine_branch_type(block)

            instructions_count = len(block.disassembly_text)

            # Create block record
            block_json = {
                "function_address": self.function.start,
                "block_start_address": block.start,
                "block_end_address": block.end,
                "block_size": block.end - block.start,
                "instructions_count": instructions_count,
                "block_instructions_hash": calculate_sha256(block_instructions),
                "predecessor_blocks": predecessor_blocks,
                "successor_blocks": successor_blocks,
                "depth": depths[block.start],
                "position": id_maps[block.start],
                "branch_type": branch_type,
                "block_type": block_type,
                "flags": self.extract_block_flags(block),
                "dominators": dominators,
                "post_dominators": post_dominators,
            }
            function_data["blocks"].append(block_json)

        return function_data

    def extract_dominators(self, bb, id_maps):
        """Extract the dominators normalized"""
        dom_idx = [id_maps[d.start] for d in bb.dominators]
        return dom_idx

    def extract_post_dominators(self, bb, id_maps):
        """Extract the post-dominators normalized"""
        post_dom_idx = [id_maps[d.start] for d in bb.post_dominators]
        return post_dom_idx

    def determine_branch_type(self, block):
        """
        Determine the type of branch at the end of a basic block.
        This combines edge type information with instruction analysis.
        """
        # If no outgoing edges, it might be a return or terminal block
        if not block.outgoing_edges:
            # Check if the last instruction is a return
            for line in reversed(list(block.disassembly_text)):
                if line.tokens and any(
                    token.text.lower() in ["ret", "retn"] for token in line.tokens
                ):
                    return "RETURN"
            return "UNKNOWN"

        # Collect branch types from all outgoing edges
        branch_types = []
        for edge in block.outgoing_edges:
            edge_type = edge.type
            # Map edge type to our branch type enum
            if isinstance(edge_type, str):
                if edge_type == "IndirectCall":
                    branch_types.append("CALL")
                else:
                    branch_types.append("UNKNOWN")
            else:
                # Use our mapping for integer/enum values
                type_mapping = {
                    BranchType.UnconditionalBranch: "DIRECT",
                    BranchType.FalseBranch: "CONDITIONAL",
                    BranchType.TrueBranch: "CONDITIONAL",
                    BranchType.CallDestination: "CALL",
                    BranchType.FunctionReturn: "RETURN",
                    BranchType.SystemCall: "CALL",
                    BranchType.IndirectBranch: "INDIRECT",
                    BranchType.ExceptionBranch: "UNKNOWN",
                    BranchType.UnresolvedBranch: "UNKNOWN",
                    BranchType.UserDefinedBranch: "UNKNOWN",
                }
                branch_types.append(type_mapping.get(edge_type, "UNKNOWN"))

        # Determine overall branch type (prioritize CALL > RETURN > CONDITIONAL > DIRECT)
        if "CALL" in branch_types:
            return "CALL"
        elif "RETURN" in branch_types:
            return "RETURN"
        elif "CONDITIONAL" in branch_types:
            return "CONDITIONAL"
        elif "DIRECT" in branch_types:
            return "DIRECT"
        elif len(block.outgoing_edges) == 1:
            return "FALLTHROUGH"

        # If edge analysis was inconclusive, fall back to instruction analysis
        last_instr = None
        for line in reversed(list(block.disassembly_text)):
            if line.tokens:
                last_instr = line
                break

        if last_instr:
            mnemonic = None
            for token in last_instr.tokens:
                if token.type == InstructionTextTokenType.InstructionToken:
                    mnemonic = token.text.lower()
                    break

            if mnemonic:
                if mnemonic == "call":
                    return "CALL"
                elif mnemonic == "jmp":
                    return "DIRECT"
                elif mnemonic.startswith("j") and mnemonic != "jmp":
                    return "CONDITIONAL"
                elif mnemonic in ["ret", "retn"]:
                    return "RETURN"

        return "UNKNOWN"

    def get_map_depth(self):
        """
        Run a BFS on the basic blocks of the function to assign a depth to every block
        """

        depths = {}
        entry = self.function.get_basic_block_at(self.function.start)

        ### Simple BFS
        q = deque()
        q.append(entry)
        depths[entry.start] = 0

        while q:
            b = q.popleft()
            b_depth = depths[b.start]
            for edge in b.outgoing_edges:
                tgt = edge.target

                if tgt is None:
                    continue

                if tgt.start not in depths:
                    depths[tgt.start] = b_depth + 1
                    q.append(tgt)

        return depths

    def get_block_id_map(self):
        """
        Assign a unique, sequential ID to each basic block of the function using a BFS starting from the entry block.
        """

        id_map = {}
        entry = self.function.get_basic_block_at(self.function.start)

        q = deque()
        q.append(entry)

        current_id = 0
        id_map[entry.start] = current_id

        while q:
            b = q.popleft()
            for edge in b.outgoing_edges:
                tgt = edge.target

                if tgt is None:
                    continue

                if tgt.start not in id_map:
                    current_id += 1
                    id_map[tgt.start] = current_id
                    q.append(tgt)

        return id_map

    def extract_block_flags(self, block):
        """
        Get the flags for every basic block. Currently, we implemented these heuristics:
            - if a basic block is the entry node for a function
            - if a basic block is the exit block for a function
            - if a basic block is part of a natural loop
        """
        flags = []

        if block.start == self.function.start:
            flags.append(BlockFlags.EntryBlock.value)

        if any(edge.type == BranchType.FunctionReturn for edge in block.outgoing_edges):
            flags.append(BlockFlags.ExitBlock.value)

        # if this block is in its dominance frontier, then it's part of a natural loop
        if block in block.dominance_frontier:
            flags.append(BlockFlags.LoopBlock.value)

        return flags


class BlockFlags(Enum):
    # generally, the basic block identifying the entry point of the function
    EntryBlock = "EntryBlock"
    # any basic blocks that makes the control flow exiting from the current function
    ExitBlock = "ExitBlock"
    # any block is in a natural loop if it is in its own dominance frontier
    LoopBlock = "LoopBlock"


class BlockType(Enum):
    THUNK = "THUNK"
    DATA = "DATA"
    PADDING = "PADDING"
    CODE = "CODE"