use std::io::BufRead;
use std::io::Write;
use ndarray::Array1;
use sprs::{CsMat, TriMat};
pub fn read_graph_matrix(path: &str, index_correction: usize) -> CsMat<f64> {
let file = std::fs::File::open(path).unwrap();
let mut reader = std::io::BufReader::new(file);
let mut line = String::new();
reader.read_line(&mut line).unwrap();
let num_x = line.trim().parse::<usize>().unwrap();
line = String::new();
let mut q = TriMat::<f64>::new((num_x, num_x));
while reader.read_line(&mut line).unwrap() > 0 {
let row_data: Vec<_> = line.split_whitespace().collect();
let (i, j, value) = match row_data.len() {
3 => (
row_data[0].parse::<usize>().unwrap() - index_correction,
row_data[1].parse::<usize>().unwrap() - index_correction,
row_data[2].parse::<f64>().unwrap(),
),
2 => (
row_data[0].parse::<usize>().unwrap() - index_correction,
row_data[1].parse::<usize>().unwrap() - index_correction,
1.0,
),
_ => (0, 0, 0.0),
};
if i == j {
q.add_triplet(i, j, value);
} else {
q.add_triplet(i, j, 0.5 * value);
q.add_triplet(j, i, 0.5 * value);
}
line = String::new();
}
q.to_csr()
}
pub fn write_solution_matrix(path: &str, x_0: Array1<f64>, obj_rounded: f64, obj_relaxed: f64) {
let file = std::fs::File::create(path).unwrap();
let mut writer = std::io::BufWriter::new(file);
writeln!(writer, "{}", obj_relaxed).unwrap();
writeln!(writer, "{}", obj_rounded).unwrap();
for &x in x_0.iter() {
writeln!(writer, "{}", x).unwrap();
}
}