graphina 0.3.0-alpha.4

A graph data science library for Rust
Documentation
# Link Prediction Examples

Link prediction algorithms help identify missing or future connections in a network.

## Predicting Friends with Jaccard Coefficient

The Jaccard coefficient is a classic way to measure similarity between two sets of neighbors.

```rust
use graphina::core::types::Graph;
use graphina::links::similarity::jaccard_coefficient;

fn main() {
    let mut graph = Graph::<&str, f64>::new();
    let n0 = graph.add_node("Alice");
    let n1 = graph.add_node("Bob");
    let n2 = graph.add_node("Charlie");
    let n3 = graph.add_node("David");

    // Alice and Bob share Charlie as a friend
    graph.add_edge(n0, n2, 1.0);
    graph.add_edge(n1, n2, 1.0);

    // Run prediction for all pairs
    let predictions = jaccard_coefficient(&graph, None);

    for ((u, v), score) in predictions {
        // Filter out existing edges if desired
        if !graph.contains_edge(u, v) && u != v {
            println!("Score between {:?} and {:?}: {:.4}", u, v, score);
        }
    }
}
```

## Using Resource Allocation Index

The Resource Allocation (RA) index is often more effective than Jaccard for social networks as it penalizes common neighbors that are "hubs" (have high degree).

```rust
use graphina::core::types::Graph;
use graphina::links::allocation::resource_allocation_index;

fn main() {
    let mut graph = Graph::<&str, f64>::new();
    let n0 = graph.add_node("Alice");
    let n1 = graph.add_node("Bob");
    let n2 = graph.add_node("Charlie");

    // Alice and Bob both know Charlie
    graph.add_edge(n0, n2, 1.0);
    graph.add_edge(n1, n2, 1.0);

    let ra_scores = resource_allocation_index(&graph, None);
    // Process scores...
}
```

## Community-Aware Prediction

If you have community labels, you can use Soundarajan-Hopcroft variants to boost scores for nodes in the same community.

```rust
use graphina::core::types::Graph;
use graphina::links::allocation::ra_index_soundarajan_hopcroft;

fn main() {
    let mut graph = Graph::<&str, f64>::new();
    let n1 = graph.add_node("A");
    let n2 = graph.add_node("B");

    // Two nodes in the same community (e.g., both even indices)
    let n3 = graph.add_node("C");
    graph.add_edge(n1, n2, 1.0);
    graph.add_edge(n2, n3, 1.0);

    // Mock community assignment closure
    let community_map = |node_id| {
        // In reality, lookup from a HashMap or property
        if node_id.index() % 2 == 0 { 1 } else { 2 }
    };

    let scores = ra_index_soundarajan_hopcroft(&graph, None, community_map);
}
```