// Compute a sparse float buffer private byte[] bufD(final int valsz) { int log = 0; while ((1 << log) < valsz) ++log; assert (1 << log) == valsz; final int ridsz = _len >= 65535 ? 4 : 2; final int elmsz = ridsz + valsz; int off = CXDChunk._OFF; byte[] buf = MemoryManager.malloc1(off + sparseLen() * elmsz, true); for (int i = 0; i < sparseLen(); i++, off += elmsz) { if (ridsz == 2) UnsafeUtils.set2(buf, off, (short) _id[i]); else UnsafeUtils.set4(buf, off, _id[i]); final double dval = _ds == null ? isNA2(i) ? Double.NaN : _ls[i] * PrettyPrint.pow10(_xs[i]) : _ds[i]; switch (valsz) { case 4: UnsafeUtils.set4f(buf, off + ridsz, (float) dval); break; case 8: UnsafeUtils.set8d(buf, off + ridsz, dval); break; default: throw H2O.fail(); } } assert off == buf.length; return buf; }
// Compute a compressed integer buffer private byte[] bufX(long bias, int scale, int off, int log) { byte[] bs = new byte[(_len << log) + off]; int j = 0; for (int i = 0; i < _len; i++) { long le = -bias; if (_id == null || _id.length == 0 || (j < _id.length && _id[j] == i)) { if (isNA2(j)) { le = NAS[log]; } else { int x = (_xs[j] == Integer.MIN_VALUE + 1 ? 0 : _xs[j]) - scale; le += x >= 0 ? _ls[j] * PrettyPrint.pow10i(x) : _ls[j] / PrettyPrint.pow10i(-x); } ++j; } switch (log) { case 0: bs[i + off] = (byte) le; break; case 1: UnsafeUtils.set2(bs, (i << 1) + off, (short) le); break; case 2: UnsafeUtils.set4(bs, (i << 2) + off, (int) le); break; case 3: UnsafeUtils.set8(bs, (i << 3) + off, le); break; default: throw H2O.fail(); } } assert j == sparseLen() : "j = " + j + ", len = " + sparseLen() + ", len2 = " + _len + ", id[j] = " + _id[j]; return bs; }
// Compute a sparse integer buffer private byte[] bufS(final int valsz) { int log = 0; while ((1 << log) < valsz) ++log; assert valsz == 0 || (1 << log) == valsz; final int ridsz = _len >= 65535 ? 4 : 2; final int elmsz = ridsz + valsz; int off = CXIChunk._OFF; byte[] buf = MemoryManager.malloc1(off + sparseLen() * elmsz, true); for (int i = 0; i < sparseLen(); i++, off += elmsz) { if (ridsz == 2) UnsafeUtils.set2(buf, off, (short) _id[i]); else UnsafeUtils.set4(buf, off, _id[i]); if (valsz == 0) { assert _xs[i] == 0 && _ls[i] == 1; continue; } assert _xs[i] == Integer.MIN_VALUE || _xs[i] >= 0 : "unexpected exponent " + _xs[i]; // assert we have int or NA final long lval = _xs[i] == Integer.MIN_VALUE ? NAS[log] : _ls[i] * PrettyPrint.pow10i(_xs[i]); switch (valsz) { case 1: buf[off + ridsz] = (byte) lval; break; case 2: short sval = (short) lval; UnsafeUtils.set2(buf, off + ridsz, sval); break; case 4: int ival = (int) lval; UnsafeUtils.set4(buf, off + ridsz, ival); break; case 8: UnsafeUtils.set8(buf, off + ridsz, lval); break; default: throw H2O.fail(); } } assert off == buf.length; return buf; }