package water.rapids.transforms;
import water.Iced;
import water.fvec.Frame;
import water.rapids.ast.AstExec;
import water.rapids.ast.AstParameter;
import water.rapids.Rapids;
import water.util.IcedHashMap;
import water.util.SB;
public abstract class Transform<T> extends Iced {
protected final String _name;
protected final AstExec _ast;
protected final boolean _inplace;
protected final String[] _newNames;
protected final IcedHashMap<String,AstParameter> _params;
protected String[] _inNames;
protected String[] _inTypes;
protected String[] _outTypes;
protected String[] _outNames;
Transform(String name, String ast, boolean inplace, String[] newNames) {
_name=name;
_ast = (AstExec) Rapids.parse(ast);
_inplace = inplace;
_newNames = newNames;
_params = new IcedHashMap<>();
}
public String name() { return _name; }
protected abstract Transform<T> fit(Frame f);
public Frame transform(Frame f) {
_inNames = f.names();
_inTypes = f.typesStr();
Frame ff = transformImpl(f);
_outTypes= ff.typesStr();
_outNames= ff.names();
return ff;
}
protected abstract Frame transformImpl(Frame f);
abstract Frame inverseTransform(Frame f);
public Frame fitTransform(Frame f) { return fit(f).transform(f); }
public abstract String genClassImpl();
public StringBuilder genClass() {
String stepName = name();
StringBuilder sb = new StringBuilder();
sb.append(" class " + stepName + " extends Step<" + stepName + "> {\n");
sb.append(" public " + stepName + "() { super(new String[]{" + toJavaString(_inNames) +"},\n");
sb.append(" new String[]{" + toJavaString(_inTypes) + "}," +
" new String[]{" + toJavaString(_outNames) +"});\n");
for (String k : _params.keySet()) {
String v = _params.get(k).toJavaString();
sb.append(
" _params.put(\""+k+"\", new String[]{"+v.replace("\\","\\\\")+"});\n"
);
}
sb.append(" }\n");
return sb.append(genClassImpl()).append(" }\n");
}
private static String toJavaString(String[] strs) {
if( strs==null || strs.length==0 ) return "\"null\"";
SB sb = new SB();
for(int i=0;i<strs.length;++i) {
sb.p("\"").p(strs[i]).p("\"");
if( i==strs.length-1) return sb.toString();
sb.p(',');
}
throw new RuntimeException("Should never be here");
}
protected static String toJavaPrimitive(String vecType) {
if( vecType.equals("String") || vecType.equals("Enum") ) return "String";
return "double";
}
}