Examples
This page provides comprehensive examples demonstrating how to use the Network Datasets package for various network analysis tasks.
Basic Examples
Loading and Visualizing a Dataset
from ndtools.io import dataset_paths, load_json
from ndtools.graphs import build_graph, draw_graph_from_data
from pathlib import Path
# Load the toy network dataset
nodes_path, edges_path, probs_path = dataset_paths(Path('.'), 'toynet-11edges', 'v1')
# Load data
nodes = load_json(nodes_path)
edges = load_json(edges_path)
probs = load_json(probs_path)
# Build NetworkX graph
G = build_graph(nodes, edges, probs)
print(f"Graph: {G.number_of_nodes()} nodes, {G.number_of_edges()} edges")
# Visualize the network
output_path = draw_graph_from_data(
"toynet-11edges/v1/data",
layout="spring",
with_node_labels=True,
title="Toy Network Example"
)
print(f"Graph saved to: {output_path}")
Calculating Edge Lengths
from ndtools.graphs import compute_edge_lengths
from ndtools.io import dataset_paths, load_json
from pathlib import Path
# Load dataset with spatial coordinates
nodes_path, edges_path, probs_path = dataset_paths(Path('.'), 'ema-highway', 'v1')
nodes = load_json(nodes_path)
edges = load_json(edges_path)
# Calculate edge lengths
lengths = compute_edge_lengths(nodes, edges)
# Display results
for edge_id, length in lengths.items():
print(f"Edge {edge_id}: {length:.2f} km")
System Function Evaluation
Global Connectivity Analysis
from ndtools.fun_binary_graph import eval_global_conn_k
from ndtools.graphs import build_graph
from ndtools.io import dataset_paths, load_json
from pathlib import Path
# Load dataset
nodes_path, edges_path, probs_path = dataset_paths(Path('.'), 'toynet-11edges', 'v1')
nodes = load_json(nodes_path)
edges = load_json(edges_path)
probs = load_json(probs_path)
G = build_graph(nodes, edges, probs)
# Define different failure scenarios
scenarios = [
{"name": "All working", "state": {"e1": 1, "e2": 1, "e3": 1, "e4": 1}},
{"name": "One edge failed", "state": {"e1": 0, "e2": 1, "e3": 1, "e4": 1}},
{"name": "Two edges failed", "state": {"e1": 0, "e2": 0, "e3": 1, "e4": 1}},
]
# Evaluate each scenario
for scenario in scenarios:
k_val, state, _ = eval_global_conn_k(scenario["state"], G)
print(f"{scenario['name']}: k={k_val}, System state={state}")
Travel Time Analysis
from ndtools.fun_binary_graph import eval_travel_time_to_nearest
from ndtools.graphs import build_graph, compute_edge_lengths
from ndtools.io import dataset_paths, load_json
from pathlib import Path
# Load highway dataset
nodes_path, edges_path, probs_path = dataset_paths(Path('.'), 'ema-highway', 'v1')
nodes = load_json(nodes_path)
edges = load_json(edges_path)
probs = load_json(probs_path)
# Build graph
G = build_graph(nodes, edges, probs)
# Add length attributes to edges
lengths = compute_edge_lengths(nodes, edges)
for edge_id, length in lengths.items():
if edge_id in G.edges():
G.edges[edge_id]['length'] = length
# Define origin and destinations
origin = "n1" # Replace with actual node ID
destinations = ["n5", "n10", "n15"] # Replace with actual node IDs
# Evaluate travel time under different scenarios
scenarios = [
{"name": "Normal conditions", "state": {}},
{"name": "Some roads closed", "state": {"e1": 0, "e2": 0}},
]
for scenario in scenarios:
time, state, info = eval_travel_time_to_nearest(
scenario["state"], G, origin, destinations,
avg_speed=60.0, # km/h
target_max=0.5, # 30 minutes extra
length_attr="length"
)
if time is not None:
print(f"{scenario['name']}: {time:.2f} hours, system state={state}")
else:
print(f"{scenario['name']}: No path available, system state={state}")
Advanced Examples
Monte Carlo Simulation
import random
from ndtools.fun_binary_graph import eval_global_conn_k
from ndtools.graphs import build_graph
from ndtools.io import dataset_paths, load_json
from pathlib import Path
# Load dataset
nodes_path, edges_path, probs_path = dataset_paths(Path('.'), 'toynet-11edges', 'v1')
nodes = load_json(nodes_path)
edges = load_json(edges_path)
probs = load_json(probs_path)
G = build_graph(nodes, edges, probs)
# Extract edge failure probabilities
edge_probs = {}
for edge_id, prob_data in probs.items():
if "0" in prob_data: # Failure probability
edge_probs[edge_id] = prob_data["0"]["p"]
# Run Monte Carlo simulation
n_simulations = 1000
success_count = 0
for _ in range(n_simulations):
# Generate random component states
comps_state = {}
for edge_id, fail_prob in edge_probs.items():
comps_state[edge_id] = 0 if random.random() < fail_prob else 1
# Evaluate system performance
k_val, state, _ = eval_global_conn_k(comps_state, G)
if state < 2: # Example threshold of global connectivity as 2
success_count += 1
reliability = success_count / n_simulations
print(f"System reliability: {reliability:.3f}")
Custom Visualisation
import matplotlib.pyplot as plt
import networkx as nx
from ndtools.graphs import build_graph
from ndtools.io import dataset_paths, load_json
from pathlib import Path
# Load dataset
nodes_path, edges_path, probs_path = dataset_paths(Path('.'), 'toynet-11edges', 'v1')
nodes = load_json(nodes_path)
edges = load_json(edges_path)
probs = load_json(probs_path)
G = build_graph(nodes, edges, probs)
# Create custom visualization
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(15, 6))
# Left plot: Normal conditions
pos = nx.spring_layout(G)
nx.draw(G, pos, ax=ax1, with_labels=True, node_color='lightblue',
node_size=500, font_size=8)
ax1.set_title("Normal Conditions")
# Right plot: With edge failures
failed_edges = ["e1", "e2"] # Example failed edges
G_failed = G.copy()
G_failed.remove_edges_from([(u, v) for u, v, d in G.edges(data=True)
if d.get('eid') in failed_edges])
nx.draw(G_failed, pos, ax=ax2, with_labels=True, node_color='lightcoral',
node_size=500, font_size=8)
ax2.set_title("With Edge Failures")
plt.tight_layout()
plt.savefig("custom_visualization.png", dpi=300)
plt.show()
Data Validation
import jsonschema
from ndtools.io import load_json
from pathlib import Path
def validate_dataset(dataset_path):
"""Validate a dataset against JSON schemas."""
data_path = Path(dataset_path) / "v1" / "data"
# Load schemas
with open("schema/nodes.schema.json") as f:
nodes_schema = json.load(f)
with open("schema/edges.schema.json") as f:
edges_schema = json.load(f)
with open("schema/probs.schema.json") as f:
probs_schema = json.load(f)
# Load and validate data
try:
nodes = load_json(data_path / "nodes.json")
jsonschema.validate(nodes, nodes_schema)
print("✓ Nodes data is valid")
edges = load_json(data_path / "edges.json")
jsonschema.validate(edges, edges_schema)
print("✓ Edges data is valid")
probs = load_json(data_path / "probs.json")
jsonschema.validate(probs, probs_schema)
print("✓ Probabilities data is valid")
return True
except jsonschema.ValidationError as e:
print(f"✗ Validation error: {e}")
return False
except FileNotFoundError as e:
print(f"✗ File not found: {e}")
return False
# Validate all datasets
datasets = ["toynet-11edges", "distribution-substation-liang2022", "ema-highway"]
for dataset in datasets:
print(f"\nValidating {dataset}:")
validate_dataset(dataset)
Jupyter Notebook Examples
The repository includes several Jupyter notebooks with interactive examples:
distribution_substation_liang2022/v1/scripts/demo_sys_fun.ipynb- Evaluation of a subsystem network’s maximum capacitydistribution_substation_liang2022/v1/scripts/demo_edge_prob_update.ipynb- Failure probability updates of edges, provided a peak ground acceleration (PGA) valueema_highway/v1/scripts/add_edge_attrs.ipynb- Adding lengths as edge attributes for network evaluation purposes