Skip to main content
`Ctrl`+`K`

Note

Go to the end to download the full example code.

# Finding disconnected links

In this example, we show how to find disconnected links in an AequilibraE network.

We use the Nauru example to find disconnected links.

See also

Several functions, methods, classes and modules are used in this example:

- `aequilibrae.paths.PathResults()`

    # Imports
    from uuid import uuid4
    from tempfile import gettempdir
    from os.path import join
    from datetime import datetime
    import pandas as pd
    import numpy as np
    from aequilibrae.utils.create_example import create_example
    from aequilibrae.paths.results import PathResults

    # We create an empty project on an arbitrary folder
    fldr = join(gettempdir(), uuid4().hex)

    # Let's use the Nauru example project for display
    project = create_example(fldr, "nauru")

    # Let's analyze the mode car or 'c' in our model
    mode = "c"

We need to create the graph, but before that, we need to have at least one centroid in our network.

    # We get an arbitrary node to set as centroid and allow for the construction of graphs
    centroid_count = project.conn.execute("select count(*) from nodes where is_centroid=1").fetchone()[0]

    if centroid_count == 0:
        arbitrary_node = project.conn.execute("select node_id from nodes limit 1").fetchone()[0]
        nodes = project.network.nodes
        nd = nodes.get(arbitrary_node)
        nd.is_centroid = 1
        nd.save()

    network = project.network
    network.build_graphs(modes=[mode])
    graph = network.graphs[mode]
    graph.set_blocked_centroid_flows(False)

    if centroid_count == 0:
        # Let's revert to setting up that node as centroid in case we had to do it

        nd.is_centroid = 0
        nd.save()

We set the graph for computation

    graph.set_graph("distance")
    graph.set_skimming("distance")

Get the nodes that are part of the car network

    missing_nodes = [
        x[0] for x in project.conn.execute(f"Select node_id from nodes where instr(modes, '{mode}')").fetchall()
    ]
    missing_nodes = np.array(missing_nodes)

And prepare the path computation structure

    res = PathResults()
    res.prepare(graph)

Now we can compute all the path islands we have

    islands = []
    idx_islands = 0

    while missing_nodes.shape[0] >= 2:
        print(datetime.now().strftime("%H:%M:%S"), f" - Computing island: {idx_islands}")
        res.reset()
        res.compute_path(missing_nodes[0], missing_nodes[1])
        res.predecessors[graph.nodes_to_indices[missing_nodes[0]]] = 0
        connected = graph.all_nodes[np.where(res.predecessors >= 0)]
        connected = np.intersect1d(missing_nodes, connected)
        missing_nodes = np.setdiff1d(missing_nodes, connected)
        print(f"    Nodes to find: {missing_nodes.shape[0]:,}")
        df = pd.DataFrame({"node_id": connected, "island": idx_islands})
        islands.append(df)
        idx_islands += 1

    print(f"\nWe found {idx_islands} islands")

    00:40:28  - Computing island: 0
        Nodes to find: 2
    00:40:28  - Computing island: 1
        Nodes to find: 0

    We found 2 islands

Let’s consolidate everything into a single DataFrame

    islands = pd.concat(islands)

    # And save to disk alongside our model
    islands.to_csv(join(fldr, "island_outputs_complete.csv"), index=False)

If you join the `node_id` field in the CSV file generated above with the `a_node` or `b_node` fields in the links table, you will have the corresponding links in each disjoint island found.

    project.close()

Total running time of the script: (0 minutes 0.165 seconds)

Gallery generated by Sphinx-Gallery