package no.uib.cipr.matrix.io;
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 org.junit.Test;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
public class MatrixVectorIoTest {
@Test
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.assertMatrixEquals(mat, newMat);
}
@Test
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.assertMatrixEquals(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;
}
}