package graphtea.extensions.io;
import Jama.Matrix;
import graphtea.extensions.reports.coloring.SpMat;
import java.io.*;
import java.util.Scanner;
/**
* Created by rostam on 04.10.15.
* Load .mtx format file for matrices
*/
public class MM {
public static void saveMtxFormat(File out, Matrix m) throws IOException {
String s = "%%MatrixMarket matrix coordinate real";
boolean isSymmetric = true;
int nnz = 0;
int diagNonZero =0;
for (int i = 0; i < m.getRowDimension(); i++) {
for (int j = 0; j < m.getColumnDimension(); j++) {
if (m.get(i, j) != m.get(j, i)) {
isSymmetric = false;
}
if (m.get(i, j) != 0) {
nnz++;
}
}
if(m.get(i,i) != 0) diagNonZero++;
}
if (isSymmetric) {
s += " symmetric";
nnz=(nnz-diagNonZero)/2;
nnz+=diagNonZero;
} else s += " general";
FileOutputStream fos = new FileOutputStream(out);
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(fos));
bw.write(s);
bw.newLine();
bw.write(m.getRowDimension() + " " + m.getColumnDimension() + " "+nnz);
bw.newLine();
if (isSymmetric) {
for (int i = 0; i < m.getRowDimension(); i++) {
for (int j = i; j < m.getColumnDimension(); j++) {
if (m.get(i, j) != 0) {
bw.write((i+1) + " " + (j+1) + " " + m.get(i, j));
bw.newLine();
}
}
}
} else {
for (int i = 0; i < m.getRowDimension(); i++) {
for (int j = 0; j < m.getColumnDimension(); j++) {
if (m.get(i, j) != 0) {
bw.write((i+1) + " " + (j+1) + " " + m.get(i, j));
bw.newLine();
}
}
}
}
bw.close();
}
public static Matrix loadMatrixFromSPARSE(File inputFile) throws IOException {
Scanner sc = new Scanner(inputFile);
String line;
boolean isSymmetric = false;
do {
line = sc.nextLine();
if(line.contains("symmetric")) isSymmetric=true;
}while(line.contains("%"));
Scanner sc2 = new Scanner(line);
int rows = sc2.nextInt();
int cols = sc2.nextInt();
Matrix mm = new Matrix(rows, cols);
while(sc.hasNextLine()) {
line = sc.nextLine();
Scanner sc3 = new Scanner(line);
mm.set(sc3.nextInt()-1,sc3.nextInt()-1,sc3.nextDouble());
}
if(isSymmetric) {
for(int i=0;i<rows;i++) {
for(int j=0;j<cols;j++) {
if(mm.get(i,j)!= 0) if(mm.get(j,i)==0) mm.set(j,i,mm.get(i,j));
}
}
}
return mm;
}
public static void saveMtxFormat(File out, SpMat m) throws IOException {
String s = "%%MatrixMarket matrix coordinate real general";
int nnz = m.nnz();
FileOutputStream fos = new FileOutputStream(out);
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(fos));
bw.write(s);
bw.newLine();
bw.write(m.rows() + " " + m.rows() + " " + nnz);
bw.newLine();
for (int i = 0; i < m.rows(); i++) {
for(int j : m.get(i)) {
bw.write((i + 1) + " " + (j + 1) + " " + 1.0);
bw.newLine();
}
}
bw.close();
}
}