package com.spbsu.exp.tools;
import com.spbsu.commons.util.ArrayTools;
import com.spbsu.commons.util.Pair;
import com.spbsu.commons.math.Func;
import com.spbsu.commons.math.Trans;
import com.spbsu.ml.func.Ensemble;
import com.spbsu.ml.func.FuncEnsemble;
import com.spbsu.ml.models.MultiClassModel;
import com.spbsu.ml.models.ObliviousTree;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
/**
* User: qdeee
* Date: 25.08.14
*/
public class FeatureFrequency {
public static int[] calcFeaturesFreq(final Trans model) {
final int[] counts = new int[model.xdim()];
callCorrespond(model, counts);
return counts;
}
public static Pair<int[], int[]> getSortedFeaturesFreq(final Trans model) {
final int[] counts = calcFeaturesFreq(model);
final int[] idxs = ArrayTools.sequence(0, counts.length);
ArrayTools.parallelSort(counts, idxs);
return Pair.create(idxs, counts);
}
private static void callCorrespond(final Trans model, final int[] counts) {
try {
final Method method = FeatureFrequency.class.getDeclaredMethod("calcFreq", model.getClass(), counts.getClass());
method.setAccessible(true);
method.invoke(null, model, counts);
}
catch (NoSuchMethodException ignored) {}
catch (InvocationTargetException | IllegalAccessException e) {
throw new RuntimeException(e);
}
}
private static void calcFreq(final ObliviousTree tree, final int[] counts) {
final int depth = Math.min(tree.features().size(), 2); //scan only first two levels
for (int i = 0; i < depth; i++) {
counts[tree.features().get(i).findex]++;
}
}
private static void calcFreq(final MultiClassModel multiClassModel, final int[] counts) {
final Func[] dirs = multiClassModel.getInternModel().dirs();
for (Func func : dirs) {
callCorrespond(func, counts);
}
}
private static void calcFreq(final Ensemble ensemble, final int[] counts) {
final Trans[] models = ensemble.models;
for (Trans model : models) {
callCorrespond(model, counts);
}
}
private static void calcFreq(final FuncEnsemble ensemble, final int[] counts) {
calcFreq((Ensemble) ensemble, counts);
}
}