pub fn calculate_neighbor_offset_in_cluster(edge_idx: usize) -> usize {
let header_size = 16;
let edge_metadata_size = 16;
header_size + (edge_idx * edge_metadata_size)
}
pub fn calculate_edge_data_offset_in_cluster(edge_idx: usize) -> Option<usize> {
let header_size = 16;
let edge_metadata_size = 16;
let edges_offset = header_size + (edge_idx * edge_metadata_size);
Some(edges_offset + 8)
}
pub fn validate_cluster_size(edge_count: usize, max_cluster_size: usize) -> bool {
let header_size = 16;
let per_edge_metadata_size = 16;
let expected_size = header_size + (edge_count * per_edge_metadata_size);
expected_size <= max_cluster_size && edge_count > 0
}
pub fn calculate_optimal_cluster_size(
edge_count: usize,
min_cluster_size: usize,
max_cluster_size: usize,
) -> usize {
let header_size = 16;
let per_edge_size = 16;
let required_size = header_size + (edge_count * per_edge_size);
let bounded_size = required_size.max(min_cluster_size).min(max_cluster_size);
let alignment = 64;
((bounded_size + alignment - 1) / alignment) * alignment
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_calculate_neighbor_offset_in_cluster() {
assert_eq!(calculate_neighbor_offset_in_cluster(0), 16);
assert_eq!(calculate_neighbor_offset_in_cluster(1), 32);
assert_eq!(calculate_neighbor_offset_in_cluster(4), 80);
assert_eq!(calculate_neighbor_offset_in_cluster(9), 160);
}
#[test]
fn test_calculate_edge_data_offset_in_cluster() {
assert_eq!(calculate_edge_data_offset_in_cluster(0), Some(24));
assert_eq!(calculate_edge_data_offset_in_cluster(1), Some(40));
assert_eq!(calculate_edge_data_offset_in_cluster(4), Some(88));
assert_eq!(calculate_edge_data_offset_in_cluster(9), Some(168));
}
#[test]
fn test_validate_cluster_size() {
assert!(validate_cluster_size(1, 1024));
assert!(validate_cluster_size(10, 1024));
assert!(validate_cluster_size(50, 1024));
assert!(!validate_cluster_size(0, 1024)); assert!(validate_cluster_size(60, 1024)); assert!(!validate_cluster_size(100, 1024)); }
#[test]
fn test_calculate_optimal_cluster_size() {
let min_size = 256;
let max_size = 1024;
assert_eq!(calculate_optimal_cluster_size(1, min_size, max_size), 256);
assert_eq!(calculate_optimal_cluster_size(10, min_size, max_size), 256);
let _required_size = 16 + (20 * 16); assert_eq!(calculate_optimal_cluster_size(20, min_size, max_size), 384);
let max_edges = (max_size - 16) / 16; assert_eq!(
calculate_optimal_cluster_size(max_edges, min_size, max_size),
1024
);
assert_eq!(
calculate_optimal_cluster_size(max_edges + 1, min_size, max_size),
1024
);
}
#[test]
fn test_calculate_optimal_cluster_size_alignment() {
let min_size = 200;
let max_size = 1000;
for edge_count in 1..=50 {
let size = calculate_optimal_cluster_size(edge_count, min_size, max_size);
assert_eq!(
size % 64,
0,
"Size {} for {} edges should be aligned to 64-byte boundaries",
size,
edge_count
);
}
}
}