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
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
use crate::{cn, Model, Network, Weight};
use rand::prelude::*;
use std::fs::File;
use std::io::{BufRead, BufReader};
use std::path::Path;

pub fn hide_links(net: &mut Network, h_e: f64, ensure_whole: bool) -> f64 {
    let mut possible: cn::IndexSet<_> = net.links().collect();
    let initial_links = possible.len() as f64;
    let mut to_remove = (h_e * initial_links).round() as usize;
    while to_remove > 0 {
        if let Some(&(i, j)) = possible.iter().choose(&mut *net.rng().unwrap()) {
            possible.remove(&(i, j));
            if !ensure_whole {
                net.unlink(i, j).unwrap();
                to_remove -= 1;
            } else if net.unlink_safe(i, j).unwrap().is_some() {
                to_remove -= 1;
            }
        } else {
            break;
        }
    }
    1.0 - net.links().count() as f64 / initial_links
}

pub fn hide_nodes(net: &mut Network, h_v: f64, exclude: &[usize], ensure_whole: bool) -> f64 {
    let initial_nodes = net.size() as f64;
    let mut to_remove = (h_v * initial_nodes).round() as usize;
    let mut possible: cn::IndexSet<_> =
        net.nodes().filter(|node| !exclude.contains(node)).collect();
    while to_remove > 0 {
        if let Some(&i) = possible.iter().choose(&mut *net.rng().unwrap()) {
            possible.remove(&i);
            if !ensure_whole || net.disconnect_safe(i).unwrap().is_some() {
                net.detach(i).unwrap();
                to_remove -= 1;
            }
        } else {
            break;
        }
    }
    1.0 - net.size() as f64 / initial_nodes
}

pub fn init_from_file(model_file: &str, weight: Weight) -> Network {
    let model_file = Path::new(model_file);
    let name = model_file
        .file_name()
        .map(|n| n.to_str().unwrap().to_owned())
        .unwrap();
    let file = File::open(model_file).unwrap();
    let reader = BufReader::new(file);
    let mut net = Network::new(0, Model::Custom(name), weight);

    for line in reader.lines() {
        let line: Vec<String> = line.unwrap().split(' ').map(|s| s.to_string()).collect();
        let i: usize = line[0].parse().expect("Cannot parse number");
        let j: usize = line[1].parse().expect("Cannot parse number");
        net.attach_skip(&[i, j]);
        net.link(i, j).unwrap();
    }
    net
}