#include <cassert>
#include <algorithm>
#include "daal.h"
#include "service.h"
using namespace daal::data_management;
class MySquaringModifier : public modifiers::csv::FeatureModifier
{
public:
virtual void apply(modifiers::csv::Context &context)
{
const size_t numberOfTokens = context.getNumberOfTokens();
daal::services::BufferView<DAAL_DATA_TYPE> outputBuffer = context.getOutputBuffer();
assert(numberOfTokens == outputBuffer.size());
for (size_t i = 0; i < numberOfTokens; i++)
{
const float x = context.getTokenAs<float>(i);
outputBuffer[i] = x * x;
}
}
};
class MyMaxFeatureModifier : public modifiers::csv::FeatureModifier
{
public:
virtual void initialize(modifiers::csv::Config &config)
{
config.setNumberOfOutputFeatures(1);
}
virtual void apply(modifiers::csv::Context &context)
{
const size_t numberOfTokens = context.getNumberOfTokens();
float maxFeature = context.getTokenAs<float>(0);
for (size_t i = 1; i < numberOfTokens; i++)
{
maxFeature = std::max(maxFeature, context.getTokenAs<float>(i));
}
context.getOutputBuffer()[0] = maxFeature;
}
};
int main(int argc, char *argv[])
{
const std::string csvFileName = "../data/batch/mixed_text_and_numbers.csv";
checkArguments(argc, argv, 1, &csvFileName);
const CsvDataSourceOptions csvOptions = CsvDataSourceOptions::allocateNumericTable |
CsvDataSourceOptions::createDictionaryFromContext |
CsvDataSourceOptions::parseHeader;
FileDataSource<CSVFeatureManager> ds(csvFileName, csvOptions);
ds.getFeatureManager()
.addModifier( features::list("Numeric1"), modifiers::csv::continuous() )
.addModifier( features::list("Numeric2", "Numeric5"), modifiers::csv::custom<MySquaringModifier>() )
.addModifier( features::list("Numeric0", "Numeric5"), modifiers::csv::custom<MyMaxFeatureModifier>() );
ds.loadDataBlock();
printNumericTable(ds.getNumericTable(), "Loaded numeric table:");
return 0;
}