GHC.Data.Graph.Directed.Reachability

ghc-lib-parser-9.14.1.20251220: The GHC API, decoupled from GHC versions

Safe Haskell | Ignore
Language | GHC2021

GHC.Data.Graph.Directed.Reachability

Contents

- Constructing a reachability index
- Reachability queries
- Debugging

Description

An abstract interface for a fast reachability data structure constructed from a `Directed` graph.

Synopsis

- data ReachabilityIndex node
- graphReachability :: Graph node -> ReachabilityIndex node
- cyclicGraphReachability :: Graph node -> ReachabilityIndex node
- allReachable :: ReachabilityIndex node -> node -> [node]
- allReachableMany :: ReachabilityIndex node -> [node] -> [node]
- isReachable :: ReachabilityIndex node -> node -> node -> Bool
- isReachableMany :: ReachabilityIndex node -> [node] -> node -> Bool
- reachabilityIndexMembers :: ReachabilityIndex node -> [node]

# Documentation

data ReachabilityIndex node #

The abstract data structure for fast reachability queries

# Constructing a reachability index

graphReachability :: Graph node -> ReachabilityIndex node #

Construct a `ReachabilityIndex` from an acyclic `Graph`. If the graph can have cycles, use `cyclicGraphReachability`

cyclicGraphReachability :: Graph node -> ReachabilityIndex node #

Construct a `ReachabilityIndex` from a `Graph` which may have cycles. If this reachability index is just going to be used once, it may make sense to use `reachablesG` instead, which will traverse the reachable nodes without constructing the index -- which may be faster.

# Reachability queries

allReachable #

Arguments

:: ReachabilityIndex node |
-> node | The `root` node
-> [node] | All nodes reachable from `root`

`allReachable` returns the nodes reachable from the given `root` node.

Properties: * The list of nodes does not include the `root` node! * The list of nodes is deterministically ordered, but according to an internal order determined by the indices attributed to graph nodes.

If you need a topologically sorted list, consider using the functions exposed from `Directed` on `Graph` instead.

allReachableMany #

Arguments

:: ReachabilityIndex node |
-> [node] | The `roots`
-> [node] | All nodes reachable from all `roots`

`allReachableMany` returns all nodes reachable from the many given `roots`.

Properties: * The list of nodes does not include the `roots` node! * The list of nodes is deterministically ordered, but according to an internal order determined by the indices attributed to graph nodes. * This function has $O(n)$ complexity where $n$ is the number of `roots`.

If you need a topologically sorted list, consider using the functions exposed from `Directed` on `Graph` instead (`reachableG`).

isReachable #

Arguments

:: ReachabilityIndex node |
    g
-> node |
    a
-> node |
    b
-> Bool | `b` is reachable from `a`

Fast reachability query.

On graph `g` with nodes `a` and `b`, `isReachable g a b` asks whether `b` can be reached through `g` starting from `a`.

Properties: * No self loops, i.e. `isReachable _ a a == False`

isReachableMany #

Arguments

:: ReachabilityIndex node |
    g
-> [node] |
    roots
-> node | `b` is reachable from any of the `roots`
-> Bool |

Fast reachability query with many roots.

On graph `g` with many nodes `roots` and node `b`, `isReachableMany g as b` asks whether `b` can be reached through `g` from any of the `roots`.

By partially applying this function to a set of roots, the resulting function can be applied many times and share the initial work.

Properties: * No self loops, i.e. `isReachableMany _ [a] a == False`

# Debugging

reachabilityIndexMembers :: ReachabilityIndex node -> [node] #