
water.rapids.ASTApply Maven / Gradle / Ivy
package water.rapids;
import water.H2O;
import water.fvec.*;
import water.MRTask;
/** Apply a Function to a frame
* Typically, column-by-column, produces a 1-row frame as a result
*/
class ASTApply extends ASTPrim {
@Override
public String[] args() { return new String[]{"ary", "margin", "fun"}; }
@Override int nargs() { return 1+3; } // (apply frame 1/2 fun)
@Override public String str() { return "apply"; }
@Override
public Val apply(Env env, Env.StackHelp stk, AST asts[]) {
Frame fr = stk.track(asts[1].exec(env)).getFrame();
double margin= stk.track(asts[2].exec(env)).getNum();
AST fun = stk.track(asts[3].exec(env)).getFun();
int nargs = fun.nargs();
if( nargs != -1 && nargs != 2 )
throw new IllegalArgumentException("Incorrect number of arguments; '"+fun+"' expects "+nargs+" but was passed "+2);
switch( (int)margin ) {
case 1: return rowwise(env, fr,fun);
case 2: return colwise(env,stk,fr,fun);
default: throw new IllegalArgumentException("Only row-wise (margin 1) or col-wise (margin 2) allowed");
}
}
// --------------------------------------------------------------------------
private Val colwise( Env env, Env.StackHelp stk, Frame fr, AST fun ) {
// Break each column into it's own Frame, then execute the function passing
// the 1 argument. All columns are independent, and this loop should be
// parallized over each column.
Vec vecs[] = fr.vecs();
Val vals[] = new Val[vecs.length];
AST[] asts = new AST[]{fun,null};
for( int i=0; i
© 2015 - 2025 Weber Informatics LLC | Privacy Policy