pub mod ffi;
pub mod types;
pub use types::{Node, Way, OptimizationResult, RoutePoint, RouteStats};
#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
pub struct RouteOptimizer {
nodes: Vec<Node>,
ways: Vec<Way>,
}
impl RouteOptimizer {
pub fn new() -> Self {
Self {
nodes: Vec::new(),
ways: Vec::new(),
}
}
pub fn build_graph_from_features(&mut self, _features: &[geojson::Feature]) -> anyhow::Result<()> {
Ok(())
}
pub fn optimize(&mut self) -> anyhow::Result<OptimizationResult> {
Ok(OptimizationResult::new(vec![], 0.0))
}
pub fn set_turn_penalties(&mut self, _left: f64, _right: f64, _u: f64) {
}
pub fn set_depot(&mut self, _lat: f64, _lon: f64) {
}
pub fn get_stats(&self) -> OptimizerStats {
OptimizerStats {
node_count: self.nodes.len(),
edge_count: self.ways.len(),
component_count: 0, avg_degree: if self.nodes.is_empty() {
0.0
} else {
(self.ways.len() as f64) / (self.nodes.len() as f64)
},
max_degree: 0, }
}
pub fn all_nodes_have_even_degree(&self) -> bool {
true
}
}
impl Default for RouteOptimizer {
fn default() -> Self {
Self::new()
}
}
#[derive(Debug, Clone)]
pub struct OptimizerStats {
pub node_count: usize,
pub edge_count: usize,
pub component_count: usize,
pub avg_degree: f64,
pub max_degree: usize,
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_optimizer_creation() {
let optimizer = RouteOptimizer::new();
assert_eq!(optimizer.nodes.len(), 0);
assert_eq!(optimizer.ways.len(), 0);
}
#[test]
fn test_optimizer_default() {
let optimizer = RouteOptimizer::default();
assert_eq!(optimizer.nodes.len(), 0);
assert_eq!(optimizer.ways.len(), 0);
}
#[test]
fn test_optimizer_stats() {
let mut optimizer = RouteOptimizer::new();
optimizer.nodes.push(Node::new("node1", 45.5, -73.6));
optimizer.nodes.push(Node::new("node2", 45.51, -73.61));
optimizer.ways.push(Way::new("way1", vec!["node1".to_string()]));
let stats = optimizer.get_stats();
assert_eq!(stats.node_count, 2);
assert_eq!(stats.edge_count, 1);
assert!(stats.avg_degree > 0.0);
}
}