package no.uib.cipr.matrix.io;
import junit.framework.TestCase;
import no.uib.cipr.matrix.DenseMatrix;
import no.uib.cipr.matrix.Matrix;
import no.uib.cipr.matrix.MatrixTestAbstract;
import no.uib.cipr.matrix.sparse.CompRowMatrix;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
public class MatrixVectorIoTest extends TestCase {
public void testWriteRead() throws Exception {
DenseMatrix mat = new DenseMatrix(new double[][] {{1.1,1.2},{1.3,1.4}});
File matrixFile = new File("TestMatrixFile");
BufferedWriter out = new BufferedWriter(new FileWriter(matrixFile));
MatrixVectorWriter writer = new MatrixVectorWriter(out);
MatrixInfo mi = new MatrixInfo(false, MatrixInfo.MatrixField.Real, MatrixInfo.MatrixSymmetry.General);
writer.printMatrixInfo(mi);
writer.printMatrixSize(new MatrixSize(mat.numRows(), mat.numColumns(), mat.numColumns() * mat.numRows()), mi);
writer.printArray(mat.getData());
writer.close();
Matrix newMat = new DenseMatrix(new MatrixVectorReader(new FileReader(matrixFile)));
MatrixTestAbstract.assertEquals(mat, newMat);
}
public void testSparseWriteRead() throws Exception {
CompRowMatrix mat = new CompRowMatrix(3, 3, new int[][] {
{ 1, 2 },
{ 0, 2 },
{ 1 }
});
mat.set(0, 1, 1);
mat.set(0, 2, 2);
mat.set(1, 0, 3);
mat.set(1, 2, 4);
mat.set(2, 1, 5);
File testFile = new File("TestMatrixFile");
testFile.deleteOnExit();
BufferedWriter out = new BufferedWriter(new FileWriter(testFile));
MatrixVectorWriter writer = new MatrixVectorWriter(out);
MatrixInfo mi = new MatrixInfo(true, MatrixInfo.MatrixField.Real, MatrixInfo.MatrixSymmetry.General);
writer.printMatrixInfo(mi);
writer.printMatrixSize(new MatrixSize(mat.numColumns(), mat.numColumns(), mat.getData().length), mi);
int[] rows = buildRowArray(mat);
writer.printCoordinate(rows, mat.getColumnIndices(), mat.getData(), 1);
out.close();
CompRowMatrix newMat = new CompRowMatrix(new MatrixVectorReader(new FileReader(testFile)));
MatrixTestAbstract.assertEquals(mat, newMat);
}
private int[] buildRowArray(CompRowMatrix mat) {
int[] rows = new int[mat.getData().length];
int curRow = -1;
int nextValidRow = 0;
int curIndex = 0;
int[] rowPs = mat.getRowPointers();
// find first valid row
while(nextValidRow < mat.numRows() && rowPs[nextValidRow] < 0) nextValidRow++;
while (true) {
curRow = nextValidRow;
nextValidRow++;
while(nextValidRow < mat.numRows() && rowPs[nextValidRow] < 0) nextValidRow++;
// enter the remainder of data as currentRow
if(nextValidRow >= mat.numRows()) {
while(curIndex < mat.getData().length)
rows[curIndex++] = curRow;
break;
}
int nextRowIndex = rowPs[nextValidRow];
while(curIndex < nextRowIndex)
rows[curIndex++] = curRow;
}
return rows;
}
}