package water.rapids.ast.prims.reducers;
import water.fvec.Frame;
import water.fvec.Vec;
import water.rapids.Env;
import water.rapids.Val;
import water.rapids.vals.ValNum;
import water.rapids.vals.ValRow;
import water.rapids.ast.AstRoot;
/**
* Optimization for the RollupStats: use them directly
*/
public abstract class AstRollupOp extends AstReducerOp {
@Override
public String[] args() {
return new String[]{"ary"};
}
public abstract double rup(Vec vec);
@Override
public Val apply(Env env, Env.StackHelp stk, AstRoot asts[]) {
Val arg1 = asts[1].exec(env);
if (arg1.isRow()) { // Row-wise operation
double[] ds = arg1.getRow();
double d = ds[0];
for (int i = 1; i < ds.length; i++)
d = op(d, ds[i]);
return new ValRow(new double[]{d}, null);
}
// Normal column-wise operation
Frame fr = stk.track(arg1).getFrame();
Vec[] vecs = fr.vecs();
if (vecs.length == 0 || vecs[0].naCnt() > 0) return new ValNum(Double.NaN);
double d = rup(vecs[0]);
for (int i = 1; i < vecs.length; i++) {
if (vecs[i].naCnt() > 0) return new ValNum(Double.NaN);
d = op(d, rup(vecs[i]));
}
return new ValNum(d);
}
}