package water.fvec;
import water.*;
/**
* A simple wrapper for looking at only a subset of rows
*/
public class SubsetVec extends WrappedVec {
final Key _subsetRowsKey;
transient Vec _rows; // Cached copy of the rows-Vec
public SubsetVec(Key subsetRowsKey, Key masterVecKey, Key key, long[] espc) {
super(masterVecKey,key, espc);
_subsetRowsKey = subsetRowsKey;
}
public Vec rows() {
if( _rows==null ) _rows = DKV.get(_subsetRowsKey).get();
return _rows;
}
// A subset chunk
@Override public Chunk chunkForChunkIdx(int cidx) {
Chunk crows = rows().chunkForChunkIdx(cidx);
return new SubsetChunk(crows,this,masterVec());
}
@Override public Futures remove(Futures fs) {
super.remove(fs);
UKV.remove(_subsetRowsKey,fs);
return fs;
}
//
static class SubsetChunk extends Chunk {
final Chunk _crows;
final Vec _masterVec;
protected SubsetChunk(Chunk crows, SubsetVec vec, Vec masterVec) {
_vec = vec;
_masterVec = masterVec;
_len = crows._len;
_start = crows._start;
_crows = crows;
}
@Override protected double atd_impl(int idx) {
long rownum = _crows.at8_impl(idx);
return _masterVec.at(rownum);
}
@Override protected long at8_impl(int idx) {
long rownum = _crows.at8_impl(idx);
return _masterVec.at8(rownum);
}
@Override protected boolean isNA_impl(int idx) {
long rownum = _crows.at8_impl(idx);
return _masterVec.isNA(rownum);
}
@Override boolean set_impl(int idx, long l) { return false; }
@Override boolean set_impl(int idx, double d) { return false; }
@Override boolean set_impl(int idx, float f) { return false; }
@Override boolean setNA_impl(int idx) { return false; }
@Override boolean hasFloat() { return false; }
@Override NewChunk inflate_impl(NewChunk nc) { throw H2O.fail(); }
@Override public AutoBuffer write(AutoBuffer bb) { throw H2O.fail(); }
@Override public Chunk read(AutoBuffer bb) { throw H2O.fail(); }
}
}