package ch.akuhn.hapax.linalg;
import java.io.FileInputStream;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.DoubleBuffer;
import java.nio.channels.FileChannel;
import java.nio.channels.FileChannel.MapMode;
import ch.akuhn.util.Providable;
public class BufferedMatrix extends Matrix {
private int rows, columns;
private DoubleBuffer data;
public BufferedMatrix(String filename) throws IOException {
FileChannel channel = new FileInputStream(filename).getChannel();
ByteBuffer header = ByteBuffer.allocate(8);
channel.read(header);
rows = header.getInt();
columns = header.getInt();
data = channel.map(MapMode.READ_ONLY, 8, channel.size() - 8).asDoubleBuffer();
}
public BufferedMatrix(int rows, int columns, DoubleBuffer data) {
this.rows = rows;
this.columns = columns;
this.data = data;
assert data.limit() == (rows * columns);
}
@Override
public Iterable<Vector> rows() {
return new RowProvider();
}
private class RowProvider extends Providable<Vector> {
private DoubleBuffer buf;
@Override
public void initialize() {
this.buf = data.duplicate();
this.buf.rewind();
}
@Override
public Vector provide() {
if (!buf.hasRemaining()) return done();
double[] values = new double[columns];
buf.get(values);
return new DenseVector(values);
}
}
@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;
}
}