|
| 1 | +library(igraph) |
| 2 | +library(orbweaver) |
| 3 | +library(microbenchmark) |
| 4 | + |
| 5 | +# Download the dataset from the orbweaver-rs repo |
| 6 | +edges <- readr::read_tsv("https://raw.githubusercontent.com/ixpantia/orbweaver-rs/main/assets/medium.txt", col_names = c("parent", "child")) |
| 7 | + |
| 8 | +# Function to convert dataframe to orbweaver graph |
| 9 | +df_to_orbweaver <- function(edges) { |
| 10 | + graph_builder() |> |
| 11 | + populate_edges(edges, parent, child) |> |
| 12 | + build_acyclic() |
| 13 | +} |
| 14 | + |
| 15 | +# Function to convert dataframe to igraph graph |
| 16 | +df_to_igraph <- function(edges) { |
| 17 | + graph_from_data_frame(edges, directed = TRUE) |
| 18 | +} |
| 19 | + |
| 20 | +find_paths_orbweaver <- function(graph, from, to) { |
| 21 | + orbweaver::find_all_paths(graph, from, to) |
| 22 | +} |
| 23 | + |
| 24 | +find_paths_igraph <- function(graph, from, to) { |
| 25 | + igraph::all_shortest_paths(graph, from, to) |
| 26 | +} |
| 27 | + |
| 28 | +find_path_orbweaver <- function(graph, from, to) { |
| 29 | + orbweaver::find_path(graph, from, to) |
| 30 | +} |
| 31 | + |
| 32 | +find_path_igraph <- function(graph, from, to) { |
| 33 | + igraph::shortest_paths(graph, from, to)$vpath |
| 34 | +} |
| 35 | + |
| 36 | +get_nodes_orbweaver <- function(graph) { |
| 37 | + orbweaver::nodes(graph) |
| 38 | +} |
| 39 | + |
| 40 | +get_nodes_igraph <- function(graph) { |
| 41 | + igraph::V(graph) |
| 42 | +} |
| 43 | + |
| 44 | +get_leaves_under_orbweaver <- function(graph, node) { |
| 45 | + orbweaver::get_leaves_under(graph, node) |
| 46 | +} |
| 47 | + |
| 48 | +get_leaves_under_igraph <- function(graph, node) { |
| 49 | + descendants <- igraph::ego(graph, order = length(V(graph)), nodes = node, mode = "out")[[1]] |
| 50 | + descendants[igraph::degree(graph, v = descendants, mode = "out") == 0] |
| 51 | +} |
| 52 | + |
| 53 | +get_roots_over_orbweaver <- function(graph, node) { |
| 54 | + orbweaver::get_roots_over(graph, node) |
| 55 | +} |
| 56 | + |
| 57 | +get_roots_over_igraph <- function(graph, node) { |
| 58 | + ancestors <- igraph::ego(graph, order = length(V(graph)), nodes = node, mode = "in")[[1]] |
| 59 | + ancestors[igraph::degree(graph, v = ancestors, mode = "in") == 0] |
| 60 | +} |
| 61 | + |
| 62 | +least_common_parents_orbweaver <- function(graph, nodes) { |
| 63 | + orbweaver::least_common_parents(graph, nodes) |
| 64 | +} |
| 65 | + |
| 66 | +least_common_parents_igraph <- function(graph, nodes) { |
| 67 | + subgraph <- igraph::induced_subgraph(graph, nodes) |
| 68 | + igraph::V(subgraph)[igraph::degree(subgraph, mode = "in") == 0] |
| 69 | +} |
| 70 | + |
| 71 | +subset_orbweaver <- function(graph, node) { |
| 72 | + subset(graph, node) |
| 73 | +} |
| 74 | + |
| 75 | +subset_igraph <- function(graph, node) { |
| 76 | + reachable_nodes <- igraph::ego(graph, order = length(igraph::V(graph)), nodes = node, mode = "out")[[1]] |
| 77 | + igraph::induced_subgraph(graph, reachable_nodes) |
| 78 | +} |
| 79 | + |
| 80 | +# Create orbweaver and igraph graphs |
| 81 | +g_orb <- df_to_orbweaver(edges) |
| 82 | +g_ig <- df_to_igraph(edges) |
| 83 | + |
| 84 | +# Benchmark the functions |
| 85 | +microbenchmark( |
| 86 | + find_all_paths_orbweaver = find_paths_orbweaver(g_orb, "1781f676dedf5767f3243db0a9738b35", "eb85851afd251bd7c7eaf725d0d19360"), |
| 87 | + find_all_paths_igraph = find_paths_igraph(g_ig, "1781f676dedf5767f3243db0a9738b35", "eb85851afd251bd7c7eaf725d0d19360"), |
| 88 | + find_path_orbweaver = find_path_orbweaver(g_orb, "1781f676dedf5767f3243db0a9738b35", "eb85851afd251bd7c7eaf725d0d19360"), |
| 89 | + find_path_igraph = find_path_igraph(g_ig, "1781f676dedf5767f3243db0a9738b35", "eb85851afd251bd7c7eaf725d0d19360"), |
| 90 | + get_leaves_under_orbweaver = get_leaves_under_orbweaver(g_orb, "1781f676dedf5767f3243db0a9738b35"), |
| 91 | + get_leaves_under_igraph = get_leaves_under_igraph(g_ig, "1781f676dedf5767f3243db0a9738b35"), |
| 92 | + get_roots_over_orbweaver = get_roots_over_orbweaver(g_orb, "eb85851afd251bd7c7eaf725d0d19360"), |
| 93 | + get_roots_over_igraph = get_roots_over_igraph(g_ig, "eb85851afd251bd7c7eaf725d0d19360"), |
| 94 | + least_common_parents_orbweaver = least_common_parents_orbweaver(g_orb, edges$parent[1:100]), |
| 95 | + least_common_parents_igraph = least_common_parents_igraph(g_ig, edges$parent[1:100]), |
| 96 | + subset_orbweaver = subset_orbweaver(g_orb, "1781f676dedf5767f3243db0a9738b35"), |
| 97 | + subset_igraph = subset_igraph(g_ig, "1781f676dedf5767f3243db0a9738b35"), |
| 98 | + times = 100 |
| 99 | +) |
0 commit comments