package water.fvec;
import java.util.Arrays;
import water.Futures;
import water.fvec.ParseDataset2.FVecDataOut;
import water.fvec.Vec.VectorGroup;
import water.parser.Enum;
public class SVMLightFVecDataOut extends FVecDataOut {
protected final VectorGroup _vg;
final int _vecIdStart;
public SVMLightFVecDataOut(VectorGroup vg, int cidx, AppendableVec [] avs, int vecIdStart, int chunkOff, Enum [] enums){
super(vg,chunkOff,cidx,enums, avs);
_vg = vg;
_vecIdStart = vecIdStart;
_nvs = new NewChunk[avs.length];
for(int i = 0; i < _nvs.length; ++i)
_nvs[i] = new NewChunk(_vecs[i], _cidx, true);
_ctypes= new byte[avs.length];
_col = 0;
}
private void addColumns(int ncols){
if(ncols > _nvs.length){
int _nCols = _vecs.length;
_nvs = Arrays.copyOf(_nvs , ncols);
_vecs = Arrays.copyOf(_vecs , ncols);
_ctypes= Arrays.copyOf(_ctypes, ncols);
for(int i = _nCols; i < ncols; ++i) {
_vecs[i] = new AppendableVec(_vg.vecKey(i+_vecIdStart),_vecs[0]._espc, _chunkOff);
_nvs[i] = new NewChunk(_vecs[i], _cidx, true);
}
}
}
@Override public void addNumCol(int colIdx, long number, int exp) {
assert colIdx >= _col;
if(colIdx >= _vecs.length) addColumns(colIdx+1);
_nvs[colIdx].addZeros((int)_nLines - _nvs[colIdx]._len);
_nvs[colIdx].addNum(number, exp);
if(_ctypes[colIdx] == UCOL ) _ctypes[colIdx] = NCOL;
_col = colIdx+1;
}
@Override
public void newLine() {
++_nLines;
_col = 0;
}
@Override public final void addInvalidCol(int colIdx) {
assert colIdx >= _col;
if(colIdx >= _vecs.length) addColumns(colIdx+1);
_nvs[colIdx].addZeros((int)_nLines - _nvs[colIdx]._len);
_nvs[colIdx].addNA();
_col = colIdx+1;
}
@Override public FVecDataOut close(Futures fs) {
for(NewChunk nc:_nvs) {
nc.addZeros((int) _nLines - nc._len);
assert nc._len == _nLines:"incompatible number of lines after parsing chunk, " + _nLines + " != " + nc._len;
}
return super.close(fs);
}
}