@@ -168,194 +168,3 @@ pub fn unweighted_page_rank<G: StaticGraphViewOps>(
168168 None ,
169169 )
170170}
171-
172- #[ cfg( test) ]
173- pub mod page_rank_tests {
174- use super :: * ;
175- use crate :: {
176- db:: { api:: mutation:: AdditionOps , graph:: graph:: Graph } ,
177- prelude:: { NodeStateOps , NO_PROPS } ,
178- test_storage,
179- } ;
180- use itertools:: Itertools ;
181- use pretty_assertions:: assert_eq;
182- use std:: borrow:: Borrow ;
183-
184- fn load_graph ( ) -> Graph {
185- let graph = Graph :: new ( ) ;
186-
187- let edges = vec ! [ ( 1 , 2 ) , ( 1 , 4 ) , ( 2 , 3 ) , ( 3 , 1 ) , ( 4 , 1 ) ] ;
188-
189- for ( src, dst) in edges {
190- graph. add_edge ( 0 , src, dst, NO_PROPS , None ) . unwrap ( ) ;
191- }
192- graph
193- }
194-
195- #[ test]
196- fn test_page_rank ( ) {
197- let graph = load_graph ( ) ;
198-
199- test_storage ! ( & graph, |graph| {
200- let results = unweighted_page_rank( graph, Some ( 1000 ) , Some ( 1 ) , None , true , None ) ;
201-
202- assert_eq_f64( results. get_by_node( "1" ) , Some ( & 0.38694 ) , 5 ) ;
203- assert_eq_f64( results. get_by_node( "2" ) , Some ( & 0.20195 ) , 5 ) ;
204- assert_eq_f64( results. get_by_node( "4" ) , Some ( & 0.20195 ) , 5 ) ;
205- assert_eq_f64( results. get_by_node( "3" ) , Some ( & 0.20916 ) , 5 ) ;
206- } ) ;
207- }
208-
209- #[ test]
210- fn motif_page_rank ( ) {
211- let edges = vec ! [
212- ( 1 , 2 , 1 ) ,
213- ( 1 , 3 , 2 ) ,
214- ( 1 , 4 , 3 ) ,
215- ( 3 , 1 , 4 ) ,
216- ( 3 , 4 , 5 ) ,
217- ( 3 , 5 , 6 ) ,
218- ( 4 , 5 , 7 ) ,
219- ( 5 , 6 , 8 ) ,
220- ( 5 , 8 , 9 ) ,
221- ( 7 , 5 , 10 ) ,
222- ( 8 , 5 , 11 ) ,
223- ( 1 , 9 , 12 ) ,
224- ( 9 , 1 , 13 ) ,
225- ( 6 , 3 , 14 ) ,
226- ( 4 , 8 , 15 ) ,
227- ( 8 , 3 , 16 ) ,
228- ( 5 , 10 , 17 ) ,
229- ( 10 , 5 , 18 ) ,
230- ( 10 , 8 , 19 ) ,
231- ( 1 , 11 , 20 ) ,
232- ( 11 , 1 , 21 ) ,
233- ( 9 , 11 , 22 ) ,
234- ( 11 , 9 , 23 ) ,
235- ] ;
236-
237- let graph = Graph :: new ( ) ;
238-
239- for ( src, dst, t) in edges {
240- graph. add_edge ( t, src, dst, NO_PROPS , None ) . unwrap ( ) ;
241- }
242-
243- test_storage ! ( & graph, |graph| {
244- let results = unweighted_page_rank( graph, Some ( 1000 ) , Some ( 4 ) , None , true , None ) ;
245-
246- assert_eq_f64( results. get_by_node( "10" ) , Some ( & 0.072082 ) , 5 ) ;
247- assert_eq_f64( results. get_by_node( "8" ) , Some ( & 0.136473 ) , 5 ) ;
248- assert_eq_f64( results. get_by_node( "3" ) , Some ( & 0.15484 ) , 5 ) ;
249- assert_eq_f64( results. get_by_node( "6" ) , Some ( & 0.07208 ) , 5 ) ;
250- assert_eq_f64( results. get_by_node( "11" ) , Some ( & 0.06186 ) , 5 ) ;
251- assert_eq_f64( results. get_by_node( "2" ) , Some ( & 0.03557 ) , 5 ) ;
252- assert_eq_f64( results. get_by_node( "1" ) , Some ( & 0.11284 ) , 5 ) ;
253- assert_eq_f64( results. get_by_node( "4" ) , Some ( & 0.07944 ) , 5 ) ;
254- assert_eq_f64( results. get_by_node( "7" ) , Some ( & 0.01638 ) , 5 ) ;
255- assert_eq_f64( results. get_by_node( "9" ) , Some ( & 0.06186 ) , 5 ) ;
256- assert_eq_f64( results. get_by_node( "5" ) , Some ( & 0.19658 ) , 5 ) ;
257- } ) ;
258- }
259-
260- #[ test]
261- fn two_nodes_page_rank ( ) {
262- let edges = vec ! [ ( 1 , 2 ) , ( 2 , 1 ) ] ;
263-
264- let graph = Graph :: new ( ) ;
265-
266- for ( t, ( src, dst) ) in edges. into_iter ( ) . enumerate ( ) {
267- graph. add_edge ( t as i64 , src, dst, NO_PROPS , None ) . unwrap ( ) ;
268- }
269-
270- test_storage ! ( & graph, |graph| {
271- let results = unweighted_page_rank( graph, Some ( 1000 ) , Some ( 4 ) , None , false , None ) ;
272-
273- assert_eq_f64( results. get_by_node( "1" ) , Some ( & 0.5 ) , 3 ) ;
274- assert_eq_f64( results. get_by_node( "2" ) , Some ( & 0.5 ) , 3 ) ;
275- } ) ;
276- }
277-
278- #[ test]
279- fn three_nodes_page_rank_one_dangling ( ) {
280- let edges = vec ! [ ( 1 , 2 ) , ( 2 , 1 ) , ( 2 , 3 ) ] ;
281-
282- let graph = Graph :: new ( ) ;
283-
284- for ( t, ( src, dst) ) in edges. into_iter ( ) . enumerate ( ) {
285- graph. add_edge ( t as i64 , src, dst, NO_PROPS , None ) . unwrap ( ) ;
286- }
287-
288- test_storage ! ( & graph, |graph| {
289- let results = unweighted_page_rank( graph, Some ( 10 ) , Some ( 4 ) , None , false , None ) ;
290-
291- assert_eq_f64( results. get_by_node( "1" ) , Some ( & 0.303 ) , 3 ) ;
292- assert_eq_f64( results. get_by_node( "2" ) , Some ( & 0.393 ) , 3 ) ;
293- assert_eq_f64( results. get_by_node( "3" ) , Some ( & 0.303 ) , 3 ) ;
294- } ) ;
295- }
296-
297- #[ test]
298- fn dangling_page_rank ( ) {
299- let edges = vec ! [
300- ( 1 , 2 ) ,
301- ( 1 , 3 ) ,
302- ( 2 , 3 ) ,
303- ( 3 , 1 ) ,
304- ( 3 , 2 ) ,
305- ( 3 , 4 ) ,
306- // dangling from here
307- ( 4 , 5 ) ,
308- ( 5 , 6 ) ,
309- ( 6 , 7 ) ,
310- ( 7 , 8 ) ,
311- ( 8 , 9 ) ,
312- ( 9 , 10 ) ,
313- ( 10 , 11 ) ,
314- ]
315- . into_iter ( )
316- . enumerate ( )
317- . map ( |( t, ( src, dst) ) | ( src, dst, t as i64 ) )
318- . collect_vec ( ) ;
319-
320- let graph = Graph :: new ( ) ;
321-
322- for ( src, dst, t) in edges {
323- graph. add_edge ( t, src, dst, NO_PROPS , None ) . unwrap ( ) ;
324- }
325- test_storage ! ( & graph, |graph| {
326- let results = unweighted_page_rank( graph, Some ( 1000 ) , Some ( 4 ) , None , true , None ) ;
327-
328- assert_eq_f64( results. get_by_node( "1" ) , Some ( & 0.055 ) , 3 ) ;
329- assert_eq_f64( results. get_by_node( "2" ) , Some ( & 0.079 ) , 3 ) ;
330- assert_eq_f64( results. get_by_node( "3" ) , Some ( & 0.113 ) , 3 ) ;
331- assert_eq_f64( results. get_by_node( "4" ) , Some ( & 0.055 ) , 3 ) ;
332- assert_eq_f64( results. get_by_node( "5" ) , Some ( & 0.070 ) , 3 ) ;
333- assert_eq_f64( results. get_by_node( "6" ) , Some ( & 0.083 ) , 3 ) ;
334- assert_eq_f64( results. get_by_node( "7" ) , Some ( & 0.093 ) , 3 ) ;
335- assert_eq_f64( results. get_by_node( "8" ) , Some ( & 0.102 ) , 3 ) ;
336- assert_eq_f64( results. get_by_node( "9" ) , Some ( & 0.110 ) , 3 ) ;
337- assert_eq_f64( results. get_by_node( "10" ) , Some ( & 0.117 ) , 3 ) ;
338- assert_eq_f64( results. get_by_node( "11" ) , Some ( & 0.122 ) , 3 ) ;
339- } ) ;
340- }
341-
342- pub fn assert_eq_f64 < T : Borrow < f64 > + PartialEq + std:: fmt:: Debug > (
343- a : Option < T > ,
344- b : Option < T > ,
345- decimals : u8 ,
346- ) {
347- if a. is_none ( ) || b. is_none ( ) {
348- assert_eq ! ( a, b) ;
349- } else {
350- let factor = 10.0_f64 . powi ( decimals as i32 ) ;
351- match ( a, b) {
352- ( Some ( a) , Some ( b) ) => {
353- let left = ( a. borrow ( ) * factor) . round ( ) ;
354- let right = ( b. borrow ( ) * factor) . round ( ) ;
355- assert_eq ! ( left, right, ) ;
356- }
357- _ => unreachable ! ( ) ,
358- }
359- }
360- }
361- }
0 commit comments