Search in sources :

Example 16 with ValNum

use of water.rapids.vals.ValNum in project h2o-3 by h2oai.

the class AstIfElse method apply.

@Override
public Val apply(Env env, Env.StackHelp stk, AstRoot[] asts) {
    Val val = stk.track(asts[1].exec(env));
    if (val.isNum()) {
        // Scalar test, scalar result
        double d = val.getNum();
        if (Double.isNaN(d))
            return new ValNum(Double.NaN);
        // exec only 1 of false and true
        Val res = stk.track(asts[d == 0 ? 3 : 2].exec(env));
        return res.isFrame() ? new ValNum(res.getFrame().vec(0).at(0)) : res;
    }
    // Frame test.  Frame result.
    if (val.type() == Val.ROW)
        return row_ifelse((ValRow) val, asts[2].exec(env), asts[3].exec(env));
    Frame tst = val.getFrame();
    // If all zero's, return false and never execute true.
    Frame fr = new Frame(tst);
    Val tval = null;
    for (Vec vec : tst.vecs()) if (vec.min() != 0 || vec.max() != 0) {
        tval = exec_check(env, stk, tst, asts[2], fr);
        break;
    }
    final boolean has_tfr = tval != null && tval.isFrame();
    final String ts = (tval != null && tval.isStr()) ? tval.getStr() : null;
    final double td = (tval != null && tval.isNum()) ? tval.getNum() : Double.NaN;
    final int[] tsIntMap = new int[tst.numCols()];
    // If all nonzero's (or NA's), then never execute false.
    Val fval = null;
    for (Vec vec : tst.vecs()) if (vec.nzCnt() + vec.naCnt() < vec.length()) {
        fval = exec_check(env, stk, tst, asts[3], fr);
        break;
    }
    final boolean has_ffr = fval != null && fval.isFrame();
    final String fs = (fval != null && fval.isStr()) ? fval.getStr() : null;
    final double fd = (fval != null && fval.isNum()) ? fval.getNum() : Double.NaN;
    final int[] fsIntMap = new int[tst.numCols()];
    String[][] domains = null;
    final int[][] maps = new int[tst.numCols()][];
    if (fs != null || ts != null) {
        // time to build domains...
        domains = new String[tst.numCols()][];
        if (fs != null && ts != null) {
            for (int i = 0; i < tst.numCols(); ++i) {
                // false => 0; truth => 1
                domains[i] = new String[] { fs, ts };
                fsIntMap[i] = 0;
                tsIntMap[i] = 1;
            }
        } else if (ts != null) {
            for (int i = 0; i < tst.numCols(); ++i) {
                if (has_ffr) {
                    Vec v = fr.vec(i + tst.numCols() + (has_tfr ? tst.numCols() : 0));
                    if (!v.isCategorical())
                        throw H2O.unimpl("Column is not categorical.");
                    String[] dom = Arrays.copyOf(v.domain(), v.domain().length + 1);
                    dom[dom.length - 1] = ts;
                    Arrays.sort(dom);
                    maps[i] = computeMap(v.domain(), dom);
                    tsIntMap[i] = ArrayUtils.find(dom, ts);
                    domains[i] = dom;
                } else
                    throw H2O.unimpl();
            }
        } else {
            // fs!=null
            for (int i = 0; i < tst.numCols(); ++i) {
                if (has_tfr) {
                    Vec v = fr.vec(i + tst.numCols() + (has_ffr ? tst.numCols() : 0));
                    if (!v.isCategorical())
                        throw H2O.unimpl("Column is not categorical.");
                    String[] dom = Arrays.copyOf(v.domain(), v.domain().length + 1);
                    dom[dom.length - 1] = fs;
                    Arrays.sort(dom);
                    maps[i] = computeMap(v.domain(), dom);
                    fsIntMap[i] = ArrayUtils.find(dom, fs);
                    domains[i] = dom;
                } else
                    throw H2O.unimpl();
            }
        }
    }
    // Now pick from left-or-right in the new frame
    Frame res = new MRTask() {

        @Override
        public void map(Chunk[] chks, NewChunk[] nchks) {
            assert nchks.length + (has_tfr ? nchks.length : 0) + (has_ffr ? nchks.length : 0) == chks.length;
            for (int i = 0; i < nchks.length; i++) {
                Chunk ctst = chks[i];
                NewChunk res = nchks[i];
                for (int row = 0; row < ctst._len; row++) {
                    double d;
                    if (ctst.isNA(row))
                        d = Double.NaN;
                    else if (ctst.atd(row) == 0)
                        d = has_ffr ? domainMap(chks[i + nchks.length + (has_tfr ? nchks.length : 0)].atd(row), maps[i]) : fs != null ? fsIntMap[i] : fd;
                    else
                        d = has_tfr ? domainMap(chks[i + nchks.length].atd(row), maps[i]) : ts != null ? tsIntMap[i] : td;
                    res.addNum(d);
                }
            }
        }
    }.doAll(tst.numCols(), Vec.T_NUM, fr).outputFrame(null, domains);
    // flatten domains since they may be larger than needed
    if (domains != null) {
        for (int i = 0; i < res.numCols(); ++i) {
            if (res.vec(i).domain() != null) {
                final long[] dom = new VecUtils.CollectDomainFast((int) res.vec(i).max()).doAll(res.vec(i)).domain();
                String[] newDomain = new String[dom.length];
                for (int l = 0; l < dom.length; ++l) newDomain[l] = res.vec(i).domain()[(int) dom[l]];
                new MRTask() {

                    @Override
                    public void map(Chunk c) {
                        for (int i = 0; i < c._len; ++i) {
                            if (!c.isNA(i))
                                c.set(i, ArrayUtils.find(dom, c.at8(i)));
                        }
                    }
                }.doAll(res.vec(i));
                // needs a DKVput?
                res.vec(i).setDomain(newDomain);
            }
        }
    }
    return new ValFrame(res);
}
Also used : ValFrame(water.rapids.vals.ValFrame) Frame(water.fvec.Frame) ValNum(water.rapids.vals.ValNum) Chunk(water.fvec.Chunk) NewChunk(water.fvec.NewChunk) NewChunk(water.fvec.NewChunk) ValFrame(water.rapids.vals.ValFrame) ValRow(water.rapids.vals.ValRow) Vec(water.fvec.Vec) MRTask(water.MRTask)

