Partitioning#
Partitioning strategies for network clustering.
Geographical Partitioning#
- class npap.partitioning.geographical.GeographicalConfig[source]
Bases:
objectConfiguration parameters for geographical partitioning.
- random_state
Random seed for reproducibility in stochastic algorithms.
- Type:
- max_iter
Maximum iterations for iterative algorithms (K-means, K-medoids).
- Type:
- n_init
Number of initializations for K-means.
- Type:
- hierarchical_linkage
Linkage criterion for hierarchical clustering (‘ward’ for Euclidean, or ‘complete’/’average’/’single’).
- Type:
- infinite_distance
Value used to represent “infinite” distance between nodes in different AC islands. Using a large finite value instead of np.inf to avoid numerical issues in clustering algorithms.
- Type:
-
random_state:
int= 42
-
max_iter:
int= 300
-
n_init:
int= 10
-
hierarchical_linkage:
str= 'ward'
-
infinite_distance:
float= 10000.0
- class npap.partitioning.geographical.GeographicalPartitioning[source]
Bases:
PartitioningStrategyPartition nodes based on geographical distance.
This strategy clusters nodes based on their spatial coordinates using various clustering algorithms. It supports both Euclidean distance (for projected coordinates) and Haversine distance (for lat/lon coordinates).
- AC-Island Awareness:
When the graph contains data with DC links (nodes have given ‘ac_island’ attribute), the strategy automatically respects AC island boundaries by assigning infinite distance between nodes in different AC islands.
Note: K-means and hierarchical with ‘ward’ linkage cannot support AC-island awareness because they use raw coordinates instead of precomputed distances. When AC islands are detected with these algorithms, a warning is issued recommending alternative algorithms.
- Supported algorithms:
‘kmeans’: K-Means clustering (Euclidean only, fast, no AC-island support)
‘kmedoids’: K-Medoids clustering (any metric, robust to outliers, AC-island aware)
‘dbscan’: DBSCAN density-based clustering (automatic cluster count, AC-island aware)
‘hierarchical’: Agglomerative hierarchical clustering (AC-island aware except ward)
‘hdbscan’: HDBSCAN density-based clustering (automatic cluster count, AC-island aware)
Configuration can be provided at: - Instantiation time (via config parameter in __init__) - Partition time (via config or individual parameters in partition())
Partition-time parameters override instance defaults for that call only.
- Attributes:
required_attributesRequired node attributes for geographical partitioning.
Methods
partition(graph, **kwargs)Partition nodes based on geographical coordinates.
- SUPPORTED_ALGORITHMS = ['kmeans', 'kmedoids', 'dbscan', 'hierarchical', 'hdbscan']
- SUPPORTED_DISTANCE_METRICS = ['euclidean', 'haversine']
- AC_ISLAND_AWARE_ALGORITHMS = ['kmedoids', 'dbscan', 'hdbscan']
- __init__(algorithm='kmeans', distance_metric='euclidean', ac_island_attr='ac_island', config=None)[source]
Initialize geographical partitioning strategy.
- Parameters:
algorithm (
str, default'kmeans') – Clustering algorithm (‘kmeans’, ‘kmedoids’, ‘dbscan’, ‘hierarchical’, ‘hdbscan’).distance_metric (
str, default'euclidean') – Distance metric (‘haversine’, ‘euclidean’).ac_island_attr (
str, default'ac_island') – Node attribute name containing AC island ID.config (
GeographicalConfig, optional) – Configuration parameters for the algorithm.
- Raises:
ValueError – If unsupported algorithm or distance metric specified.
- property required_attributes: dict[str, list[str]]
Required node attributes for geographical partitioning.
- partition(graph, **kwargs)[source]
Partition nodes based on geographical coordinates.
Automatically detects and respects AC island boundaries when the graph contains voltage-aware data (nodes have ‘ac_island’ attribute). When AC islands are detected, infinite distance is assigned between nodes in different AC islands.
- Parameters:
graph (
nx.Graph) – NetworkX graph with lat, lon attributes on nodes.**kwargs (
dict) –Additional parameters:
n_clusters : Number of clusters (required for kmeans, kmedoids, hierarchical)
eps : Epsilon (required for dbscan)
min_samples : Minimum samples (required for dbscan)
min_cluster_size : Minimum cluster size for HDBSCAN (default: 5)
config : GeographicalConfig instance to override instance config
random_state : Override config parameter
max_iter : Override config parameter
n_init : Override config parameter
hierarchical_linkage : Override config parameter
infinite_distance : Override config parameter
- Returns:
Dictionary mapping cluster_id -> list of node_ids.
- Return type:
dict[int,list[Any]]- Raises:
PartitioningError – If partitioning fails.
Electrical Distance Partitioning#
- class npap.partitioning.electrical.ElectricalDistanceConfig[source]
Bases:
objectConfiguration parameters for electrical distance calculations.
Centralizes all magic numbers and tolerances used in the electrical distance partitioning algorithm for better maintainability and tuning.
- zero_reactance_replacement
Reactance value used when edge reactance is zero.
- Type:
- regularization_factor
Small value added to B matrix diagonal for numerical stability. Set to 0.0 to disable regularization. Default 1e-10 provides mild regularization that prevents singular matrix issues.
- Type:
- infinite_distance
Value used to represent “infinite” distance between AC islands.
- Type:
-
zero_reactance_replacement:
float= 1e-05
-
regularization_factor:
float= 1e-10
-
infinite_distance:
float= 10000.0
- class npap.partitioning.electrical.ElectricalDistancePartitioning[source]
Bases:
PartitioningStrategyPartition nodes based on electrical distance using PTDF in power networks.
This strategy uses the Power Transfer Distribution Factor (PTDF) approach to calculate electrical distances between nodes. The electrical distance is derived from the Euclidean distance between PTDF column vectors, which represents how similarly power injections at different nodes affect line flows.
- Mathematical basis:
Build incidence matrix K from directed network topology
Remove slack bus column to get K_sba (slack-bus-adjusted)
Calculate susceptance matrix B = K_sba^T · diag{b} · K_sba
Compute PTDF = diag{b} · K_sba · B^(-1)
Electrical distance: d_ij = ||PTDF[:,i] - PTDF[:,j]||_2
- Multi AC-Island Support:
Networks with multiple AC islands (AC zones connected via HVDC) are handled by computing PTDF matrices independently for each island: 1. Group nodes by AC island 2. Select/detect slack bus per island 3. Extract AC-only subgraph per island (lines + transformers, no DC links) 4. Compute PTDF and distances per island 5. Combine into block-diagonal distance matrix with infinite inter-island distances
This is physically correct because PTDF describes AC power flow behavior, and DC links decouple the AC dynamics between islands.
- Configuration can be provided at:
Instantiation time (via config parameter in __init__)
Partition time (via config or individual parameters in partition())
Partition-time parameters override instance defaults for that call only.
- Attributes:
required_attributesRequired attributes for electrical distance partitioning.
Methods
partition(graph, **kwargs)Partition nodes based on electrical distance using PTDF.
- SUPPORTED_ALGORITHMS = ['kmeans', 'kmedoids']
- AC_EDGE_TYPES = {'line', 'trafo'}
- __init__(algorithm='kmeans', slack_bus=None, ac_island_attr='ac_island', config=None)[source]
Initialize electrical distance partitioning strategy.
- Parameters:
algorithm (
str, default'kmeans') – Clustering algorithm (‘kmeans’, ‘kmedoids’).slack_bus (
Any, optional) – Specific node to use as slack bus (applied to its island), or None for auto-selection per island.ac_island_attr (
str, default'ac_island') – Node attribute name containing AC island ID.config (
ElectricalDistanceConfig, optional) – Configuration parameters for distance calculations.
- Raises:
ValueError – If unsupported algorithm is specified.
- property required_attributes: dict[str, list[str]]
Required attributes for electrical distance partitioning.
- partition(graph, **kwargs)[source]
Partition nodes based on electrical distance using PTDF.
- Parameters:
graph (
nx.DiGraph) – NetworkX DiGraph with reactance data on AC edges and ac_island on nodes.**kwargs (
dict) –Additional parameters:
n_clusters : Number of clusters (required)
random_state : Random seed for reproducibility
max_iter : Maximum iterations for clustering
config : ElectricalDistanceConfig instance to override instance config
slack_bus : Override the slack bus for this partition call
zero_reactance_replacement : Override config parameter
regularization_factor : Override config parameter
infinite_distance : Override config parameter
- Returns:
Dictionary mapping cluster_id -> list of node_ids.
- Return type:
dict[int,list[Any]]- Raises:
PartitioningError – If partitioning fails.
ValidationError – If ac_island attribute is missing.
Voltage-Aware Partitioning#
- class npap.partitioning.va_geographical.VAGeographicalConfig[source]
Bases:
objectConfiguration for voltage-aware geographical partitioning.
- voltage_tolerance
Tolerance for voltage comparison (kV). Nodes with voltages within this tolerance are considered the same voltage level. Default is 1.0 kV.
- Type:
- infinite_distance
Value used to represent “infinite” distance between nodes at different voltage levels or AC islands. Using a large finite value instead of np.inf to avoid numerical issues in clustering algorithms.
- Type:
- proportional_clustering
If False (default), runs clustering on full matrix with infinite distances between voltage levels. If True, clusters each voltage island independently with proportional cluster distribution.
- Type:
- hierarchical_linkage
Linkage criterion for hierarchical clustering. Must be ‘complete’, ‘average’, or ‘single’. Note: ‘ward’ is NOT supported with precomputed distances. Default is ‘complete’ which works well with infinite distances (prevents cross-voltage merging).
- Type:
-
voltage_tolerance:
float= 1.0
-
infinite_distance:
float= 10000.0
-
proportional_clustering:
bool= False
-
hierarchical_linkage:
str= 'complete'
- class npap.partitioning.va_geographical.VAGeographicalPartitioning[source]
Bases:
PartitioningStrategyVoltage-Aware Geographical Partitioning Strategy with AC Island Support.
This strategy partitions nodes based on geographical distance while respecting both AC island boundaries and voltage level boundaries.
Notes
Constraint Hierarchy
AC Islands: Nodes in different AC islands are assigned infinite distance. AC islands represent separate AC networks connected only via DC links.
Voltage Levels: Within each AC island, nodes at different voltage levels are also assigned infinite distance.
This ensures clustering only occurs within the same AC island AND the same voltage level, which is physically meaningful for power networks.
Clustering Modes
Two clustering modes are available:
Standard mode (default):
Builds full NxN distance matrix
Sets d(i,j) = inf if ac_island(i) != ac_island(j) OR voltage(i) != voltage(j)
Runs single clustering algorithm on entire matrix
Algorithm handles infinite distances to respect boundaries
Proportional mode:
Groups nodes by (ac_island, voltage_level) combination
Distributes n_clusters proportionally among groups
Runs clustering independently on each group
Guaranteed balanced distribution per group
Supported Algorithms
kmedoids: K-Medoids clustering (works naturally with precomputed distances)hierarchical: Agglomerative clustering with precomputed distances (uses ‘complete’ linkage by default, configurable)
Configuration
Configuration can be provided at:
Instantiation time (via
configparameter in __init__)Partition time (via
configor individual parameters in partition())
Partition-time parameters override instance defaults for that call only.
- Attributes:
required_attributesRequired node attributes for voltage-aware geographical partitioning.
Methods
partition(graph, **kwargs)Partition nodes based on AC island and voltage-aware geographical distance.
- SUPPORTED_ALGORITHMS = ['kmedoids', 'hierarchical']
- SUPPORTED_DISTANCE_METRICS = ['euclidean', 'haversine']
- SUPPORTED_LINKAGES = ['complete', 'average', 'single']
- __init__(algorithm='kmedoids', distance_metric='euclidean', voltage_attr='voltage', ac_island_attr='ac_island', config=None)[source]
Initialize voltage-aware geographical partitioning strategy.
- Parameters:
algorithm (
str, default'kmedoids') – Clustering algorithm (‘kmedoids’, ‘hierarchical’).distance_metric (
str, default'euclidean') – Distance metric (‘euclidean’, ‘haversine’).voltage_attr (
str, default'voltage') – Node attribute name containing voltage level.ac_island_attr (
str, default'ac_island') – Node attribute name containing AC island ID.config (
VAGeographicalConfig, optional) – Configuration parameters for the algorithm.
- Raises:
ValueError – If unsupported algorithm, distance metric, or linkage.
- property required_attributes: dict[str, list[str]]
Required node attributes for voltage-aware geographical partitioning.
- partition(graph, **kwargs)[source]
Partition nodes based on AC island and voltage-aware geographical distance.
- Parameters:
graph (
nx.Graph) – NetworkX graph with lat, lon, voltage, and ac_island attributes.**kwargs (
dict) –Additional parameters:
n_clusters : Number of clusters (required)
random_state : Random seed for reproducibility (default: 42)
max_iter : Maximum iterations for clustering (default: 300)
config : VAGeographicalConfig instance to override instance config
voltage_tolerance : Override config parameter
infinite_distance : Override config parameter
proportional_clustering : Override config parameter
hierarchical_linkage : Override config parameter
- Returns:
Dictionary mapping cluster_id -> list of node_ids.
- Return type:
dict[int,list[Any]]- Raises:
PartitioningError – If partitioning fails.
- class npap.partitioning.va_electrical.VAElectricalConfig[source]
Bases:
objectConfiguration for voltage-aware electrical distance partitioning.
- zero_reactance_replacement
Reactance value used when edge reactance is zero. Default is 1e-5.
- Type:
- regularization_factor
Small value added to B matrix diagonal for numerical stability. Set to 0.0 to disable regularization. Default 1e-10 provides mild regularization that prevents singular matrix issues.
- Type:
- infinite_distance
Value used to represent “infinite” distance between nodes in different voltage levels, AC islands, or disconnected components. Using a large finite value instead of np.inf to avoid numerical issues in clustering.
- Type:
- voltage_tolerance
Tolerance for voltage comparison (kV). Nodes with voltages within this tolerance are considered the same voltage level. Default is 1.0 kV.
- Type:
- hierarchical_linkage
Linkage criterion for hierarchical clustering. Options: ‘complete’, ‘average’, ‘single’. Default is ‘complete’.
- Type:
-
zero_reactance_replacement:
float= 1e-05
-
regularization_factor:
float= 1e-10
-
infinite_distance:
float= 10000.0
-
voltage_tolerance:
float= 1.0
-
hierarchical_linkage:
str= 'complete'
- __init__(zero_reactance_replacement=1e-05, regularization_factor=1e-10, infinite_distance=10000.0, voltage_tolerance=1.0, hierarchical_linkage='complete')
- class npap.partitioning.va_electrical.VAElectricalDistancePartitioning[source]
Bases:
PartitioningStrategyVoltage-Aware Electrical Distance Partitioning.
This strategy partitions nodes based on electrical distance (PTDF) computed over the complete AC network (lines AND transformers), while enforcing voltage level boundaries as hard clustering constraints via post-processing.
Notes
Physical Rationale
In power systems, PTDF (Power Transfer Distribution Factor) describes how power injections affect line flows within an AC network. This strategy:
Computes PTDF for the complete AC network (lines + transformers) per AC island, capturing full electrical coupling including through transformers.
Post-processes distances to enforce voltage level separation: nodes at different voltage levels receive infinite distance, ensuring they never cluster together.
Transformer edges and buses at different voltage levels are set to infinite distance, preserving voltage hierarchy in the partitioning.
This approach is physically meaningful because:
The full PTDF captures how power flows through the entire AC network
Voltage level boundaries are then enforced as hard clustering constraints
Transformers become inter-cluster edges after aggregation
Constraint Hierarchy
AC Islands: Nodes in different AC islands have infinite distance (computed via separate PTDF matrices).
Voltage Levels: Nodes at different voltage levels have infinite distance (enforced via post-processing).
Algorithm
Group nodes by AC island
For each AC island:
Extract full AC subgraph (lines + transformers, exclude DC links)
Select ONE slack bus for the entire AC island
Compute PTDF including ALL AC elements
Calculate electrical distances from PTDF columns
Combine into full distance matrix with infinite inter-island distances
Post-process: Set infinite distance for node pairs at different voltage levels
Run clustering algorithm on the distance matrix
Supported Algorithms
kmedoids: K-Medoids clustering (works with precomputed distance matrices)hierarchical: Agglomerative clustering with precomputed distances
See also
ElectricalDistancePartitioningStandard electrical partitioning (AC-island aware)
VAGeographicalPartitioningVoltage-aware geographical partitioning
- Attributes:
required_attributesRequired attributes for voltage-aware electrical partitioning.
Methods
partition(graph, **kwargs)Partition nodes based on voltage-aware electrical distance using PTDF.
- SUPPORTED_ALGORITHMS = ['kmedoids', 'hierarchical']
- SUPPORTED_LINKAGES = ['complete', 'average', 'single']
- AC_EDGE_TYPES = {'line', 'trafo'}
- __init__(algorithm='kmedoids', slack_bus=None, voltage_attr='voltage', ac_island_attr='ac_island', config=None)[source]
Initialize voltage-aware electrical distance partitioning strategy.
- Parameters:
algorithm (
str, default'kmedoids') – Clustering algorithm (‘kmedoids’, ‘hierarchical’).slack_bus (
Any, optional) – Specific node to use as slack bus, or None for auto-selection.voltage_attr (
str, default'voltage') – Node attribute name containing voltage level.ac_island_attr (
str, default'ac_island') – Node attribute name containing AC island ID.config (
VAElectricalConfig, optional) – Configuration parameters for distance calculations.
- Raises:
ValueError – If unsupported algorithm or linkage is specified.
- property required_attributes: dict[str, list[str]]
Required attributes for voltage-aware electrical partitioning.
- partition(graph, **kwargs)[source]
Partition nodes based on voltage-aware electrical distance using PTDF.
Computes PTDF for the full AC network (lines + transformers) per AC island, then enforces voltage level separation via post-processing.
- Parameters:
graph (
nx.DiGraph) – NetworkX DiGraph with voltage and ac_island on nodes, reactance on AC edges (lines and transformers).**kwargs (
dict) –Additional parameters including:
n_clusters(int): Number of clusters (required).config(VAElectricalConfig, optional): Override instance config.hierarchical_linkage(str, optional): Override linkage for hierarchical clustering.Individual config parameters to override.
- Returns:
Dictionary mapping cluster_id -> list of node_ids.
- Return type:
dict[int,list[Any]]- Raises:
PartitioningError – If partitioning fails.
ValidationError – If required attributes are missing.
ValueError – If unsupported hierarchical_linkage is specified.