package hex; import water.H2O.H2OCountedCompleter; import water.MRTask2; import water.MemoryManager; import water.fvec.*; import java.util.Arrays; /** * Created by tomasnykodym on 11/25/14. */ public class OrderTsk extends MRTask2<OrderTsk> { final int _n; final boolean _rev; public long [] _ids; double [] _vals; public OrderTsk(H2OCountedCompleter cmp, int n, boolean rev) { super(cmp); _n = n; _rev = rev; } private boolean addVal(long id, double val) { int x = _n-1; if(_vals[x] > val) { _vals[x] = val; _ids[x] = id; while (x > 0 && _vals[x - 1] > _vals[x]) { double v = _vals[x - 1]; _vals[x - 1] = _vals[x]; _vals[x] = v; long l = _ids[x - 1]; _ids[x - 1] = _ids[x]; _ids[x] = l; --x; } } return x < _n; } @Override public void map(Chunk c) { _ids = MemoryManager.malloc8(_n); _vals = MemoryManager.malloc8d(_n); Arrays.fill(_vals,Double.POSITIVE_INFINITY); Arrays.fill(_ids,-1); for(int i = c.nextNZ(-1); i < c._len; i = c.nextNZ(i)) addVal(i + c._start,_rev?-c.at0(i):c.at0(i)); } @Override public void reduce(OrderTsk ot) { int i = 0; while(i < _n && addVal(ot._ids[i],ot._vals[i])) ++i; } @Override public void postGlobal(){ if(_rev) for(int i = 0; i < _vals.length; ++i) _vals[i] *= -1; } }