Example 17 with ValNum

use of water.rapids.vals.ValNum in project h2o-3 by h2oai.

the class AstMad method apply.

@Override
public ValNum apply(Env env, Env.StackHelp stk, AstRoot[] asts) {
    Frame fr = stk.track(asts[1].exec(env)).getFrame();
    Vec[] vecs = fr.vecs();
    if (vecs.length == 0 || vecs[0].naCnt() > 0)
        return new ValNum(Double.NaN);
    if (vecs.length > 1)
        throw new IllegalArgumentException("MAD expects a single numeric column");
    QuantileModel.CombineMethod cm = QuantileModel.CombineMethod.valueOf(asts[2].exec(env).getStr().toUpperCase());
    double constant = asts[3].exec(env).getNum();
    return new ValNum(mad(fr, cm, constant));
}
Also used : Frame(water.fvec.Frame) Vec(water.fvec.Vec) ValNum(water.rapids.vals.ValNum) QuantileModel(hex.quantile.QuantileModel)

Example 18 with ValNum

use of water.rapids.vals.ValNum in project h2o-3 by h2oai.

the class AstMktime method apply.

@Override
public Val apply(Env env, Env.StackHelp stk, AstRoot[] asts) {
    // Seven args, all required.  See if any are arrays.
    Frame[] fs = new Frame[nargs() - 1];
    int[] is = new int[nargs() - 1];
    // Sample frame (for auto-expanding constants)
    Frame x = null;
    for (int i = 1; i < nargs(); i++) if (asts[i] instanceof AstId || asts[i] instanceof AstExec)
        fs[i - 1] = x = stk.track(asts[i].exec(env)).getFrame();
    else
        is[i - 1] = (int) asts[i].exec(env).getNum();
    if (x == null) {
        // Single point
        long msec = new MutableDateTime(// year
        is[0], // month
        is[1] + 1, // day
        is[2] + 1, // hour
        is[3], // minute
        is[4], // second
        is[5], // msec
        is[6]).getMillis();
        return new ValNum(msec);
    }
    // Make constant Vecs for the constant args.  Commonly, they'll all be zero
    Vec[] vecs = new Vec[7];
    for (int i = 0; i < 7; i++) {
        if (fs[i] == null) {
            vecs[i] = x.anyVec().makeCon(is[i]);
        } else {
            if (fs[i].numCols() != 1)
                throw new IllegalArgumentException("Expect single column");
            vecs[i] = fs[i].anyVec();
        }
    }
    // Convert whole column to epoch msec
    Frame fr2 = new MRTask() {

        @Override
        public void map(Chunk[] chks, NewChunk[] nchks) {
            MutableDateTime dt = new MutableDateTime(0);
            NewChunk n = nchks[0];
            int rlen = chks[0]._len;
            for (int r = 0; r < rlen; r++) {
                dt.setDateTime(// year
                (int) chks[0].at8(r), // month
                (int) chks[1].at8(r) + 1, // day
                (int) chks[2].at8(r) + 1, // hour
                (int) chks[3].at8(r), // minute
                (int) chks[4].at8(r), // second
                (int) chks[5].at8(r), // msec
                (int) chks[6].at8(r));
                n.addNum(dt.getMillis());
            }
        }
    }.doAll(new byte[] { Vec.T_NUM }, vecs).outputFrame(new String[] { "msec" }, null);
    // Clean up the constants
    for (int i = 0; i < nargs() - 1; i++) if (fs[i] == null)
        vecs[i].remove();
    return new ValFrame(fr2);
}
Also used : ValFrame(water.rapids.vals.ValFrame) Frame(water.fvec.Frame) AstExec(water.rapids.ast.AstExec) MutableDateTime(org.joda.time.MutableDateTime) ValNum(water.rapids.vals.ValNum) NewChunk(water.fvec.NewChunk) ValFrame(water.rapids.vals.ValFrame) AstId(water.rapids.ast.params.AstId) Vec(water.fvec.Vec) MRTask(water.MRTask)

