spectre 0.4.0

A lightweight toolkit for analysing p2p network topologies.
Documentation
# Spectre

[![crates.io](https://img.shields.io/crates/v/spectre)](https://crates.io/crates/spectre)
[![docs.rs](https://docs.rs/spectre/badge.svg)](https://docs.rs/spectre)

In French, the spectrum of a matrix is called "spectre".

This micro-library contains a small toolkit helpful in analysing network topologies. Namely:
- Degree, adjacency and Laplacian matrices for a graph.
- Various centrality measures for a graph.
- The algebraic connectivity of a graph (Fiedler).

## Basic usage

The library is centered around the [`Graph`](graph::Graph) structure which can be constructed
from one or more [`Edge`](edge::Edge) instances. Once constructed, various measurements and
matrix representations of the graph can be computed.

```rust
use std::net::SocketAddr;

use spectre::edge::Edge;
use spectre::graph::Graph;

// Construct the graph instance.
let mut graph = Graph::new();

// Create some addresses to be part of a network topology.
let addrs: Vec<SocketAddr> = (0..3)
    .map(|i| format!("127.0.0.1:{i}").parse().unwrap())
    .collect();
let (a, b, c) = (addrs[0], addrs[1], addrs[2]);

// Insert some edges, note the IDs can be any type that is `Copy + Eq + Hash + Ord`.
graph.insert(Edge::new(a, b));
graph.insert(Edge::new(a, c));

// Compute some metrics on that state of the graph.
let density = graph.density();
let degree_centrality_delta = graph.degree_centrality_delta();

// Matrices can be pretty printed...
println!("{}", graph.laplacian_matrix());
// ...outputs:
//  ┌          ┐
//  │  2 -1 -1 │
//  │ -1  1  0 │
//  │ -1  0  1 │
//  └          ┘
```