package water.parser; import water.Futures; import water.fvec.AppendableVec; import water.fvec.NewChunk; import water.fvec.Vec; import java.util.Arrays; // -------------------------------------------------------- public class SVMLightFVecParseWriter extends FVecParseWriter { protected final Vec.VectorGroup _vg; int _vecIdStart; public SVMLightFVecParseWriter(Vec.VectorGroup vg, int vecIdStart, int cidx, int chunkSize, AppendableVec[] avs){ super(vg, cidx, null, null, chunkSize, 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); _col = 0; } @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); _col = colIdx+1; } @Override public void newLine() { ++_nLines; _col = 0; } @Override public void addStrCol(int idx, BufferedString str){addInvalidCol(idx);} @Override public boolean isString(int idx){return false;} @Override public FVecParseWriter close(Futures fs) { if (_nvs != null) { for(NewChunk nc:_nvs) { nc.addZeros((int) _nLines - nc._len); assert nc._len == _nLines:"incompatible number of lines after parsing chunk, " + _nLines + " != " + nc._len; } } _nCols = _nvs == null ? 0 : _nvs.length; return super.close(fs); } private void addColumns(int newColCnt){ int oldColCnt = _vecs.length; if(newColCnt > oldColCnt){ _nvs = Arrays.copyOf(_nvs, newColCnt); _vecs = Arrays.copyOf(_vecs , newColCnt); for(int i = oldColCnt; i < newColCnt; ++i) { _vecs[i] = new AppendableVec(_vg.vecKey(i+_vecIdStart),_vecs[0]._tmp_espc,Vec.T_NUM,_vecs[0]._chunkOff); _nvs[i] = new NewChunk(_vecs[i], _cidx, true); } _nCols = newColCnt; } } }