All Downloads are FREE. Search and download functionalities are using the official Maven repository.

water.rapids.ASTApply Maven / Gradle / Ivy

There is a newer version: 3.8.2.9
Show newest version
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