package ch.akuhn.hapax.linalg; import ch.akuhn.hapax.linalg.Vector.Entry; import ch.akuhn.hapax.util.Resource; import ch.akuhn.hapax.util.ResourceStream; import ch.akuhn.hapax.util.RuntimeIOException; import ch.akuhn.util.Providable; public class OfflineMatrix extends Matrix { private int rows, columns; private Resource file; public OfflineMatrix(Resource file) { this.file = file; ResourceStream in = file.open(); rows = in.nextInt(); columns = in.nextInt(); in.close(); } @Override public Iterable<Vector> rows() { return new RowProvider(); } private class RowProvider extends Providable<Vector> { private ResourceStream in; @Override public void initialize() { in = file.open(); if (rows != in.nextInt()) throw new AssertionError(); if (columns != in.nextInt()) throw new AssertionError(); } @Override public Vector provide() { try { double[] values = new double[columns]; for (int n = 0; n < columns; n++) values[n] = in.nextDouble(); return new DenseVector(values); } catch (RuntimeIOException ex) { if (ex.isEOF()) return done(); throw ex; } } } @Override public int columnCount() { return columns; } @Override public Iterable<Vector> columns() { throw new UnsupportedOperationException(); } @Override public double get(int row, int column) { throw new UnsupportedOperationException(); } @Override public double put(int row, int column, double value) { throw new UnsupportedOperationException(); } @Override public int rowCount() { return rows; } @Override public int used() { return rows * columns; } public static final OfflineMatrix from(Matrix matrix, Resource file) { ResourceStream out = file.writeStream(); out.put(matrix.rowCount()); out.put(matrix.columnCount()); for (Vector row: matrix.rows()) for (Entry each: row.entries()) out.put(each.value); out.close(); return new OfflineMatrix(file); } }