package hex.createframe.columns;
import hex.createframe.CreateFrameColumnMaker;
import water.fvec.NewChunk;
import water.fvec.Vec;
import java.util.Random;
/**
* Random categorical column.
*/
public class CategoricalColumnCfcm extends CreateFrameColumnMaker {
private String name;
private int numFactors;
private String[] domain;
public CategoricalColumnCfcm() {
}
public CategoricalColumnCfcm(String colName, int nFactors) {
name = colName;
numFactors = nFactors;
if (name.equals("response"))
prepareAnimalDomain();
else
prepareSimpleDomain();
}
@Override public void exec(int nrows, NewChunk[] ncs, Random rng) {
for (int row = 0; row < nrows; ++row)
ncs[index].addNum((int)(rng.nextDouble() * numFactors));
}
@Override public String[] columnNames() {
return new String[]{name};
}
@Override public byte[] columnTypes() {
return new byte[]{Vec.T_CAT};
}
@Override public String[][] columnDomains() {
return new String[][]{domain};
}
@Override public float byteSizePerRow() {
return numFactors < 128 ? 1 : numFactors < 32768 ? 2 : 4;
}
private void prepareSimpleDomain() {
domain = new String[numFactors];
for (int i = 0; i < numFactors; ++i) {
domain[i] = "c" + index + ".l" + i;
}
}
private static String[] _animals =
new String[]{"cat", "dog", "fish", "cow", "horse", "pig", "bird", "lion", "sheep", "rhino", "bull", "eagle",
"crab", "wolf", "duck", "crow", "fox", "bear", "hare", "camel", "bat", "frog", "ant", "otter",
"tiger", "rat", "snake", "zebra", "seal", "bison", "newt", "deer", "mouse", "turkey"};
private void prepareAnimalDomain() {
domain = new String[numFactors];
System.arraycopy(_animals, 0, domain, 0, Math.min(numFactors, _animals.length));
if (numFactors > _animals.length) {
int k = _animals.length;
OUTER:
for (int i = 0; i < _animals.length; i++)
for (int j = 0; j < _animals.length; j++) {
if (i == j) continue;
domain[k++] = _animals[i] + _animals[j];
if (k == numFactors) break OUTER;
}
}
}
}