#graph #graph-algorithms #bipartite #ecology

oxygraph

Algorithms and structures on ecological graphs

6 releases

0.1.41 Oct 3, 2022
0.1.6 Oct 15, 2022
0.1.3 Sep 14, 2022

#1709 in Algorithms

Download history 2/week @ 2024-02-14 122/week @ 2024-02-21 14/week @ 2024-02-28

138 downloads per month
Used in oxygraphis

MIT license

84KB
1.5K SLoC

oxygraph

oxygraph is a Rust library to analyse bipartite graphs, and implements several algorithms along with visualisations.

There is functionality to:

  • Visualise bipartite graphs and their derivatives, as well as interaction matrices.
  • Compute basic statistics on bipartite graphs and interaction matrices.
  • Create random bipartite graphs through the Erdös-Rényi process.
  • Algorithms for computing nestedness, and modularity.

The bipartite graphs are a thin wrapper over petgraph graphs, and the interaction matrices are two dimensional ndarrays.

As the wrappers are thin, implementation of new metrics/algorithms should be straightforward.

An example which illustrates initiation of the graph from a TSV:

// main bipartite graph struct
use oxygraph::BipartiteGraph;
// Enum for which strata there are in a bipartite graph
use oxygraph::bipartite::Strata;
// Interaction matrix struct
use oxygraph::InteractionMatrix;
// LPAWB+ algorithm
use oxygraph::modularity::lpa_wb_plus;

// read in some data
// in the format:
// from    to    weight
// 0       1     1.0 
// etc ...
let bpgraph = BipartiteGraph::from_dsv("path/to/tsv", b'\t').unwrap();
// is the graph bipartite?
let strata = bpgraph.is_bipartite();

match stata {
    Strata::Yes(map) => println!("{:?}", map),
    // tell the user which nodes are the offenders.
    Strata::No => {
        panic!("Uh oh, your graph isn't bipartite!");
    }
}

// basic stats
println!("{:?}", bpgraph.stats());

// calculate NODF
let mut im = InteractionMatrix::from_bipartite(bpgraph);
println!("{}", im.nodf().unwrap());

// make a random bipartite graph
let rand_graph = BipartiteGraph::random(80, 100, 250).unwrap();
let mut im_rand = InteractionMatrix::from_bipartite(rand_graph);
// and calculate modularity
let modularity = lpa_wb_plus(rand_graph, None);
println!("{:?}", modularity);

Dependencies

~6MB
~104K SLoC