lib/model/FunctionTypes.cc (1,635 lines of code) (raw):
/*
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
* or more contributor license agreements. Licensed under the Elastic License
* 2.0 and the following additional limitation. Functionality enabled by the
* files subject to the Elastic License 2.0 may only be used in production when
* invoked by an Elasticsearch process with a license key installed that permits
* use of machine learning features. You may not use this file except in
* compliance with the Elastic License 2.0 and the foregoing additional
* limitation.
*/
#include <model/FunctionTypes.h>
#include <core/CLogger.h>
#include <boost/config.hpp>
#include <map>
#include <ostream>
namespace ml {
namespace model {
namespace function_t {
using TFeatureVec = model_t::TFeatureVec;
bool isIndividual(EFunction function) {
switch (function) {
case E_IndividualCount:
case E_IndividualNonZeroCount:
case E_IndividualRareCount:
case E_IndividualRareNonZeroCount:
case E_IndividualRare:
case E_IndividualLowCounts:
case E_IndividualHighCounts:
case E_IndividualLowNonZeroCount:
case E_IndividualHighNonZeroCount:
case E_IndividualDistinctCount:
case E_IndividualLowDistinctCount:
case E_IndividualHighDistinctCount:
case E_IndividualInfoContent:
case E_IndividualHighInfoContent:
case E_IndividualLowInfoContent:
case E_IndividualTimeOfDay:
case E_IndividualTimeOfWeek:
case E_IndividualMetric:
case E_IndividualMetricMean:
case E_IndividualMetricLowMean:
case E_IndividualMetricHighMean:
case E_IndividualMetricMedian:
case E_IndividualMetricLowMedian:
case E_IndividualMetricHighMedian:
case E_IndividualMetricMin:
case E_IndividualMetricMax:
case E_IndividualMetricVariance:
case E_IndividualMetricLowVariance:
case E_IndividualMetricHighVariance:
case E_IndividualMetricSum:
case E_IndividualMetricLowSum:
case E_IndividualMetricHighSum:
case E_IndividualMetricNonNullSum:
case E_IndividualMetricLowNonNullSum:
case E_IndividualMetricHighNonNullSum:
case E_IndividualLatLong:
case E_IndividualMaxVelocity:
case E_IndividualMinVelocity:
case E_IndividualMeanVelocity:
case E_IndividualSumVelocity:
return true;
case E_PopulationCount:
case E_PopulationDistinctCount:
case E_PopulationLowDistinctCount:
case E_PopulationHighDistinctCount:
case E_PopulationRare:
case E_PopulationRareCount:
case E_PopulationFreqRare:
case E_PopulationFreqRareCount:
case E_PopulationLowCounts:
case E_PopulationHighCounts:
case E_PopulationInfoContent:
case E_PopulationLowInfoContent:
case E_PopulationHighInfoContent:
case E_PopulationTimeOfDay:
case E_PopulationTimeOfWeek:
case E_PopulationMetric:
case E_PopulationMetricMean:
case E_PopulationMetricLowMean:
case E_PopulationMetricHighMean:
case E_PopulationMetricMedian:
case E_PopulationMetricLowMedian:
case E_PopulationMetricHighMedian:
case E_PopulationMetricMin:
case E_PopulationMetricMax:
case E_PopulationMetricVariance:
case E_PopulationMetricLowVariance:
case E_PopulationMetricHighVariance:
case E_PopulationMetricSum:
case E_PopulationMetricLowSum:
case E_PopulationMetricHighSum:
case E_PopulationLatLong:
case E_PopulationMaxVelocity:
case E_PopulationMinVelocity:
case E_PopulationMeanVelocity:
case E_PopulationSumVelocity:
return false;
}
LOG_ERROR(<< "Unexpected function = " << static_cast<int>(function));
return false;
}
bool isPopulation(EFunction function) {
switch (function) {
case E_IndividualCount:
case E_IndividualNonZeroCount:
case E_IndividualRareCount:
case E_IndividualRareNonZeroCount:
case E_IndividualRare:
case E_IndividualLowCounts:
case E_IndividualHighCounts:
case E_IndividualLowNonZeroCount:
case E_IndividualHighNonZeroCount:
case E_IndividualDistinctCount:
case E_IndividualLowDistinctCount:
case E_IndividualHighDistinctCount:
case E_IndividualInfoContent:
case E_IndividualHighInfoContent:
case E_IndividualLowInfoContent:
case E_IndividualTimeOfDay:
case E_IndividualTimeOfWeek:
case E_IndividualMetric:
case E_IndividualMetricMean:
case E_IndividualMetricLowMean:
case E_IndividualMetricHighMean:
case E_IndividualMetricMedian:
case E_IndividualMetricLowMedian:
case E_IndividualMetricHighMedian:
case E_IndividualMetricMin:
case E_IndividualMetricMax:
case E_IndividualMetricVariance:
case E_IndividualMetricLowVariance:
case E_IndividualMetricHighVariance:
case E_IndividualMetricSum:
case E_IndividualMetricLowSum:
case E_IndividualMetricHighSum:
case E_IndividualMetricNonNullSum:
case E_IndividualMetricLowNonNullSum:
case E_IndividualMetricHighNonNullSum:
case E_IndividualLatLong:
case E_IndividualMaxVelocity:
case E_IndividualMinVelocity:
case E_IndividualMeanVelocity:
case E_IndividualSumVelocity:
return false;
case E_PopulationCount:
case E_PopulationDistinctCount:
case E_PopulationLowDistinctCount:
case E_PopulationHighDistinctCount:
case E_PopulationRare:
case E_PopulationRareCount:
case E_PopulationFreqRare:
case E_PopulationFreqRareCount:
case E_PopulationLowCounts:
case E_PopulationHighCounts:
case E_PopulationInfoContent:
case E_PopulationLowInfoContent:
case E_PopulationHighInfoContent:
case E_PopulationTimeOfDay:
case E_PopulationTimeOfWeek:
case E_PopulationMetric:
case E_PopulationMetricMean:
case E_PopulationMetricLowMean:
case E_PopulationMetricHighMean:
case E_PopulationMetricMedian:
case E_PopulationMetricLowMedian:
case E_PopulationMetricHighMedian:
case E_PopulationMetricMin:
case E_PopulationMetricMax:
case E_PopulationMetricVariance:
case E_PopulationMetricLowVariance:
case E_PopulationMetricHighVariance:
case E_PopulationMetricSum:
case E_PopulationMetricLowSum:
case E_PopulationMetricHighSum:
case E_PopulationLatLong:
case E_PopulationMaxVelocity:
case E_PopulationMinVelocity:
case E_PopulationMeanVelocity:
case E_PopulationSumVelocity:
return true;
}
LOG_ERROR(<< "Unexpected function = " << static_cast<int>(function));
return false;
}
bool isMetric(EFunction function) {
switch (function) {
case E_IndividualCount:
case E_IndividualNonZeroCount:
case E_IndividualRareCount:
case E_IndividualRareNonZeroCount:
case E_IndividualRare:
case E_IndividualLowCounts:
case E_IndividualHighCounts:
case E_IndividualLowNonZeroCount:
case E_IndividualHighNonZeroCount:
case E_IndividualDistinctCount:
case E_IndividualLowDistinctCount:
case E_IndividualHighDistinctCount:
case E_IndividualInfoContent:
case E_IndividualHighInfoContent:
case E_IndividualLowInfoContent:
case E_IndividualTimeOfDay:
case E_IndividualTimeOfWeek:
return false;
case E_IndividualMetric:
case E_IndividualMetricMean:
case E_IndividualMetricLowMean:
case E_IndividualMetricHighMean:
case E_IndividualMetricMedian:
case E_IndividualMetricLowMedian:
case E_IndividualMetricHighMedian:
case E_IndividualMetricMin:
case E_IndividualMetricMax:
case E_IndividualMetricVariance:
case E_IndividualMetricLowVariance:
case E_IndividualMetricHighVariance:
case E_IndividualMetricSum:
case E_IndividualMetricLowSum:
case E_IndividualMetricHighSum:
case E_IndividualMetricNonNullSum:
case E_IndividualMetricLowNonNullSum:
case E_IndividualMetricHighNonNullSum:
case E_IndividualLatLong:
case E_IndividualMaxVelocity:
case E_IndividualMinVelocity:
case E_IndividualMeanVelocity:
case E_IndividualSumVelocity:
return true;
case E_PopulationCount:
case E_PopulationDistinctCount:
case E_PopulationLowDistinctCount:
case E_PopulationHighDistinctCount:
case E_PopulationRare:
case E_PopulationRareCount:
case E_PopulationFreqRare:
case E_PopulationFreqRareCount:
case E_PopulationLowCounts:
case E_PopulationHighCounts:
case E_PopulationInfoContent:
case E_PopulationLowInfoContent:
case E_PopulationHighInfoContent:
case E_PopulationTimeOfDay:
case E_PopulationTimeOfWeek:
return false;
case E_PopulationMetric:
case E_PopulationMetricMean:
case E_PopulationMetricLowMean:
case E_PopulationMetricHighMean:
case E_PopulationMetricMedian:
case E_PopulationMetricLowMedian:
case E_PopulationMetricHighMedian:
case E_PopulationMetricMin:
case E_PopulationMetricMax:
case E_PopulationMetricVariance:
case E_PopulationMetricLowVariance:
case E_PopulationMetricHighVariance:
case E_PopulationMetricSum:
case E_PopulationMetricLowSum:
case E_PopulationMetricHighSum:
case E_PopulationLatLong:
case E_PopulationMaxVelocity:
case E_PopulationMinVelocity:
case E_PopulationMeanVelocity:
case E_PopulationSumVelocity:
return true;
}
LOG_ERROR(<< "Unexpected function = " << static_cast<int>(function));
return false;
}
bool isForecastSupported(EFunction function) {
switch (function) {
case E_IndividualCount:
case E_IndividualNonZeroCount:
case E_IndividualRareCount:
case E_IndividualRareNonZeroCount:
return true;
case E_IndividualRare:
return false;
case E_IndividualLowCounts:
case E_IndividualHighCounts:
case E_IndividualLowNonZeroCount:
case E_IndividualHighNonZeroCount:
case E_IndividualDistinctCount:
case E_IndividualLowDistinctCount:
case E_IndividualHighDistinctCount:
return true;
case E_IndividualInfoContent:
case E_IndividualHighInfoContent:
case E_IndividualLowInfoContent:
case E_IndividualTimeOfDay:
case E_IndividualTimeOfWeek:
return false;
case E_IndividualMetric:
case E_IndividualMetricMean:
case E_IndividualMetricLowMean:
case E_IndividualMetricHighMean:
case E_IndividualMetricMedian:
case E_IndividualMetricLowMedian:
case E_IndividualMetricHighMedian:
case E_IndividualMetricMin:
case E_IndividualMetricMax:
case E_IndividualMetricVariance:
case E_IndividualMetricLowVariance:
case E_IndividualMetricHighVariance:
case E_IndividualMetricSum:
case E_IndividualMetricLowSum:
case E_IndividualMetricHighSum:
case E_IndividualMetricNonNullSum:
case E_IndividualMetricLowNonNullSum:
case E_IndividualMetricHighNonNullSum:
return true;
case E_IndividualLatLong:
return false;
case E_IndividualMaxVelocity:
case E_IndividualMinVelocity:
case E_IndividualMeanVelocity:
case E_IndividualSumVelocity:
return true;
case E_PopulationCount:
case E_PopulationDistinctCount:
case E_PopulationLowDistinctCount:
case E_PopulationHighDistinctCount:
case E_PopulationRare:
case E_PopulationRareCount:
case E_PopulationFreqRare:
case E_PopulationFreqRareCount:
case E_PopulationLowCounts:
case E_PopulationHighCounts:
case E_PopulationInfoContent:
case E_PopulationLowInfoContent:
case E_PopulationHighInfoContent:
case E_PopulationTimeOfDay:
case E_PopulationTimeOfWeek:
return false;
case E_PopulationMetric:
case E_PopulationMetricMean:
case E_PopulationMetricLowMean:
case E_PopulationMetricHighMean:
case E_PopulationMetricMedian:
case E_PopulationMetricLowMedian:
case E_PopulationMetricHighMedian:
case E_PopulationMetricMin:
case E_PopulationMetricMax:
case E_PopulationMetricVariance:
case E_PopulationMetricLowVariance:
case E_PopulationMetricHighVariance:
case E_PopulationMetricSum:
case E_PopulationMetricLowSum:
case E_PopulationMetricHighSum:
case E_PopulationLatLong:
case E_PopulationMaxVelocity:
case E_PopulationMinVelocity:
case E_PopulationMeanVelocity:
case E_PopulationSumVelocity:
return false;
}
LOG_ERROR(<< "Unexpected function = " << static_cast<int>(function));
return false;
}
bool isAggressivePruningSupported(EFunction function) {
switch (function) {
case E_IndividualCount:
case E_IndividualNonZeroCount:
case E_IndividualRareCount:
case E_IndividualRareNonZeroCount:
return true;
case E_IndividualRare:
return false;
case E_IndividualLowCounts:
case E_IndividualHighCounts:
case E_IndividualLowNonZeroCount:
case E_IndividualHighNonZeroCount:
case E_IndividualDistinctCount:
case E_IndividualLowDistinctCount:
case E_IndividualHighDistinctCount:
case E_IndividualInfoContent:
case E_IndividualHighInfoContent:
case E_IndividualLowInfoContent:
return true;
case E_IndividualTimeOfDay:
case E_IndividualTimeOfWeek:
return false;
case E_IndividualMetric:
case E_IndividualMetricMean:
case E_IndividualMetricLowMean:
case E_IndividualMetricHighMean:
case E_IndividualMetricMedian:
case E_IndividualMetricLowMedian:
case E_IndividualMetricHighMedian:
case E_IndividualMetricMin:
case E_IndividualMetricMax:
case E_IndividualMetricVariance:
case E_IndividualMetricLowVariance:
case E_IndividualMetricHighVariance:
case E_IndividualMetricSum:
case E_IndividualMetricLowSum:
case E_IndividualMetricHighSum:
case E_IndividualMetricNonNullSum:
case E_IndividualMetricLowNonNullSum:
case E_IndividualMetricHighNonNullSum:
return true;
case E_IndividualLatLong:
return false;
case E_IndividualMaxVelocity:
case E_IndividualMinVelocity:
case E_IndividualMeanVelocity:
case E_IndividualSumVelocity:
return true;
case E_PopulationCount:
case E_PopulationDistinctCount:
case E_PopulationLowDistinctCount:
case E_PopulationHighDistinctCount:
return true;
case E_PopulationRare:
return false;
case E_PopulationRareCount:
case E_PopulationFreqRare:
case E_PopulationFreqRareCount:
case E_PopulationLowCounts:
case E_PopulationHighCounts:
case E_PopulationInfoContent:
case E_PopulationLowInfoContent:
case E_PopulationHighInfoContent:
return true;
case E_PopulationTimeOfDay:
case E_PopulationTimeOfWeek:
return false;
case E_PopulationMetric:
case E_PopulationMetricMean:
case E_PopulationMetricLowMean:
case E_PopulationMetricHighMean:
case E_PopulationMetricMedian:
case E_PopulationMetricLowMedian:
case E_PopulationMetricHighMedian:
case E_PopulationMetricMin:
case E_PopulationMetricMax:
case E_PopulationMetricVariance:
case E_PopulationMetricLowVariance:
case E_PopulationMetricHighVariance:
case E_PopulationMetricSum:
case E_PopulationMetricLowSum:
case E_PopulationMetricHighSum:
return true;
case E_PopulationLatLong:
return false;
case E_PopulationMaxVelocity:
case E_PopulationMinVelocity:
case E_PopulationMeanVelocity:
case E_PopulationSumVelocity:
return false;
}
LOG_ERROR(<< "Unexpected function = " << static_cast<int>(function));
return false;
}
namespace {
using TFeatureFunctionVecMap = std::map<model_t::EFeature, TFunctionVec>;
using TFeatureFunctionVecMapItr = TFeatureFunctionVecMap::iterator;
using TFeatureFunctionVecMapCItr = TFeatureFunctionVecMap::const_iterator;
namespace detail {
const model_t::EFeature INDIVIDUAL_COUNT_FEATURES[] = {model_t::E_IndividualCountByBucketAndPerson};
const model_t::EFeature INDIVIDUAL_NON_ZERO_COUNT_FEATURES[] = {
model_t::E_IndividualNonZeroCountByBucketAndPerson};
const model_t::EFeature INDIVIDUAL_RARE_COUNT_FEATURES[] = {
model_t::E_IndividualCountByBucketAndPerson,
model_t::E_IndividualTotalBucketCountByPerson,
};
const model_t::EFeature INDIVIDUAL_RARE_NON_ZERO_COUNT_FEATURES[] = {
model_t::E_IndividualNonZeroCountByBucketAndPerson,
model_t::E_IndividualTotalBucketCountByPerson};
const model_t::EFeature INDIVIDUAL_RARE_FEATURES[] = {
model_t::E_IndividualTotalBucketCountByPerson, model_t::E_IndividualIndicatorOfBucketPerson};
const model_t::EFeature INDIVIDUAL_LOW_COUNTS_FEATURES[] = {
model_t::E_IndividualLowCountsByBucketAndPerson};
const model_t::EFeature INDIVIDUAL_HIGH_COUNTS_FEATURES[] = {
model_t::E_IndividualHighCountsByBucketAndPerson};
const model_t::EFeature INDIVIDUAL_LOW_NON_ZERO_COUNT_FEATURES[] = {
model_t::E_IndividualLowNonZeroCountByBucketAndPerson};
const model_t::EFeature INDIVIDUAL_HIGH_NON_ZERO_COUNT_FEATURES[] = {
model_t::E_IndividualHighNonZeroCountByBucketAndPerson};
const model_t::EFeature INDIVIDUAL_DISTINCT_COUNT_FEATURES[] = {
model_t::E_IndividualUniqueCountByBucketAndPerson};
const model_t::EFeature INDIVIDUAL_LOW_DISTINCT_COUNT_FEATURES[] = {
model_t::E_IndividualLowUniqueCountByBucketAndPerson};
const model_t::EFeature INDIVIDUAL_HIGH_DISTINCT_COUNT_FEATURES[] = {
model_t::E_IndividualHighUniqueCountByBucketAndPerson};
const model_t::EFeature INDIVIDUAL_INFO_CONTENT_FEATURES[] = {
model_t::E_IndividualInfoContentByBucketAndPerson};
const model_t::EFeature INDIVIDUAL_HIGH_INFO_CONTENT_FEATURES[] = {
model_t::E_IndividualHighInfoContentByBucketAndPerson};
const model_t::EFeature INDIVIDUAL_LOW_INFO_CONTENT_FEATURES[] = {
model_t::E_IndividualLowInfoContentByBucketAndPerson};
const model_t::EFeature INDIVIDUAL_TIME_OF_DAY_FEATURES[] = {
model_t::E_IndividualTimeOfDayByBucketAndPerson};
const model_t::EFeature INDIVIDUAL_TIME_OF_WEEK_FEATURES[] = {
model_t::E_IndividualTimeOfWeekByBucketAndPerson};
const model_t::EFeature INDIVIDUAL_METRIC_FEATURES[] = {
model_t::E_IndividualMeanByPerson, model_t::E_IndividualMinByPerson,
model_t::E_IndividualMaxByPerson};
const model_t::EFeature INDIVIDUAL_METRIC_MEAN_FEATURES[] = {model_t::E_IndividualMeanByPerson};
const model_t::EFeature INDIVIDUAL_METRIC_LOW_MEAN_FEATURES[] = {model_t::E_IndividualLowMeanByPerson};
const model_t::EFeature INDIVIDUAL_METRIC_HIGH_MEAN_FEATURES[] = {model_t::E_IndividualHighMeanByPerson};
const model_t::EFeature INDIVIDUAL_METRIC_MEDIAN_FEATURES[] = {model_t::E_IndividualMedianByPerson};
const model_t::EFeature INDIVIDUAL_METRIC_LOW_MEDIAN_FEATURES[] = {
model_t::E_IndividualLowMedianByPerson};
const model_t::EFeature INDIVIDUAL_METRIC_HIGH_MEDIAN_FEATURES[] = {
model_t::E_IndividualHighMedianByPerson};
const model_t::EFeature INDIVIDUAL_METRIC_MIN_FEATURES[] = {model_t::E_IndividualMinByPerson};
const model_t::EFeature INDIVIDUAL_METRIC_MAX_FEATURES[] = {model_t::E_IndividualMaxByPerson};
const model_t::EFeature INDIVIDUAL_METRIC_VARIANCE_FEATURES[] = {model_t::E_IndividualVarianceByPerson};
const model_t::EFeature INDIVIDUAL_METRIC_LOW_VARIANCE_FEATURES[] = {
model_t::E_IndividualLowVarianceByPerson};
const model_t::EFeature INDIVIDUAL_METRIC_HIGH_VARIANCE_FEATURES[] = {
model_t::E_IndividualHighVarianceByPerson};
const model_t::EFeature INDIVIDUAL_METRIC_SUM_FEATURES[] = {model_t::E_IndividualSumByBucketAndPerson};
const model_t::EFeature INDIVIDUAL_METRIC_LOW_SUM_FEATURES[] = {
model_t::E_IndividualLowSumByBucketAndPerson};
const model_t::EFeature INDIVIDUAL_METRIC_HIGH_SUM_FEATURES[] = {
model_t::E_IndividualHighSumByBucketAndPerson};
const model_t::EFeature INDIVIDUAL_METRIC_NON_NULL_SUM_FEATURES[] = {
model_t::E_IndividualNonNullSumByBucketAndPerson};
const model_t::EFeature INDIVIDUAL_METRIC_LOW_NON_NULL_SUM_FEATURES[] = {
model_t::E_IndividualLowNonNullSumByBucketAndPerson};
const model_t::EFeature INDIVIDUAL_METRIC_HIGH_NON_NULL_SUM_FEATURES[] = {
model_t::E_IndividualHighNonNullSumByBucketAndPerson};
const model_t::EFeature INDIVIDUAL_LAT_LONG_FEATURES[] = {model_t::E_IndividualMeanLatLongByPerson};
const model_t::EFeature INDIVIDUAL_MAX_VELOCITY_FEATURES[] = {model_t::E_IndividualMaxVelocityByPerson};
const model_t::EFeature INDIVIDUAL_MIN_VELOCITY_FEATURES[] = {model_t::E_IndividualMinVelocityByPerson};
const model_t::EFeature INDIVIDUAL_MEAN_VELOCITY_FEATURES[] = {
model_t::E_IndividualMeanVelocityByPerson};
const model_t::EFeature INDIVIDUAL_SUM_VELOCITY_FEATURES[] = {model_t::E_IndividualSumVelocityByPerson};
const model_t::EFeature POPULATION_COUNT_FEATURES[] = {
model_t::E_PopulationCountByBucketPersonAndAttribute};
const model_t::EFeature POPULATION_DISTINCT_COUNT_FEATURES[] = {
model_t::E_PopulationUniqueCountByBucketPersonAndAttribute};
const model_t::EFeature POPULATION_LOW_DISTINCT_COUNT_FEATURES[] = {
model_t::E_PopulationLowUniqueCountByBucketPersonAndAttribute};
const model_t::EFeature POPULATION_HIGH_DISTINCT_COUNT_FEATURES[] = {
model_t::E_PopulationHighUniqueCountByBucketPersonAndAttribute};
const model_t::EFeature POPULATION_RARE_FEATURES[] = {
model_t::E_PopulationIndicatorOfBucketPersonAndAttribute,
model_t::E_PopulationUniquePersonCountByAttribute};
const model_t::EFeature POPULATION_RARE_COUNT_FEATURES[] = {
model_t::E_PopulationCountByBucketPersonAndAttribute,
model_t::E_PopulationUniquePersonCountByAttribute};
const model_t::EFeature POPULATION_FREQ_RARE_FEATURES[] = {
model_t::E_PopulationAttributeTotalCountByPerson,
model_t::E_PopulationIndicatorOfBucketPersonAndAttribute,
model_t::E_PopulationUniquePersonCountByAttribute};
const model_t::EFeature POPULATION_FREQ_RARE_COUNT_FEATURES[] = {
model_t::E_PopulationAttributeTotalCountByPerson,
model_t::E_PopulationCountByBucketPersonAndAttribute,
model_t::E_PopulationUniquePersonCountByAttribute};
const model_t::EFeature POPULATION_LOW_COUNTS_FEATURES[] = {
model_t::E_PopulationLowCountsByBucketPersonAndAttribute};
const model_t::EFeature POPULATION_HIGH_COUNTS_FEATURES[] = {
model_t::E_PopulationHighCountsByBucketPersonAndAttribute};
const model_t::EFeature POPULATION_INFO_CONTENT_FEATURES[] = {
model_t::E_PopulationInfoContentByBucketPersonAndAttribute};
const model_t::EFeature POPULATION_LOW_INFO_CONTENT_FEATURES[] = {
model_t::E_PopulationLowInfoContentByBucketPersonAndAttribute};
const model_t::EFeature POPULATION_HIGH_INFO_CONTENT_FEATURES[] = {
model_t::E_PopulationHighInfoContentByBucketPersonAndAttribute};
const model_t::EFeature POPULATION_TIME_OF_DAY_FEATURES[] = {
model_t::E_PopulationTimeOfDayByBucketPersonAndAttribute};
const model_t::EFeature POPULATION_TIME_OF_WEEK_FEATURES[] = {
model_t::E_PopulationTimeOfWeekByBucketPersonAndAttribute};
const model_t::EFeature POPULATION_METRIC_FEATURES[] = {
model_t::E_PopulationMeanByPersonAndAttribute, model_t::E_PopulationMinByPersonAndAttribute,
model_t::E_PopulationMaxByPersonAndAttribute};
const model_t::EFeature POPULATION_METRIC_MEAN_FEATURES[] = {
model_t::E_PopulationMeanByPersonAndAttribute};
const model_t::EFeature POPULATION_METRIC_LOW_MEAN_FEATURES[] = {
model_t::E_PopulationLowMeanByPersonAndAttribute};
const model_t::EFeature POPULATION_METRIC_HIGH_MEAN_FEATURES[] = {
model_t::E_PopulationHighMeanByPersonAndAttribute};
const model_t::EFeature POPULATION_METRIC_MEDIAN_FEATURES[] = {
model_t::E_PopulationMedianByPersonAndAttribute};
const model_t::EFeature POPULATION_METRIC_LOW_MEDIAN_FEATURES[] = {
model_t::E_PopulationLowMedianByPersonAndAttribute};
const model_t::EFeature POPULATION_METRIC_HIGH_MEDIAN_FEATURES[] = {
model_t::E_PopulationHighMedianByPersonAndAttribute};
const model_t::EFeature POPULATION_METRIC_MIN_FEATURES[] = {
model_t::E_PopulationMinByPersonAndAttribute};
const model_t::EFeature POPULATION_METRIC_MAX_FEATURES[] = {
model_t::E_PopulationMaxByPersonAndAttribute};
const model_t::EFeature POPULATION_METRIC_VARIANCE_FEATURES[] = {
model_t::E_PopulationVarianceByPersonAndAttribute};
const model_t::EFeature POPULATION_METRIC_LOW_VARIANCE_FEATURES[] = {
model_t::E_PopulationLowVarianceByPersonAndAttribute};
const model_t::EFeature POPULATION_METRIC_HIGH_VARIANCE_FEATURES[] = {
model_t::E_PopulationHighVarianceByPersonAndAttribute};
const model_t::EFeature POPULATION_METRIC_SUM_FEATURES[] = {
model_t::E_PopulationSumByBucketPersonAndAttribute};
const model_t::EFeature POPULATION_METRIC_LOW_SUM_FEATURES[] = {
model_t::E_PopulationLowSumByBucketPersonAndAttribute};
const model_t::EFeature POPULATION_METRIC_HIGH_SUM_FEATURES[] = {
model_t::E_PopulationHighSumByBucketPersonAndAttribute};
const model_t::EFeature POPULATION_LAT_LONG_FEATURES[] = {
model_t::E_PopulationMeanLatLongByPersonAndAttribute};
const model_t::EFeature POPULATION_MAX_VELOCITY_FEATURES[] = {
model_t::E_PopulationMaxVelocityByPersonAndAttribute};
const model_t::EFeature POPULATION_MIN_VELOCITY_FEATURES[] = {
model_t::E_PopulationMinVelocityByPersonAndAttribute};
const model_t::EFeature POPULATION_MEAN_VELOCITY_FEATURES[] = {
model_t::E_PopulationMeanVelocityByPersonAndAttribute};
const model_t::EFeature POPULATION_SUM_VELOCITY_FEATURES[] = {
model_t::E_PopulationSumVelocityByPersonAndAttribute};
// Function names
const std::string COUNT("count");
const std::string NON_ZERO_COUNT("non_zero_count");
const std::string RARE_NON_ZERO_COUNT("rare_non_zero_count");
const std::string RARE("rare");
const std::string LOW_COUNT("low_count");
const std::string HIGH_COUNT("high_count");
const std::string LOW_NON_ZERO_COUNT("low_non_zero_count");
const std::string HIGH_NON_ZERO_COUNT("high_non_zero_count");
const std::string DISTINCT_COUNT("distinct_count");
const std::string LOW_DISTINCT_COUNT("low_distinct_count");
const std::string HIGH_DISTINCT_COUNT("high_distinct_count");
const std::string INFO_CONTENT("info_content");
const std::string HIGH_INFO_CONTENT("high_info_content");
const std::string LOW_INFO_CONTENT("low_info_content");
const std::string TIME_OF_DAY("time_of_day");
const std::string TIME_OF_WEEK("time_of_week");
const std::string METRIC("metric");
const std::string MEAN("mean");
const std::string LOW_MEAN("low_mean");
const std::string HIGH_MEAN("high_mean");
const std::string MEDIAN("median");
const std::string LOW_MEDIAN("low_median");
const std::string HIGH_MEDIAN("high_median");
const std::string MIN("min");
const std::string MAX("max");
const std::string VARIANCE("varp");
const std::string LOW_VARIANCE("low_varp");
const std::string HIGH_VARIANCE("high_varp");
const std::string SUM("sum");
const std::string LOW_SUM("low_sum");
const std::string HIGH_SUM("high_sum");
const std::string NON_NULL_SUM("non_null_sum");
const std::string LOW_NON_NULL_SUM("low_non_null_sum");
const std::string HIGH_NON_NULL_SUM("high_non_null_sum");
const std::string LAT_LONG("lat_long");
const std::string RARE_COUNT("rare_count");
const std::string FREQ_RARE("freq_rare");
const std::string FREQ_RARE_COUNT("freq_rare_count");
const std::string MAX_VELOCITY("max_velocity");
const std::string MIN_VELOCITY("min_velocity");
const std::string MEAN_VELOCITY("mean_velocity");
const std::string SUM_VELOCITY("sum_velocity");
const std::string UNEXPECTED_FUNCTION("-");
}
#define BEGIN(x) x
#define END(x) x + sizeof(x) / sizeof(x[0])
//! The features for the count by function.
const TFeatureVec INDIVIDUAL_COUNT_FEATURES(BEGIN(detail::INDIVIDUAL_COUNT_FEATURES),
END(detail::INDIVIDUAL_COUNT_FEATURES));
//! The features for the non-zero count by function.
const TFeatureVec
INDIVIDUAL_NON_ZERO_COUNT_FEATURES(BEGIN(detail::INDIVIDUAL_NON_ZERO_COUNT_FEATURES),
END(detail::INDIVIDUAL_NON_ZERO_COUNT_FEATURES));
//! The features for the rare count by function.
const TFeatureVec
INDIVIDUAL_RARE_COUNT_FEATURES(BEGIN(detail::INDIVIDUAL_RARE_COUNT_FEATURES),
END(detail::INDIVIDUAL_RARE_COUNT_FEATURES));
//! The features for the rare non-zero count by function.
const TFeatureVec INDIVIDUAL_RARE_NON_ZERO_COUNT_FEATURES(
BEGIN(detail::INDIVIDUAL_RARE_NON_ZERO_COUNT_FEATURES),
END(detail::INDIVIDUAL_RARE_NON_ZERO_COUNT_FEATURES));
//! The features for the rare in time by function.
const TFeatureVec INDIVIDUAL_RARE_FEATURES(BEGIN(detail::INDIVIDUAL_RARE_FEATURES),
END(detail::INDIVIDUAL_RARE_FEATURES));
//! The features for the low count by function.
const TFeatureVec
INDIVIDUAL_LOW_COUNTS_FEATURES(BEGIN(detail::INDIVIDUAL_LOW_COUNTS_FEATURES),
END(detail::INDIVIDUAL_LOW_COUNTS_FEATURES));
//! The features for the high count by function.
const TFeatureVec
INDIVIDUAL_HIGH_COUNTS_FEATURES(BEGIN(detail::INDIVIDUAL_HIGH_COUNTS_FEATURES),
END(detail::INDIVIDUAL_HIGH_COUNTS_FEATURES));
//! The features for the low non zero count by function.
const TFeatureVec INDIVIDUAL_LOW_NON_ZERO_COUNT_FEATURES(
BEGIN(detail::INDIVIDUAL_LOW_NON_ZERO_COUNT_FEATURES),
END(detail::INDIVIDUAL_LOW_NON_ZERO_COUNT_FEATURES));
//! The features for the high non zero count by function.
const TFeatureVec INDIVIDUAL_HIGH_NON_ZERO_COUNT_FEATURES(
BEGIN(detail::INDIVIDUAL_HIGH_NON_ZERO_COUNT_FEATURES),
END(detail::INDIVIDUAL_HIGH_NON_ZERO_COUNT_FEATURES));
//! The features for the distinct count function.
const TFeatureVec
INDIVIDUAL_DISTINCT_COUNT_FEATURES(BEGIN(detail::INDIVIDUAL_DISTINCT_COUNT_FEATURES),
END(detail::INDIVIDUAL_DISTINCT_COUNT_FEATURES));
//! The features for the distinct count function.
const TFeatureVec INDIVIDUAL_LOW_DISTINCT_COUNT_FEATURES(
BEGIN(detail::INDIVIDUAL_LOW_DISTINCT_COUNT_FEATURES),
END(detail::INDIVIDUAL_LOW_DISTINCT_COUNT_FEATURES));
//! The features for the distinct count function.
const TFeatureVec INDIVIDUAL_HIGH_DISTINCT_COUNT_FEATURES(
BEGIN(detail::INDIVIDUAL_HIGH_DISTINCT_COUNT_FEATURES),
END(detail::INDIVIDUAL_HIGH_DISTINCT_COUNT_FEATURES));
//! The features for the individual info_content function
const TFeatureVec
INDIVIDUAL_INFO_CONTENT_FEATURES(BEGIN(detail::INDIVIDUAL_INFO_CONTENT_FEATURES),
END(detail::INDIVIDUAL_INFO_CONTENT_FEATURES));
//! The features for the individual high_info_content function
const TFeatureVec INDIVIDUAL_HIGH_INFO_CONTENT_FEATURES(
BEGIN(detail::INDIVIDUAL_HIGH_INFO_CONTENT_FEATURES),
END(detail::INDIVIDUAL_HIGH_INFO_CONTENT_FEATURES));
//! The features for the individual low_info_content function
const TFeatureVec
INDIVIDUAL_LOW_INFO_CONTENT_FEATURES(BEGIN(detail::INDIVIDUAL_LOW_INFO_CONTENT_FEATURES),
END(detail::INDIVIDUAL_LOW_INFO_CONTENT_FEATURES));
//! The features for the time-of-day function.
const TFeatureVec
INDIVIDUAL_TIME_OF_DAY_FEATURES(BEGIN(detail::INDIVIDUAL_TIME_OF_DAY_FEATURES),
END(detail::INDIVIDUAL_TIME_OF_DAY_FEATURES));
//! The features for the time-of-week function.
const TFeatureVec
INDIVIDUAL_TIME_OF_WEEK_FEATURES(BEGIN(detail::INDIVIDUAL_TIME_OF_WEEK_FEATURES),
END(detail::INDIVIDUAL_TIME_OF_WEEK_FEATURES));
//! The features for the metric by function.
const TFeatureVec INDIVIDUAL_METRIC_FEATURES(BEGIN(detail::INDIVIDUAL_METRIC_FEATURES),
END(detail::INDIVIDUAL_METRIC_FEATURES));
//! The features for the metric mean by function.
const TFeatureVec
INDIVIDUAL_METRIC_MEAN_FEATURES(BEGIN(detail::INDIVIDUAL_METRIC_MEAN_FEATURES),
END(detail::INDIVIDUAL_METRIC_MEAN_FEATURES));
//! The features for the metric low mean by function.
const TFeatureVec
INDIVIDUAL_METRIC_LOW_MEAN_FEATURES(BEGIN(detail::INDIVIDUAL_METRIC_LOW_MEAN_FEATURES),
END(detail::INDIVIDUAL_METRIC_LOW_MEAN_FEATURES));
//! The features for the metric high mean by function.
const TFeatureVec
INDIVIDUAL_METRIC_HIGH_MEAN_FEATURES(BEGIN(detail::INDIVIDUAL_METRIC_HIGH_MEAN_FEATURES),
END(detail::INDIVIDUAL_METRIC_HIGH_MEAN_FEATURES));
//! The features for the metric median by function.
const TFeatureVec
INDIVIDUAL_METRIC_MEDIAN_FEATURES(BEGIN(detail::INDIVIDUAL_METRIC_MEDIAN_FEATURES),
END(detail::INDIVIDUAL_METRIC_MEDIAN_FEATURES));
//! The features for the metric low median by function.
const TFeatureVec INDIVIDUAL_METRIC_LOW_MEDIAN_FEATURES(
BEGIN(detail::INDIVIDUAL_METRIC_LOW_MEDIAN_FEATURES),
END(detail::INDIVIDUAL_METRIC_LOW_MEDIAN_FEATURES));
//! The features for the metric high median by function.
const TFeatureVec INDIVIDUAL_METRIC_HIGH_MEDIAN_FEATURES(
BEGIN(detail::INDIVIDUAL_METRIC_HIGH_MEDIAN_FEATURES),
END(detail::INDIVIDUAL_METRIC_HIGH_MEDIAN_FEATURES));
//! The features for the metric min by function.
const TFeatureVec
INDIVIDUAL_METRIC_MIN_FEATURES(BEGIN(detail::INDIVIDUAL_METRIC_MIN_FEATURES),
END(detail::INDIVIDUAL_METRIC_MIN_FEATURES));
//! The features for the metric max by function.
const TFeatureVec
INDIVIDUAL_METRIC_MAX_FEATURES(BEGIN(detail::INDIVIDUAL_METRIC_MAX_FEATURES),
END(detail::INDIVIDUAL_METRIC_MAX_FEATURES));
//! The features for the metric variance by function.
const TFeatureVec
INDIVIDUAL_METRIC_VARIANCE_FEATURES(BEGIN(detail::INDIVIDUAL_METRIC_VARIANCE_FEATURES),
END(detail::INDIVIDUAL_METRIC_VARIANCE_FEATURES));
//! The features for the metric low variance by function.
const TFeatureVec INDIVIDUAL_METRIC_LOW_VARIANCE_FEATURES(
BEGIN(detail::INDIVIDUAL_METRIC_LOW_VARIANCE_FEATURES),
END(detail::INDIVIDUAL_METRIC_LOW_VARIANCE_FEATURES));
//! The features for the metric high variance by function.
const TFeatureVec INDIVIDUAL_METRIC_HIGH_VARIANCE_FEATURES(
BEGIN(detail::INDIVIDUAL_METRIC_HIGH_VARIANCE_FEATURES),
END(detail::INDIVIDUAL_METRIC_HIGH_VARIANCE_FEATURES));
//! The features for the metric sum by function.
const TFeatureVec
INDIVIDUAL_METRIC_SUM_FEATURES(BEGIN(detail::INDIVIDUAL_METRIC_SUM_FEATURES),
END(detail::INDIVIDUAL_METRIC_SUM_FEATURES));
//! The features for the metric low sum by function.
const TFeatureVec
INDIVIDUAL_METRIC_LOW_SUM_FEATURES(BEGIN(detail::INDIVIDUAL_METRIC_LOW_SUM_FEATURES),
END(detail::INDIVIDUAL_METRIC_LOW_SUM_FEATURES));
//! The features for the metric high sum by function.
const TFeatureVec
INDIVIDUAL_METRIC_HIGH_SUM_FEATURES(BEGIN(detail::INDIVIDUAL_METRIC_HIGH_SUM_FEATURES),
END(detail::INDIVIDUAL_METRIC_HIGH_SUM_FEATURES));
//! The features for the metric non-null sum by function.
const TFeatureVec INDIVIDUAL_METRIC_NON_NULL_SUM_FEATURES(
BEGIN(detail::INDIVIDUAL_METRIC_NON_NULL_SUM_FEATURES),
END(detail::INDIVIDUAL_METRIC_NON_NULL_SUM_FEATURES));
//! The features for the metric low non-null sum by function.
const TFeatureVec INDIVIDUAL_METRIC_LOW_NON_NULL_SUM_FEATURES(
BEGIN(detail::INDIVIDUAL_METRIC_LOW_NON_NULL_SUM_FEATURES),
END(detail::INDIVIDUAL_METRIC_LOW_NON_NULL_SUM_FEATURES));
//! The features for the metric high non-null sum by function.
const TFeatureVec INDIVIDUAL_METRIC_HIGH_NON_NULL_SUM_FEATURES(
BEGIN(detail::INDIVIDUAL_METRIC_HIGH_NON_NULL_SUM_FEATURES),
END(detail::INDIVIDUAL_METRIC_HIGH_NON_NULL_SUM_FEATURES));
//! The features for the metric latitude and longitude by function.
const TFeatureVec INDIVIDUAL_LAT_LONG_FEATURES(BEGIN(detail::INDIVIDUAL_LAT_LONG_FEATURES),
END(detail::INDIVIDUAL_LAT_LONG_FEATURES));
//! The features for the metric max velocity by function.
const TFeatureVec
INDIVIDUAL_MAX_VELOCITY_FEATURES(BEGIN(detail::INDIVIDUAL_MAX_VELOCITY_FEATURES),
END(detail::INDIVIDUAL_MAX_VELOCITY_FEATURES));
//! The features for the metric min velocity by function.
const TFeatureVec
INDIVIDUAL_MIN_VELOCITY_FEATURES(BEGIN(detail::INDIVIDUAL_MIN_VELOCITY_FEATURES),
END(detail::INDIVIDUAL_MIN_VELOCITY_FEATURES));
//! The features for the metric mean velocity by function.
const TFeatureVec
INDIVIDUAL_MEAN_VELOCITY_FEATURES(BEGIN(detail::INDIVIDUAL_MEAN_VELOCITY_FEATURES),
END(detail::INDIVIDUAL_MEAN_VELOCITY_FEATURES));
//! The features for the metric sum velocity by function.
const TFeatureVec
INDIVIDUAL_SUM_VELOCITY_FEATURES(BEGIN(detail::INDIVIDUAL_SUM_VELOCITY_FEATURES),
END(detail::INDIVIDUAL_SUM_VELOCITY_FEATURES));
//! The features for the count over function.
const TFeatureVec POPULATION_COUNT_FEATURES(BEGIN(detail::POPULATION_COUNT_FEATURES),
END(detail::POPULATION_COUNT_FEATURES));
//! The features for the distinct count over function.
const TFeatureVec
POPULATION_DISTINCT_COUNT_FEATURES(BEGIN(detail::POPULATION_DISTINCT_COUNT_FEATURES),
END(detail::POPULATION_DISTINCT_COUNT_FEATURES));
//! The features for the low distinct count over function.
const TFeatureVec POPULATION_LOW_DISTINCT_COUNT_FEATURES(
BEGIN(detail::POPULATION_LOW_DISTINCT_COUNT_FEATURES),
END(detail::POPULATION_LOW_DISTINCT_COUNT_FEATURES));
//! The features for the high distinct count over function.
const TFeatureVec POPULATION_HIGH_DISTINCT_COUNT_FEATURES(
BEGIN(detail::POPULATION_HIGH_DISTINCT_COUNT_FEATURES),
END(detail::POPULATION_HIGH_DISTINCT_COUNT_FEATURES));
//! The features for the rare over function.
const TFeatureVec POPULATION_RARE_FEATURES(BEGIN(detail::POPULATION_RARE_FEATURES),
END(detail::POPULATION_RARE_FEATURES));
//! The features for the rare count over function.
const TFeatureVec
POPULATION_RARE_COUNT_FEATURES(BEGIN(detail::POPULATION_RARE_COUNT_FEATURES),
END(detail::POPULATION_RARE_COUNT_FEATURES));
//! The features for the rare in population over function.
const TFeatureVec
POPULATION_FREQ_RARE_FEATURES(BEGIN(detail::POPULATION_FREQ_RARE_FEATURES),
END(detail::POPULATION_FREQ_RARE_FEATURES));
//! The features for the frequent rare count over function.
const TFeatureVec
POPULATION_FREQ_RARE_COUNT_FEATURES(BEGIN(detail::POPULATION_FREQ_RARE_COUNT_FEATURES),
END(detail::POPULATION_FREQ_RARE_COUNT_FEATURES));
//! The features for the low count over function.
const TFeatureVec
POPULATION_LOW_COUNTS_FEATURES(BEGIN(detail::POPULATION_LOW_COUNTS_FEATURES),
END(detail::POPULATION_LOW_COUNTS_FEATURES));
//! The features for the high count over function.
const TFeatureVec
POPULATION_HIGH_COUNTS_FEATURES(BEGIN(detail::POPULATION_HIGH_COUNTS_FEATURES),
END(detail::POPULATION_HIGH_COUNTS_FEATURES));
//! The features for the information content over function.
const TFeatureVec
POPULATION_INFO_CONTENT_FEATURES(BEGIN(detail::POPULATION_INFO_CONTENT_FEATURES),
END(detail::POPULATION_INFO_CONTENT_FEATURES));
//! The features for the low information content over function.
const TFeatureVec
POPULATION_LOW_INFO_CONTENT_FEATURES(BEGIN(detail::POPULATION_LOW_INFO_CONTENT_FEATURES),
END(detail::POPULATION_LOW_INFO_CONTENT_FEATURES));
//! The features for the high information content over function.
const TFeatureVec POPULATION_HIGH_INFO_CONTENT_FEATURES(
BEGIN(detail::POPULATION_HIGH_INFO_CONTENT_FEATURES),
END(detail::POPULATION_HIGH_INFO_CONTENT_FEATURES));
//! The features for the time_of_week over function.
const TFeatureVec
POPULATION_TIME_OF_DAY_FEATURES(BEGIN(detail::POPULATION_TIME_OF_DAY_FEATURES),
END(detail::POPULATION_TIME_OF_DAY_FEATURES));
//! The features for the time_of_week over function.
const TFeatureVec
POPULATION_TIME_OF_WEEK_FEATURES(BEGIN(detail::POPULATION_TIME_OF_WEEK_FEATURES),
END(detail::POPULATION_TIME_OF_WEEK_FEATURES));
//! The features for the metric over function.
const TFeatureVec POPULATION_METRIC_FEATURES(BEGIN(detail::POPULATION_METRIC_FEATURES),
END(detail::POPULATION_METRIC_FEATURES));
//! The features for the metric mean over function.
const TFeatureVec
POPULATION_METRIC_MEAN_FEATURES(BEGIN(detail::POPULATION_METRIC_MEAN_FEATURES),
END(detail::POPULATION_METRIC_MEAN_FEATURES));
//! The features for the metric low mean over function.
const TFeatureVec
POPULATION_METRIC_LOW_MEAN_FEATURES(BEGIN(detail::POPULATION_METRIC_LOW_MEAN_FEATURES),
END(detail::POPULATION_METRIC_LOW_MEAN_FEATURES));
//! The features for the metric high mean over function.
const TFeatureVec
POPULATION_METRIC_HIGH_MEAN_FEATURES(BEGIN(detail::POPULATION_METRIC_HIGH_MEAN_FEATURES),
END(detail::POPULATION_METRIC_HIGH_MEAN_FEATURES));
//! The features for the metric median over function.
const TFeatureVec
POPULATION_METRIC_MEDIAN_FEATURES(BEGIN(detail::POPULATION_METRIC_MEDIAN_FEATURES),
END(detail::POPULATION_METRIC_MEDIAN_FEATURES));
//! The features for the metric low median over function.
const TFeatureVec POPULATION_METRIC_LOW_MEDIAN_FEATURES(
BEGIN(detail::POPULATION_METRIC_LOW_MEDIAN_FEATURES),
END(detail::POPULATION_METRIC_LOW_MEDIAN_FEATURES));
//! The features for the metric high median over function.
const TFeatureVec POPULATION_METRIC_HIGH_MEDIAN_FEATURES(
BEGIN(detail::POPULATION_METRIC_HIGH_MEDIAN_FEATURES),
END(detail::POPULATION_METRIC_HIGH_MEDIAN_FEATURES));
//! The features for the metric min over function.
const TFeatureVec
POPULATION_METRIC_MIN_FEATURES(BEGIN(detail::POPULATION_METRIC_MIN_FEATURES),
END(detail::POPULATION_METRIC_MIN_FEATURES));
//! The features for the metric max over function.
const TFeatureVec
POPULATION_METRIC_MAX_FEATURES(BEGIN(detail::POPULATION_METRIC_MAX_FEATURES),
END(detail::POPULATION_METRIC_MAX_FEATURES));
//! The features for the metric variance over function.
const TFeatureVec
POPULATION_METRIC_VARIANCE_FEATURES(BEGIN(detail::POPULATION_METRIC_VARIANCE_FEATURES),
END(detail::POPULATION_METRIC_VARIANCE_FEATURES));
//! The features for the metric low variance over function.
const TFeatureVec POPULATION_METRIC_LOW_VARIANCE_FEATURES(
BEGIN(detail::POPULATION_METRIC_LOW_VARIANCE_FEATURES),
END(detail::POPULATION_METRIC_LOW_VARIANCE_FEATURES));
//! The features for the metric high variance over function.
const TFeatureVec POPULATION_METRIC_HIGH_VARIANCE_FEATURES(
BEGIN(detail::POPULATION_METRIC_HIGH_VARIANCE_FEATURES),
END(detail::POPULATION_METRIC_HIGH_VARIANCE_FEATURES));
//! The features for the metric sum over function.
const TFeatureVec
POPULATION_METRIC_SUM_FEATURES(BEGIN(detail::POPULATION_METRIC_SUM_FEATURES),
END(detail::POPULATION_METRIC_SUM_FEATURES));
//! The features for the metric low sum over function.
const TFeatureVec
POPULATION_METRIC_LOW_SUM_FEATURES(BEGIN(detail::POPULATION_METRIC_LOW_SUM_FEATURES),
END(detail::POPULATION_METRIC_LOW_SUM_FEATURES));
//! The features for the metric high sum over function.
const TFeatureVec
POPULATION_METRIC_HIGH_SUM_FEATURES(BEGIN(detail::POPULATION_METRIC_HIGH_SUM_FEATURES),
END(detail::POPULATION_METRIC_HIGH_SUM_FEATURES));
//! The features for the metric lat/long over function.
const TFeatureVec POPULATION_LAT_LONG_FEATURES(BEGIN(detail::POPULATION_LAT_LONG_FEATURES),
END(detail::POPULATION_LAT_LONG_FEATURES));
//! The features for the metric max velocity over function.
const TFeatureVec
POPULATION_MAX_VELOCITY_FEATURES(BEGIN(detail::POPULATION_MAX_VELOCITY_FEATURES),
END(detail::POPULATION_MAX_VELOCITY_FEATURES));
//! The features for the metric min velocity over function.
const TFeatureVec
POPULATION_MIN_VELOCITY_FEATURES(BEGIN(detail::POPULATION_MIN_VELOCITY_FEATURES),
END(detail::POPULATION_MIN_VELOCITY_FEATURES));
//! The features for the metric mean velocity over function.
const TFeatureVec
POPULATION_MEAN_VELOCITY_FEATURES(BEGIN(detail::POPULATION_MEAN_VELOCITY_FEATURES),
END(detail::POPULATION_MEAN_VELOCITY_FEATURES));
//! The features for the metric sum velocity over function.
const TFeatureVec
POPULATION_SUM_VELOCITY_FEATURES(BEGIN(detail::POPULATION_SUM_VELOCITY_FEATURES),
END(detail::POPULATION_SUM_VELOCITY_FEATURES));
const TFeatureVec EMPTY_FEATURES;
const TFunctionVec EMPTY_FUNCTIONS;
#undef BEGIN
#undef END
//! Add the features corresponding to \p function to \p map.
void addFeatures(EFunction function, TFeatureFunctionVecMap& map) {
const TFeatureVec& features = function_t::features(function);
for (std::size_t i = 0; i < features.size(); ++i) {
map[features[i]].push_back(function);
}
}
//! Build a map from features to the functions which include them.
TFeatureFunctionVecMap buildFeatureFunctionMap() {
TFeatureFunctionVecMap result;
// This is written like this to generate a compiler warning
// when a new function is added. This map must include every
// function so add a case if you add a new function.
switch (E_IndividualCount) {
// The fall-through is intentional in this switch: the switched-on value
// selects the first case and then all the calls to addFeatures() are
// made
case E_IndividualCount:
addFeatures(E_IndividualCount, result);
BOOST_FALLTHROUGH;
case E_IndividualNonZeroCount:
addFeatures(E_IndividualNonZeroCount, result);
BOOST_FALLTHROUGH;
case E_IndividualRareCount:
addFeatures(E_IndividualRareCount, result);
BOOST_FALLTHROUGH;
case E_IndividualRareNonZeroCount:
addFeatures(E_IndividualRareNonZeroCount, result);
BOOST_FALLTHROUGH;
case E_IndividualRare:
addFeatures(E_IndividualRare, result);
BOOST_FALLTHROUGH;
case E_IndividualLowCounts:
addFeatures(E_IndividualLowCounts, result);
BOOST_FALLTHROUGH;
case E_IndividualHighCounts:
addFeatures(E_IndividualHighCounts, result);
BOOST_FALLTHROUGH;
case E_IndividualLowNonZeroCount:
addFeatures(E_IndividualLowNonZeroCount, result);
BOOST_FALLTHROUGH;
case E_IndividualHighNonZeroCount:
addFeatures(E_IndividualHighNonZeroCount, result);
BOOST_FALLTHROUGH;
case E_IndividualDistinctCount:
addFeatures(E_IndividualDistinctCount, result);
BOOST_FALLTHROUGH;
case E_IndividualLowDistinctCount:
addFeatures(E_IndividualLowDistinctCount, result);
BOOST_FALLTHROUGH;
case E_IndividualHighDistinctCount:
addFeatures(E_IndividualHighDistinctCount, result);
BOOST_FALLTHROUGH;
case E_IndividualInfoContent:
addFeatures(E_IndividualInfoContent, result);
BOOST_FALLTHROUGH;
case E_IndividualHighInfoContent:
addFeatures(E_IndividualHighInfoContent, result);
BOOST_FALLTHROUGH;
case E_IndividualLowInfoContent:
addFeatures(E_IndividualLowInfoContent, result);
BOOST_FALLTHROUGH;
case E_IndividualTimeOfDay:
addFeatures(E_IndividualTimeOfDay, result);
BOOST_FALLTHROUGH;
case E_IndividualTimeOfWeek:
addFeatures(E_IndividualTimeOfWeek, result);
BOOST_FALLTHROUGH;
case E_IndividualMetric:
addFeatures(E_IndividualMetric, result);
BOOST_FALLTHROUGH;
case E_IndividualMetricMean:
addFeatures(E_IndividualMetricMean, result);
BOOST_FALLTHROUGH;
case E_IndividualMetricLowMean:
addFeatures(E_IndividualMetricLowMean, result);
BOOST_FALLTHROUGH;
case E_IndividualMetricHighMean:
addFeatures(E_IndividualMetricHighMean, result);
BOOST_FALLTHROUGH;
case E_IndividualMetricMedian:
addFeatures(E_IndividualMetricMedian, result);
BOOST_FALLTHROUGH;
case E_IndividualMetricLowMedian:
addFeatures(E_IndividualMetricLowMedian, result);
BOOST_FALLTHROUGH;
case E_IndividualMetricHighMedian:
addFeatures(E_IndividualMetricHighMedian, result);
BOOST_FALLTHROUGH;
case E_IndividualMetricMin:
addFeatures(E_IndividualMetricMin, result);
BOOST_FALLTHROUGH;
case E_IndividualMetricMax:
addFeatures(E_IndividualMetricMax, result);
BOOST_FALLTHROUGH;
case E_IndividualMetricSum:
addFeatures(E_IndividualMetricSum, result);
BOOST_FALLTHROUGH;
case E_IndividualMetricVariance:
addFeatures(E_IndividualMetricVariance, result);
BOOST_FALLTHROUGH;
case E_IndividualMetricLowVariance:
addFeatures(E_IndividualMetricLowVariance, result);
BOOST_FALLTHROUGH;
case E_IndividualMetricHighVariance:
addFeatures(E_IndividualMetricHighVariance, result);
BOOST_FALLTHROUGH;
case E_IndividualMetricLowSum:
addFeatures(E_IndividualMetricLowSum, result);
BOOST_FALLTHROUGH;
case E_IndividualMetricHighSum:
addFeatures(E_IndividualMetricHighSum, result);
BOOST_FALLTHROUGH;
case E_IndividualMetricNonNullSum:
addFeatures(E_IndividualMetricNonNullSum, result);
BOOST_FALLTHROUGH;
case E_IndividualMetricLowNonNullSum:
addFeatures(E_IndividualMetricLowNonNullSum, result);
BOOST_FALLTHROUGH;
case E_IndividualMetricHighNonNullSum:
addFeatures(E_IndividualMetricHighNonNullSum, result);
BOOST_FALLTHROUGH;
case E_IndividualLatLong:
addFeatures(E_IndividualLatLong, result);
BOOST_FALLTHROUGH;
case E_IndividualMaxVelocity:
addFeatures(E_IndividualMaxVelocity, result);
BOOST_FALLTHROUGH;
case E_IndividualMinVelocity:
addFeatures(E_IndividualMinVelocity, result);
BOOST_FALLTHROUGH;
case E_IndividualMeanVelocity:
addFeatures(E_IndividualMeanVelocity, result);
BOOST_FALLTHROUGH;
case E_IndividualSumVelocity:
addFeatures(E_IndividualSumVelocity, result);
BOOST_FALLTHROUGH;
case E_PopulationCount:
addFeatures(E_PopulationCount, result);
BOOST_FALLTHROUGH;
case E_PopulationDistinctCount:
addFeatures(E_PopulationDistinctCount, result);
BOOST_FALLTHROUGH;
case E_PopulationLowDistinctCount:
addFeatures(E_PopulationLowDistinctCount, result);
BOOST_FALLTHROUGH;
case E_PopulationHighDistinctCount:
addFeatures(E_PopulationHighDistinctCount, result);
BOOST_FALLTHROUGH;
case E_PopulationRare:
addFeatures(E_PopulationRare, result);
BOOST_FALLTHROUGH;
case E_PopulationRareCount:
addFeatures(E_PopulationRareCount, result);
BOOST_FALLTHROUGH;
case E_PopulationFreqRare:
addFeatures(E_PopulationFreqRare, result);
BOOST_FALLTHROUGH;
case E_PopulationFreqRareCount:
addFeatures(E_PopulationFreqRareCount, result);
BOOST_FALLTHROUGH;
case E_PopulationLowCounts:
addFeatures(E_PopulationLowCounts, result);
BOOST_FALLTHROUGH;
case E_PopulationHighCounts:
addFeatures(E_PopulationHighCounts, result);
BOOST_FALLTHROUGH;
case E_PopulationInfoContent:
addFeatures(E_PopulationInfoContent, result);
BOOST_FALLTHROUGH;
case E_PopulationLowInfoContent:
addFeatures(E_PopulationLowInfoContent, result);
BOOST_FALLTHROUGH;
case E_PopulationHighInfoContent:
addFeatures(E_PopulationHighInfoContent, result);
BOOST_FALLTHROUGH;
case E_PopulationTimeOfDay:
addFeatures(E_PopulationTimeOfDay, result);
BOOST_FALLTHROUGH;
case E_PopulationTimeOfWeek:
addFeatures(E_PopulationTimeOfWeek, result);
BOOST_FALLTHROUGH;
case E_PopulationMetric:
addFeatures(E_PopulationMetric, result);
BOOST_FALLTHROUGH;
case E_PopulationMetricMean:
addFeatures(E_PopulationMetricMean, result);
BOOST_FALLTHROUGH;
case E_PopulationMetricLowMean:
addFeatures(E_PopulationMetricLowMean, result);
BOOST_FALLTHROUGH;
case E_PopulationMetricHighMean:
addFeatures(E_PopulationMetricHighMean, result);
BOOST_FALLTHROUGH;
case E_PopulationMetricMedian:
addFeatures(E_PopulationMetricMedian, result);
BOOST_FALLTHROUGH;
case E_PopulationMetricLowMedian:
addFeatures(E_PopulationMetricLowMedian, result);
BOOST_FALLTHROUGH;
case E_PopulationMetricHighMedian:
addFeatures(E_PopulationMetricHighMedian, result);
BOOST_FALLTHROUGH;
case E_PopulationMetricMin:
addFeatures(E_PopulationMetricMin, result);
BOOST_FALLTHROUGH;
case E_PopulationMetricMax:
addFeatures(E_PopulationMetricMax, result);
BOOST_FALLTHROUGH;
case E_PopulationMetricVariance:
addFeatures(E_PopulationMetricVariance, result);
BOOST_FALLTHROUGH;
case E_PopulationMetricLowVariance:
addFeatures(E_PopulationMetricLowVariance, result);
BOOST_FALLTHROUGH;
case E_PopulationMetricHighVariance:
addFeatures(E_PopulationMetricHighVariance, result);
BOOST_FALLTHROUGH;
case E_PopulationMetricSum:
addFeatures(E_PopulationMetricSum, result);
BOOST_FALLTHROUGH;
case E_PopulationMetricLowSum:
addFeatures(E_PopulationMetricLowSum, result);
BOOST_FALLTHROUGH;
case E_PopulationMetricHighSum:
addFeatures(E_PopulationMetricHighSum, result);
BOOST_FALLTHROUGH;
case E_PopulationLatLong:
addFeatures(E_PopulationLatLong, result);
BOOST_FALLTHROUGH;
case E_PopulationMaxVelocity:
addFeatures(E_PopulationMaxVelocity, result);
BOOST_FALLTHROUGH;
case E_PopulationMinVelocity:
addFeatures(E_PopulationMinVelocity, result);
BOOST_FALLTHROUGH;
case E_PopulationMeanVelocity:
addFeatures(E_PopulationMeanVelocity, result);
BOOST_FALLTHROUGH;
case E_PopulationSumVelocity:
addFeatures(E_PopulationSumVelocity, result);
}
for (TFeatureFunctionVecMapItr i = result.begin(); i != result.end(); ++i) {
std::sort(i->second.begin(), i->second.end());
}
return result;
}
const TFeatureFunctionVecMap FUNCTIONS_BY_FEATURE = buildFeatureFunctionMap();
//! Get the function with the fewest features.
EFunction mostSpecific(const TFunctionVec& functions) {
if (functions.empty()) {
LOG_ABORT(<< "No functions specified");
}
EFunction result = functions[0];
std::size_t numberFeatures = features(functions[0]).size();
for (std::size_t i = 1; i < functions.size(); ++i) {
std::size_t n = features(functions[i]).size();
if (n < numberFeatures) {
result = functions[i];
numberFeatures = n;
}
}
return result;
}
}
const TFeatureVec& features(EFunction function) {
switch (function) {
case E_IndividualCount:
return INDIVIDUAL_COUNT_FEATURES;
case E_IndividualNonZeroCount:
return INDIVIDUAL_NON_ZERO_COUNT_FEATURES;
case E_IndividualRareCount:
return INDIVIDUAL_RARE_COUNT_FEATURES;
case E_IndividualRareNonZeroCount:
return INDIVIDUAL_RARE_NON_ZERO_COUNT_FEATURES;
case E_IndividualRare:
return INDIVIDUAL_RARE_FEATURES;
case E_IndividualLowCounts:
return INDIVIDUAL_LOW_COUNTS_FEATURES;
case E_IndividualHighCounts:
return INDIVIDUAL_HIGH_COUNTS_FEATURES;
case E_IndividualLowNonZeroCount:
return INDIVIDUAL_LOW_NON_ZERO_COUNT_FEATURES;
case E_IndividualHighNonZeroCount:
return INDIVIDUAL_HIGH_NON_ZERO_COUNT_FEATURES;
case E_IndividualDistinctCount:
return INDIVIDUAL_DISTINCT_COUNT_FEATURES;
case E_IndividualLowDistinctCount:
return INDIVIDUAL_LOW_DISTINCT_COUNT_FEATURES;
case E_IndividualHighDistinctCount:
return INDIVIDUAL_HIGH_DISTINCT_COUNT_FEATURES;
case E_IndividualInfoContent:
return INDIVIDUAL_INFO_CONTENT_FEATURES;
case E_IndividualHighInfoContent:
return INDIVIDUAL_HIGH_INFO_CONTENT_FEATURES;
case E_IndividualLowInfoContent:
return INDIVIDUAL_LOW_INFO_CONTENT_FEATURES;
case E_IndividualTimeOfDay:
return INDIVIDUAL_TIME_OF_DAY_FEATURES;
case E_IndividualTimeOfWeek:
return INDIVIDUAL_TIME_OF_WEEK_FEATURES;
case E_IndividualMetric:
return INDIVIDUAL_METRIC_FEATURES;
case E_IndividualMetricMean:
return INDIVIDUAL_METRIC_MEAN_FEATURES;
case E_IndividualMetricLowMean:
return INDIVIDUAL_METRIC_LOW_MEAN_FEATURES;
case E_IndividualMetricHighMean:
return INDIVIDUAL_METRIC_HIGH_MEAN_FEATURES;
case E_IndividualMetricMedian:
return INDIVIDUAL_METRIC_MEDIAN_FEATURES;
case E_IndividualMetricLowMedian:
return INDIVIDUAL_METRIC_LOW_MEDIAN_FEATURES;
case E_IndividualMetricHighMedian:
return INDIVIDUAL_METRIC_HIGH_MEDIAN_FEATURES;
case E_IndividualMetricMin:
return INDIVIDUAL_METRIC_MIN_FEATURES;
case E_IndividualMetricMax:
return INDIVIDUAL_METRIC_MAX_FEATURES;
case E_IndividualMetricVariance:
return INDIVIDUAL_METRIC_VARIANCE_FEATURES;
case E_IndividualMetricLowVariance:
return INDIVIDUAL_METRIC_LOW_VARIANCE_FEATURES;
case E_IndividualMetricHighVariance:
return INDIVIDUAL_METRIC_HIGH_VARIANCE_FEATURES;
case E_IndividualMetricSum:
return INDIVIDUAL_METRIC_SUM_FEATURES;
case E_IndividualMetricLowSum:
return INDIVIDUAL_METRIC_LOW_SUM_FEATURES;
case E_IndividualMetricHighSum:
return INDIVIDUAL_METRIC_HIGH_SUM_FEATURES;
case E_IndividualMetricNonNullSum:
return INDIVIDUAL_METRIC_NON_NULL_SUM_FEATURES;
case E_IndividualMetricLowNonNullSum:
return INDIVIDUAL_METRIC_LOW_NON_NULL_SUM_FEATURES;
case E_IndividualMetricHighNonNullSum:
return INDIVIDUAL_METRIC_HIGH_NON_NULL_SUM_FEATURES;
case E_IndividualLatLong:
return INDIVIDUAL_LAT_LONG_FEATURES;
case E_IndividualMaxVelocity:
return INDIVIDUAL_MAX_VELOCITY_FEATURES;
case E_IndividualMinVelocity:
return INDIVIDUAL_MIN_VELOCITY_FEATURES;
case E_IndividualMeanVelocity:
return INDIVIDUAL_MEAN_VELOCITY_FEATURES;
case E_IndividualSumVelocity:
return INDIVIDUAL_SUM_VELOCITY_FEATURES;
case E_PopulationCount:
return POPULATION_COUNT_FEATURES;
case E_PopulationDistinctCount:
return POPULATION_DISTINCT_COUNT_FEATURES;
case E_PopulationLowDistinctCount:
return POPULATION_LOW_DISTINCT_COUNT_FEATURES;
case E_PopulationHighDistinctCount:
return POPULATION_HIGH_DISTINCT_COUNT_FEATURES;
case E_PopulationRare:
return POPULATION_RARE_FEATURES;
case E_PopulationRareCount:
return POPULATION_RARE_COUNT_FEATURES;
case E_PopulationFreqRare:
return POPULATION_FREQ_RARE_FEATURES;
case E_PopulationFreqRareCount:
return POPULATION_FREQ_RARE_COUNT_FEATURES;
case E_PopulationLowCounts:
return POPULATION_LOW_COUNTS_FEATURES;
case E_PopulationHighCounts:
return POPULATION_HIGH_COUNTS_FEATURES;
case E_PopulationInfoContent:
return POPULATION_INFO_CONTENT_FEATURES;
case E_PopulationLowInfoContent:
return POPULATION_LOW_INFO_CONTENT_FEATURES;
case E_PopulationHighInfoContent:
return POPULATION_HIGH_INFO_CONTENT_FEATURES;
case E_PopulationTimeOfDay:
return POPULATION_TIME_OF_DAY_FEATURES;
case E_PopulationTimeOfWeek:
return POPULATION_TIME_OF_WEEK_FEATURES;
case E_PopulationMetric:
return POPULATION_METRIC_FEATURES;
case E_PopulationMetricMean:
return POPULATION_METRIC_MEAN_FEATURES;
case E_PopulationMetricLowMean:
return POPULATION_METRIC_LOW_MEAN_FEATURES;
case E_PopulationMetricHighMean:
return POPULATION_METRIC_HIGH_MEAN_FEATURES;
case E_PopulationMetricMedian:
return POPULATION_METRIC_MEDIAN_FEATURES;
case E_PopulationMetricLowMedian:
return POPULATION_METRIC_LOW_MEDIAN_FEATURES;
case E_PopulationMetricHighMedian:
return POPULATION_METRIC_HIGH_MEDIAN_FEATURES;
case E_PopulationMetricMin:
return POPULATION_METRIC_MIN_FEATURES;
case E_PopulationMetricMax:
return POPULATION_METRIC_MAX_FEATURES;
case E_PopulationMetricVariance:
return POPULATION_METRIC_VARIANCE_FEATURES;
case E_PopulationMetricLowVariance:
return POPULATION_METRIC_LOW_VARIANCE_FEATURES;
case E_PopulationMetricHighVariance:
return POPULATION_METRIC_HIGH_VARIANCE_FEATURES;
case E_PopulationMetricSum:
return POPULATION_METRIC_SUM_FEATURES;
case E_PopulationMetricLowSum:
return POPULATION_METRIC_LOW_SUM_FEATURES;
case E_PopulationMetricHighSum:
return POPULATION_METRIC_HIGH_SUM_FEATURES;
case E_PopulationLatLong:
return POPULATION_LAT_LONG_FEATURES;
case E_PopulationMaxVelocity:
return POPULATION_MAX_VELOCITY_FEATURES;
case E_PopulationMinVelocity:
return POPULATION_MIN_VELOCITY_FEATURES;
case E_PopulationMeanVelocity:
return POPULATION_MEAN_VELOCITY_FEATURES;
case E_PopulationSumVelocity:
return POPULATION_SUM_VELOCITY_FEATURES;
}
LOG_ERROR(<< "Unexpected function = " << static_cast<int>(function));
return EMPTY_FEATURES;
}
EFunction function(const TFeatureVec& features) {
if (features.empty()) {
LOG_ERROR(<< "No features default to '" << print(E_IndividualCount) << "'");
return E_IndividualCount;
}
TFunctionVec candidates;
std::size_t i = 0;
for (/**/; candidates.empty() && i < features.size(); ++i) {
TFeatureFunctionVecMapCItr functionsItr = FUNCTIONS_BY_FEATURE.find(features[i]);
if (functionsItr == FUNCTIONS_BY_FEATURE.end()) {
LOG_WARN(<< "No functions for feature " << model_t::print(features[i]));
continue;
}
candidates = functionsItr->second;
}
LOG_TRACE(<< "candidate " << candidates);
TFunctionVec fallback = candidates;
TFunctionVec tmp;
tmp.reserve(candidates.size());
for (/**/; !candidates.empty() && i < features.size(); ++i) {
TFeatureFunctionVecMapCItr functionsItr = FUNCTIONS_BY_FEATURE.find(features[i]);
if (functionsItr == FUNCTIONS_BY_FEATURE.end()) {
LOG_WARN(<< "No functions for feature " << model_t::print(features[i]));
continue;
}
LOG_TRACE(<< "candidate = " << functionsItr->second);
std::set_intersection(candidates.begin(), candidates.end(),
functionsItr->second.begin(),
functionsItr->second.end(), std::back_inserter(tmp));
candidates.swap(tmp);
tmp.clear();
}
if (candidates.empty()) {
EFunction result = mostSpecific(fallback);
LOG_ERROR(<< "Inconsistent features " << features << " defaulting to '"
<< print(result) << "'");
return result;
}
return mostSpecific(candidates);
}
const std::string& name(EFunction function) {
switch (function) {
case E_IndividualCount:
return detail::COUNT;
case E_IndividualNonZeroCount:
return detail::NON_ZERO_COUNT;
case E_IndividualRareCount:
return detail::COUNT;
case E_IndividualRareNonZeroCount:
return detail::RARE_NON_ZERO_COUNT;
case E_IndividualRare:
return detail::RARE;
case E_IndividualLowCounts:
return detail::LOW_COUNT;
case E_IndividualHighCounts:
return detail::HIGH_COUNT;
case E_IndividualLowNonZeroCount:
return detail::LOW_NON_ZERO_COUNT;
case E_IndividualHighNonZeroCount:
return detail::HIGH_NON_ZERO_COUNT;
case E_IndividualDistinctCount:
return detail::DISTINCT_COUNT;
case E_IndividualLowDistinctCount:
return detail::LOW_DISTINCT_COUNT;
case E_IndividualHighDistinctCount:
return detail::HIGH_DISTINCT_COUNT;
case E_IndividualInfoContent:
return detail::INFO_CONTENT;
case E_IndividualHighInfoContent:
return detail::HIGH_INFO_CONTENT;
case E_IndividualLowInfoContent:
return detail::LOW_INFO_CONTENT;
case E_IndividualTimeOfDay:
return detail::TIME_OF_DAY;
case E_IndividualTimeOfWeek:
return detail::TIME_OF_WEEK;
case E_IndividualMetric:
return detail::METRIC;
case E_IndividualMetricMean:
return detail::MEAN;
case E_IndividualMetricLowMean:
return detail::LOW_MEAN;
case E_IndividualMetricHighMean:
return detail::HIGH_MEAN;
case E_IndividualMetricMedian:
return detail::MEDIAN;
case E_IndividualMetricLowMedian:
return detail::LOW_MEDIAN;
case E_IndividualMetricHighMedian:
return detail::HIGH_MEDIAN;
case E_IndividualMetricMin:
return detail::MIN;
case E_IndividualMetricMax:
return detail::MAX;
case E_IndividualMetricVariance:
return detail::VARIANCE;
case E_IndividualMetricLowVariance:
return detail::LOW_VARIANCE;
case E_IndividualMetricHighVariance:
return detail::HIGH_VARIANCE;
case E_IndividualMetricSum:
return detail::SUM;
case E_IndividualMetricLowSum:
return detail::LOW_SUM;
case E_IndividualMetricHighSum:
return detail::HIGH_SUM;
case E_IndividualMetricNonNullSum:
return detail::NON_NULL_SUM;
case E_IndividualMetricLowNonNullSum:
return detail::LOW_NON_NULL_SUM;
case E_IndividualMetricHighNonNullSum:
return detail::HIGH_NON_NULL_SUM;
case E_IndividualLatLong:
return detail::LAT_LONG;
case E_IndividualMaxVelocity:
return detail::MAX_VELOCITY;
case E_IndividualMinVelocity:
return detail::MIN_VELOCITY;
case E_IndividualMeanVelocity:
return detail::MEAN_VELOCITY;
case E_IndividualSumVelocity:
return detail::SUM_VELOCITY;
case E_PopulationCount:
return detail::COUNT;
case E_PopulationDistinctCount:
return detail::DISTINCT_COUNT;
case E_PopulationLowDistinctCount:
return detail::LOW_DISTINCT_COUNT;
case E_PopulationHighDistinctCount:
return detail::HIGH_DISTINCT_COUNT;
case E_PopulationRare:
return detail::RARE;
case E_PopulationRareCount:
return detail::RARE_COUNT;
case E_PopulationFreqRare:
return detail::FREQ_RARE;
case E_PopulationFreqRareCount:
return detail::FREQ_RARE_COUNT;
case E_PopulationLowCounts:
return detail::LOW_COUNT;
case E_PopulationHighCounts:
return detail::HIGH_COUNT;
case E_PopulationInfoContent:
return detail::INFO_CONTENT;
case E_PopulationLowInfoContent:
return detail::LOW_INFO_CONTENT;
case E_PopulationHighInfoContent:
return detail::HIGH_INFO_CONTENT;
case E_PopulationTimeOfDay:
return detail::TIME_OF_DAY;
case E_PopulationTimeOfWeek:
return detail::TIME_OF_WEEK;
case E_PopulationMetric:
return detail::METRIC;
case E_PopulationMetricMean:
return detail::MEAN;
case E_PopulationMetricLowMean:
return detail::LOW_MEAN;
case E_PopulationMetricHighMean:
return detail::HIGH_MEAN;
case E_PopulationMetricMedian:
return detail::MEDIAN;
case E_PopulationMetricLowMedian:
return detail::LOW_MEDIAN;
case E_PopulationMetricHighMedian:
return detail::HIGH_MEDIAN;
case E_PopulationMetricMin:
return detail::MIN;
case E_PopulationMetricMax:
return detail::MAX;
case E_PopulationMetricVariance:
return detail::VARIANCE;
case E_PopulationMetricLowVariance:
return detail::LOW_VARIANCE;
case E_PopulationMetricHighVariance:
return detail::HIGH_VARIANCE;
case E_PopulationMetricSum:
return detail::SUM;
case E_PopulationMetricLowSum:
return detail::LOW_SUM;
case E_PopulationMetricHighSum:
return detail::HIGH_SUM;
case E_PopulationLatLong:
return detail::LAT_LONG;
case E_PopulationMaxVelocity:
return detail::MAX_VELOCITY;
case E_PopulationMinVelocity:
return detail::MIN_VELOCITY;
case E_PopulationMeanVelocity:
return detail::MEAN_VELOCITY;
case E_PopulationSumVelocity:
return detail::SUM_VELOCITY;
}
LOG_ERROR(<< "Unexpected function = " << static_cast<int>(function));
return detail::UNEXPECTED_FUNCTION;
}
std::string print(EFunction function) {
switch (function) {
case E_IndividualCount:
return "individual count";
case E_IndividualNonZeroCount:
return "individual non-zero count";
case E_IndividualRareCount:
return "individual rare count";
case E_IndividualRareNonZeroCount:
return "individual rare non-zero count";
case E_IndividualRare:
return "individual rare";
case E_IndividualLowCounts:
return "individual low counts";
case E_IndividualHighCounts:
return "individual high counts";
case E_IndividualLowNonZeroCount:
return "individual low non-zero count";
case E_IndividualHighNonZeroCount:
return "individual high non-zero count";
case E_IndividualDistinctCount:
return "individual distinct count";
case E_IndividualLowDistinctCount:
return "individual low distinct count";
case E_IndividualHighDistinctCount:
return "individual high distinct count";
case E_IndividualInfoContent:
return "individual info_content";
case E_IndividualHighInfoContent:
return "individual high_info_content";
case E_IndividualLowInfoContent:
return "individual low_info_content";
case E_IndividualTimeOfDay:
return "individual time-of-day";
case E_IndividualTimeOfWeek:
return "individual time-of-week";
case E_IndividualMetric:
return "individual metric";
case E_IndividualMetricMean:
return "individual metric mean";
case E_IndividualMetricLowMean:
return "individual metric low mean";
case E_IndividualMetricHighMean:
return "individual metric high mean";
case E_IndividualMetricMedian:
return "individual metric median";
case E_IndividualMetricLowMedian:
return "individual metric low median";
case E_IndividualMetricHighMedian:
return "individual metric high median";
case E_IndividualMetricMin:
return "individual metric minimum";
case E_IndividualMetricMax:
return "individual metric maximum";
case E_IndividualMetricVariance:
return "individual metric variance";
case E_IndividualMetricLowVariance:
return "individual metric low variance";
case E_IndividualMetricHighVariance:
return "individual metric high variance";
case E_IndividualMetricSum:
return "individual metric sum";
case E_IndividualMetricLowSum:
return "individual metric low sum";
case E_IndividualMetricHighSum:
return "individual metric high sum";
case E_IndividualMetricNonNullSum:
return "individual metric non-null sum";
case E_IndividualMetricLowNonNullSum:
return "individual metric low non-null sum";
case E_IndividualMetricHighNonNullSum:
return "individual high non-null sum";
case E_IndividualLatLong:
return "individual latitude/longitude";
case E_IndividualMaxVelocity:
return "individual max velocity";
case E_IndividualMinVelocity:
return "individual min velocity";
case E_IndividualMeanVelocity:
return "individual mean velocity";
case E_IndividualSumVelocity:
return "individual sum velocity";
case E_PopulationCount:
return "population count";
case E_PopulationDistinctCount:
return "population distinct count";
case E_PopulationLowDistinctCount:
return "population low distinct count";
case E_PopulationHighDistinctCount:
return "population high distinct count";
case E_PopulationRare:
return "population rare";
case E_PopulationRareCount:
return "population rare count";
case E_PopulationFreqRare:
return "population frequent rare";
case E_PopulationFreqRareCount:
return "population frequent rare count";
case E_PopulationLowCounts:
return "population low count";
case E_PopulationHighCounts:
return "population high count";
case E_PopulationInfoContent:
return "population information content";
case E_PopulationLowInfoContent:
return "population low information content";
case E_PopulationHighInfoContent:
return "population high information content";
case E_PopulationTimeOfDay:
return "population time-of-day";
case E_PopulationTimeOfWeek:
return "population time-of-week";
case E_PopulationMetric:
return "population metric";
case E_PopulationMetricMean:
return "population metric mean";
case E_PopulationMetricLowMean:
return "population metric low mean";
case E_PopulationMetricHighMean:
return "population metric high mean";
case E_PopulationMetricMedian:
return "population metric median";
case E_PopulationMetricLowMedian:
return "population metric low median";
case E_PopulationMetricHighMedian:
return "population metric high median";
case E_PopulationMetricMin:
return "population metric minimum";
case E_PopulationMetricMax:
return "population metric maximum";
case E_PopulationMetricVariance:
return "population metric variance";
case E_PopulationMetricLowVariance:
return "population metric low variance";
case E_PopulationMetricHighVariance:
return "population metric high variance";
case E_PopulationMetricSum:
return "population metric sum";
case E_PopulationMetricLowSum:
return "population metric low sum";
case E_PopulationMetricHighSum:
return "population metric high sum";
case E_PopulationLatLong:
return "population latitude/longitude";
case E_PopulationMaxVelocity:
return "population max velocity";
case E_PopulationMinVelocity:
return "population min velocity";
case E_PopulationMeanVelocity:
return "population mean velocity";
case E_PopulationSumVelocity:
return "population sum velocity";
}
LOG_ERROR(<< "Unexpected function = " << static_cast<int>(function));
return "-";
}
std::ostream& operator<<(std::ostream& o, EFunction function) {
return o << print(function);
}
}
}
}