File: cliques.rs

package info (click to toggle)
rust-pathfinding 4.14.0-1
  • links: PTS, VCS
  • area: main
  • in suites: experimental
  • size: 1,024 kB
  • sloc: sh: 19; makefile: 2
file content (49 lines) | stat: -rw-r--r-- 1,282 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
use std::collections::HashSet;

use itertools::Itertools;
use pathfinding::prelude::*;

#[test]
fn find_cliques() {
    let vertices: Vec<i32> = (1..10).collect_vec();
    let cliques = maximal_cliques_collect(&vertices, &mut |a, b| (*a - *b) % 3 == 0);
    let cliques_as_vectors: Vec<Vec<i32>> = sort(&cliques);

    assert_eq!(
        vec![vec![1, 4, 7], vec![2, 5, 8], vec![3, 6, 9]],
        cliques_as_vectors
    );
}

#[test]
fn test_same_node_appears_in_multiple_clique() {
    let vertices: Vec<i32> = (1..10).collect_vec();
    let cliques = maximal_cliques_collect(&vertices, &mut |a, b| {
        (*a % 3 == 0) && (*b % 3 == 0) || ((*a - *b) % 4 == 0)
    });
    let cliques_as_vectors: Vec<Vec<i32>> = sort(&cliques);

    assert_eq!(
        vec![
            vec![1, 5, 9],
            vec![2, 6],
            vec![3, 6, 9],
            vec![3, 7],
            vec![4, 8]
        ],
        cliques_as_vectors
    );
}

fn sort(cliques: &[HashSet<&i32>]) -> Vec<Vec<i32>> {
    let mut cliques_as_vectors: Vec<Vec<i32>> = cliques
        .iter()
        .map(|cliq| {
            let mut s = cliq.iter().map(|&x| *x).collect_vec();
            s.sort_unstable();
            s
        })
        .collect();
    cliques_as_vectors.sort();
    cliques_as_vectors
}