A C/C++ HLS-ready implementation of a Hoeffding Tree.
Statistical storage in nodes is made through quantile estimation using assymetric signum functions. Derived from the work of Lin et al.
//#define USE_XILINX_AP_TYPES
#include "HoeffdingTree.hpp"
#define ATTRIBUTES 16
#define CLASSES 2
#define NODES 127
#define SAMPLE_ARRAY_SIZE 10000
typedef HoeffdingTree<Node<NodeData<float, // datatype
ATTRIBUTES, // Attributes
CLASSES // Classes
>,
NODES // Node upperbound
>>
Tree;
typedef Tree::data_t data_t;
template <class T> struct Prediction {
typename T::class_index_t classification;
typename T::data_t confidence;
};
template <class T> struct Sample {
typename T::data_t data[T::_DataClass::N_Attributes];
typename T::class_index_t classification;
bool doSplitTrial;
};
extern "C" {
void krnl_Tree(Tree *tree, Sample<Tree> sample[SAMPLE_ARRAY_SIZE], Prediction<Tree> prediction[SAMPLE_ARRAY_SIZE], unsigned int bundleSize) {
sample_loop: for (unsigned int i = 0; i < bundleSize; i++) {
if (sample[i]->doSplitTrial) {
std::tie(prediction[i]->classification, prediction[i]->confidence) =
tree->train(sample[i]->data, sample[i]->classification, true);
} else {
std::tie(prediction[i]->classification, prediction[i]->confidence) =
tree->infer(sample[i]->data);
}
}
}
}