Example 19 with ValNum

use of water.rapids.vals.ValNum in project h2o-3 by h2oai.

the class AstNaRollupOp method apply.

@Override
public ValNum apply(Env env, Env.StackHelp stk, AstRoot[] asts) {
    Frame fr = stk.track(asts[1].exec(env)).getFrame();
    Vec[] vecs = fr.vecs();
    if (vecs.length == 0)
        return new ValNum(Double.NaN);
    double d = rup(vecs[0]);
    for (int i = 1; i < vecs.length; i++) d = op(d, rup(vecs[i]));
    return new ValNum(d);
}
Also used : Frame(water.fvec.Frame) Vec(water.fvec.Vec) ValNum(water.rapids.vals.ValNum)

Example 20 with ValNum

use of water.rapids.vals.ValNum in project h2o-3 by h2oai.

the class AstProdNa method apply.

@Override
public ValNum apply(Env env, Env.StackHelp stk, AstRoot[] asts) {
    Frame fr = stk.track(asts[1].exec(env)).getFrame();
    for (Vec v : fr.vecs()) if (v.isCategorical() || v.isUUID() || v.isString())
        throw new IllegalArgumentException("`" + str() + "`" + " only defined on a data frame with all numeric variables");
    double prod = new AstProdNa.RedProd().doAll(fr)._d;
    return new ValNum(prod);
}
Also used : Frame(water.fvec.Frame) Vec(water.fvec.Vec) ValNum(water.rapids.vals.ValNum)

Aggregations

ValNum (water.rapids.vals.ValNum)20 Frame (water.fvec.Frame)15 Vec (water.fvec.Vec)11 ValFrame (water.rapids.vals.ValFrame)8 MRTask (water.MRTask)6 Key (water.Key)4 NewChunk (water.fvec.NewChunk)4 Val (water.rapids.Val)4 Chunk (water.fvec.Chunk)3 ValRow (water.rapids.vals.ValRow)3 BufferedString (water.parser.BufferedString)2 Model (hex.Model)1 QuantileModel (hex.quantile.QuantileModel)1 MutableDateTime (org.joda.time.MutableDateTime)1 Iced (water.Iced)1 Value (water.Value)1 AstExec (water.rapids.ast.AstExec)1 AstId (water.rapids.ast.params.AstId)1 ValStr (water.rapids.vals.ValStr)1