package hex;
import water.DKV;
import water.Iced;
import water.Job;
import water.Key;
import water.fvec.CreateInteractions;
import water.fvec.Frame;
import water.util.Log;
import water.util.PrettyPrint;
import java.util.Arrays;
/**
* Create new factors that represent interactions of the given factors
*/
public class Interaction extends Iced {
public Job<Frame> _job;
public Key<Frame> _source_frame;
public String[] _factor_columns;
public boolean _pairwise = false;
public int _max_factors = 100;
public int _min_occurrence = 1;
public boolean _interactOnNA = true;
transient public int[] _factors = new int[0];
public Job<Frame> execImpl(Key<Frame> dest ) {
_job = new Job(dest == null ? Key.make() : dest, Frame.class.getName(), "CreateFrame");
Frame source_frame = DKV.getGet(_source_frame);
assert(source_frame != null);
if (_factor_columns == null || _factor_columns.length == 0) throw new IllegalArgumentException("factor_columns must be specified.");
if (_pairwise && _factor_columns.length < 3) Log.info("Ignoring the pairwise option, requires 3 or more factors.");
_factors = new int[_factor_columns.length];
int count=0;
for (String v: _factor_columns) {
int idx = source_frame.find(v);
if (idx >= 0) {
if (!source_frame.vecs()[idx].isCategorical()) {
throw new IllegalArgumentException("Column " + v + " is not categorical.");
}
_factors[count++] = idx;
} else {
throw new IllegalArgumentException("Column " + v + " not found.");
}
}
CreateInteractions in = new CreateInteractions(this);
return _job.start(in, in.work());
}
@Override public String toString() {
Frame res = _job.get();
if (res == null) return "Output frame not found";
if (!_pairwise)
return "Created interaction feature " + res.names()[0]
+ " (order: " + _factors.length + ") with " + res.lastVec().domain().length + " factor levels"
+ " in" + PrettyPrint.msecs(_job.msec(), true);
else
return "Created " + res.numCols() + " pair-wise interaction features " + Arrays.deepToString(res.names())
+ " (order: 2) in" + PrettyPrint.msecs(_job.msec(), true);
}
}