33//! Time complexity: O(n³)
44//! Space complexity: O(n²)
55
6+ use pyo3:: PyResult ;
7+
68use crate :: callback:: ProgressCallback ;
7- use crate :: types:: { AlgorithmResult , Progress , Status } ;
9+ use crate :: types:: Progress ;
810
911/// Edge representation: (from, to, weight)
1012pub type Edge = ( usize , usize , f64 ) ;
@@ -36,7 +38,7 @@ pub fn floyd_warshall(
3638 n_nodes : usize ,
3739 edges : & [ Edge ] ,
3840 callback : & mut ProgressCallback ,
39- ) -> FloydWarshallResult {
41+ ) -> PyResult < FloydWarshallResult > {
4042 let n = n_nodes;
4143
4244 // Initialize distance matrix with infinity
@@ -63,14 +65,14 @@ pub fn floyd_warshall(
6365 for k in 0 ..n {
6466 // Report progress every n iterations (once per k)
6567 let progress = Progress :: new ( k, 0.0 ) . with_evaluations ( iterations) ;
66- if callback. report ( & progress) . unwrap_or ( false ) {
68+ if callback. report ( & progress) ? {
6769 // Early termination requested
68- return FloydWarshallResult {
70+ return Ok ( FloydWarshallResult {
6971 distances : dist,
7072 predecessors : pred,
7173 has_negative_cycle : false ,
7274 iterations,
73- } ;
75+ } ) ;
7476 }
7577
7678 for i in 0 ..n {
@@ -93,12 +95,12 @@ pub fn floyd_warshall(
9395 }
9496 }
9597
96- FloydWarshallResult {
98+ Ok ( FloydWarshallResult {
9799 distances : dist,
98100 predecessors : pred,
99101 has_negative_cycle,
100102 iterations,
101- }
103+ } )
102104}
103105
104106/// Reconstruct path from i to j using predecessor matrix.
@@ -148,7 +150,7 @@ mod tests {
148150 #[ test]
149151 fn test_simple_graph ( ) {
150152 let edges = vec ! [ ( 0 , 1 , 1.0 ) , ( 1 , 2 , 2.0 ) , ( 0 , 2 , 5.0 ) ] ;
151- let result = floyd_warshall ( 3 , & edges, & mut ProgressCallback :: none ( ) ) ;
153+ let result = floyd_warshall ( 3 , & edges, & mut ProgressCallback :: none ( ) ) . unwrap ( ) ;
152154
153155 assert ! ( ( result. distances[ 0 ] [ 2 ] - 3.0 ) . abs( ) < 1e-9 ) ;
154156 assert ! ( !result. has_negative_cycle) ;
@@ -157,7 +159,7 @@ mod tests {
157159 #[ test]
158160 fn test_no_path ( ) {
159161 let edges = vec ! [ ( 0 , 1 , 1.0 ) ] ;
160- let result = floyd_warshall ( 3 , & edges, & mut ProgressCallback :: none ( ) ) ;
162+ let result = floyd_warshall ( 3 , & edges, & mut ProgressCallback :: none ( ) ) . unwrap ( ) ;
161163
162164 assert ! ( result. distances[ 1 ] [ 0 ] . is_infinite( ) ) ;
163165 assert ! ( result. distances[ 2 ] [ 0 ] . is_infinite( ) ) ;
@@ -166,15 +168,15 @@ mod tests {
166168 #[ test]
167169 fn test_negative_cycle ( ) {
168170 let edges = vec ! [ ( 0 , 1 , 1.0 ) , ( 1 , 2 , -1.0 ) , ( 2 , 0 , -1.0 ) ] ;
169- let result = floyd_warshall ( 3 , & edges, & mut ProgressCallback :: none ( ) ) ;
171+ let result = floyd_warshall ( 3 , & edges, & mut ProgressCallback :: none ( ) ) . unwrap ( ) ;
170172
171173 assert ! ( result. has_negative_cycle) ;
172174 }
173175
174176 #[ test]
175177 fn test_path_reconstruction ( ) {
176178 let edges = vec ! [ ( 0 , 1 , 1.0 ) , ( 1 , 2 , 2.0 ) , ( 0 , 2 , 5.0 ) ] ;
177- let result = floyd_warshall ( 3 , & edges, & mut ProgressCallback :: none ( ) ) ;
179+ let result = floyd_warshall ( 3 , & edges, & mut ProgressCallback :: none ( ) ) . unwrap ( ) ;
178180
179181 let path = reconstruct_path ( & result. predecessors , & result. distances , 0 , 2 ) ;
180182 assert_eq ! ( path, Some ( vec![ 0 , 1 , 2 ] ) ) ;
0 commit comments