aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main.rs
blob: fb6faef6a46af0e87171600c6378e05cbf520fef (plain)
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
use std::env;
use std::process;
use std::fs::File;
use std::io::prelude::*;
use inline_python::*;

fn main() -> std::io::Result<()> {
    let args: Vec<_> = env::args().collect();
    if args.len() < 4 { println!("Need clique size, complete graph order, and output filename."); process::exit(1); }
    let sclique: usize = args[1].clone().to_string().parse::<usize>().unwrap();
    let order: usize = args[2].clone().to_string().parse::<usize>().unwrap();
    let output_name: &String = &args[3];
    println!("{} {} {}", sclique, order, output_name);

    let mut buffer = File::create(output_name)?;
    let mut buffer2 = File::create(".a")?;

    let mut edges: Vec<[u32; 2]> = Vec::new(); 
    let c = Context::new();

    c.run(python! {
        import networkx as nx;
        import itertools as it
        G = nx.complete_graph('order);
        def issize(val):
            return len(val)<='sclique
        B = [c for c in list(it.takewhile(issize, nx.enumerate_all_cliques(G))) if len(c)=='sclique];
    });

    let cliques = c.get::<Vec<Vec<u32>>>("B");
    write!(buffer, "p cnf {} {}\n", ((order * (order - 1)) / 2), 2*cliques.len())?;
    for clique in cliques {
        for a in 0..sclique {
            for b in a+1..sclique {
                //i += 1;
                let edge: [u32; 2] = [clique[a], clique[b]];
                let result = edges.iter().position(|&val| val==edge);
                let eindex = match result {
                    Some(val) => val+1,
                    None => {
                        edges.push(edge);
                        println!("{} = {:?}", edges.len(), edge);
                        edges.len()
                    }
                };
                write!(buffer, "{} ", eindex)?;
                write!(buffer2, "-{} ", eindex)?;
            }
        }
        write!(buffer, "0\n")?;
        write!(buffer2, "0\n")?;
    }
    Ok(())
}