18 #ifndef __DATA_SOURCE_MODIFIERS_INTERNAL_ENGINE_H__
19 #define __DATA_SOURCE_MODIFIERS_INTERNAL_ENGINE_H__
21 #include "services/collection.h"
22 #include "data_management/features/identifiers.h"
26 namespace data_management
37 class InputFeatureInfo :
public Base { };
43 class OutputFeatureInfo :
public Base
47 _numberOfCategories(0),
48 _featureType(features::DAAL_CONTINUOUS) { }
50 void setNumberOfCategories(
size_t numberOfCategories)
52 _numberOfCategories = numberOfCategories;
55 void setFeatureType(features::FeatureType featureType)
57 _featureType = featureType;
60 void setCategoricalDictionary(
const CategoricalFeatureDictionaryPtr &dictionary)
62 _dictionary = dictionary;
65 void fillDataSourceFeature(DataSourceFeature &feature)
const
67 setDataSourceFeatureType(feature);
68 feature.ntFeature.categoryNumber = _numberOfCategories;
69 feature.setCategoricalDictionary(_dictionary);
73 void setDataSourceFeatureType(DataSourceFeature &feature)
const
77 case features::DAAL_CONTINUOUS:
78 feature.setType<DAAL_DATA_TYPE>();
81 case features::DAAL_ORDINAL:
82 case features::DAAL_CATEGORICAL:
83 feature.setType<
int>();
86 feature.ntFeature.featureType = _featureType;
90 size_t _numberOfCategories;
91 features::FeatureType _featureType;
92 CategoricalFeatureDictionaryPtr _dictionary;
101 template<
typename InputFeatureInfo,
typename OutputFeatureInfo>
105 typedef InputFeatureInfo InputFeatureInfoType;
106 typedef OutputFeatureInfo OutputFeatureInfoType;
110 explicit Config(
const services::internal::CollectionPtr<InputFeatureInfo *> &pickedInputFeatures,
111 services::Status *status = NULL) :
112 _pickedInputFeatures(pickedInputFeatures)
114 services::Status localStatus = reallocateOutputFeatures( pickedInputFeatures->size() );
115 services::internal::tryAssignStatusAndThrow(status, localStatus);
118 size_t getNumberOfInputFeatures()
const
120 return _pickedInputFeatures->size();
123 services::Status setNumberOfOutputFeatures(
size_t numberOfOutputFeatures)
125 return reallocateOutputFeatures(numberOfOutputFeatures);
128 services::Status setOutputFeatureType(
size_t outputFeatureIndex,
129 features::FeatureType featureType)
131 if (outputFeatureIndex >= _outputFeatures.size())
132 {
return services::throwIfPossible(services::ErrorIncorrectIndex); }
134 _outputFeatures[outputFeatureIndex].setFeatureType(featureType);
135 return services::Status();
138 services::Status setNumberOfCategories(
size_t outputFeatureIndex,
139 size_t numberOfCategories)
141 if (outputFeatureIndex >= _outputFeatures.size())
142 {
return services::throwIfPossible(services::ErrorIncorrectIndex); }
144 _outputFeatures[outputFeatureIndex].setNumberOfCategories(numberOfCategories);
145 return services::Status();
148 services::Status setCategoricalDictionary(
size_t outputFeatureIndex,
149 const CategoricalFeatureDictionaryPtr &dictionary)
151 if (outputFeatureIndex >= _outputFeatures.size())
152 {
return services::throwIfPossible(services::ErrorIncorrectIndex); }
154 _outputFeatures[outputFeatureIndex].setCategoricalDictionary(dictionary);
155 return services::Status();
158 size_t getNumberOfOutputFeatures()
const
160 return _outputFeatures.size();
163 const services::Collection<OutputFeatureInfo> &getOutputFeaturesInfo()
const
165 return _outputFeatures;
169 const services::Collection<InputFeatureInfo *> &getPickedInputFeatures()
const
171 return *_pickedInputFeatures;
174 const InputFeatureInfo &getPickedInputFeature(
size_t index)
const
176 return *( _pickedInputFeatures->get(index) );
179 services::Collection<OutputFeatureInfo> &getOutputFeatures()
181 return _outputFeatures;
184 const OutputFeatureInfo &getOutputFeature(
size_t index)
const
186 return _outputFeatures[index];
189 OutputFeatureInfo &getOutputFeature(
size_t index)
191 return _outputFeatures[index];
195 services::Status reallocateOutputFeatures(
size_t numberOfOutputFeatures)
197 _outputFeatures = services::Collection<OutputFeatureInfo>(numberOfOutputFeatures);
198 if (!_outputFeatures.data())
199 {
return services::throwIfPossible(services::ErrorMemoryAllocationFailed); }
201 return services::Status();
205 services::internal::CollectionPtr<InputFeatureInfo *> _pickedInputFeatures;
206 services::Collection<OutputFeatureInfo> _outputFeatures;
215 template<
typename InputFeatureInfo,
typename OutputFeatureInfo>
219 typedef InputFeatureInfo InputFeatureInfoType;
220 typedef OutputFeatureInfo OutputFeatureInfoType;
224 explicit Context(
const services::internal::CollectionPtr<InputFeatureInfoType *> &pickedInputFeatures,
225 services::Status *status = NULL) :
226 _pickedInputFeatures(pickedInputFeatures) { }
228 size_t getNumberOfInputFeatures()
const
230 return _pickedInputFeatures->size();
233 services::BufferView<DAAL_DATA_TYPE> getOutputBuffer()
const
235 return _outputBuffer;
238 void setOutputBuffer(
const services::BufferView<DAAL_DATA_TYPE> &buffer)
240 _outputBuffer = buffer;
244 const services::Collection<InputFeatureInfoType *> &getPickedInputFeatures()
const
246 return *_pickedInputFeatures;
249 const InputFeatureInfoType &getPickedInputFeature(
size_t index)
const
251 return *( _pickedInputFeatures->get(index) );
255 services::BufferView<DAAL_DATA_TYPE> _outputBuffer;
256 services::internal::CollectionPtr<InputFeatureInfoType *> _pickedInputFeatures;
267 template<
typename Modifier,
typename Config,
typename Context>
268 class ModifierBinding :
public Base
271 typedef Modifier ModifierType;
272 typedef typename Config::InputFeatureInfoType InputFeatureInfoType;
273 typedef typename Config::OutputFeatureInfoType OutputFeatureInfoType;
276 _outputFeaturesOffset(0),
277 _numberOfOutputFeatures(0) { }
279 explicit ModifierBinding(
const features::FeatureIdCollectionIfacePtr &identifiers,
280 const services::SharedPtr<Modifier> &modifier,
281 services::Status *status = NULL) :
283 _identifiers(identifiers),
284 _outputFeaturesOffset(0),
285 _numberOfOutputFeatures(0) { }
287 services::Status bind(
size_t outputFeaturesOffset,
288 const features::FeatureIdMappingIfacePtr &mapping,
289 const services::internal::CollectionPtr<InputFeatureInfoType> &inputFeaturesInfo)
291 services::Status status;
293 features::FeatureIndicesIfacePtr indices = _identifiers->mapToFeatureIndices(*mapping, &status);
294 DAAL_CHECK_STATUS_VAR(status);
296 services::internal::CollectionPtr<InputFeatureInfoType *> pickedInputFeatureInfo =
297 features::internal::pickElements(indices, inputFeaturesInfo, &status);
298 DAAL_CHECK_STATUS_VAR(status);
300 _config = Config(pickedInputFeatureInfo, &status);
301 _context = Context(pickedInputFeatureInfo, &status);
302 DAAL_CHECK_STATUS_VAR(status);
304 _modifier->initialize(_config);
306 _outputFeaturesOffset = outputFeaturesOffset;
307 _numberOfOutputFeatures = _config.getNumberOfOutputFeatures();
312 void apply(
const services::BufferView<DAAL_DATA_TYPE> &outputBuffer)
314 _context.setOutputBuffer( outputBuffer.getBlock(_outputFeaturesOffset,
315 _numberOfOutputFeatures) );
316 _modifier->apply(_context);
321 _modifier->finalize(_config);
324 const OutputFeatureInfoType &getOutputFeatureInfo(
size_t featureIndex)
const
326 return _config.getOutputFeaturesInfo()[featureIndex];
329 size_t getNumberOfOutputFeatures()
const
331 return _numberOfOutputFeatures;
338 size_t _outputFeaturesOffset;
339 size_t _numberOfOutputFeatures;
341 services::SharedPtr<Modifier> _modifier;
342 features::FeatureIdCollectionIfacePtr _identifiers;
350 template<
typename ModifierBinding>
351 class ModifiersBinder :
public Base
354 typedef typename ModifierBinding::ModifierType ModifierType;
355 typedef typename ModifierBinding::InputFeatureInfoType InputFeatureInfoType;
356 typedef typename ModifierBinding::OutputFeatureInfoType OutputFeatureInfoType;
359 _numberOfOutputFeatures(0) { }
361 services::Status add(
const features::FeatureIdCollectionIfacePtr &identifiers,
362 const services::SharedPtr<ModifierType> &modifier)
364 if (!identifiers || !modifier)
365 {
return services::throwIfPossible(services::ErrorNullPtr); }
367 if ( !_bindings.safe_push_back(ModifierBinding(identifiers, modifier)) )
368 {
return services::throwIfPossible(services::ErrorMemoryAllocationFailed); }
370 return services::Status();
373 void apply(
const services::BufferView<DAAL_DATA_TYPE> &outputBuffer)
375 for (
size_t i = 0; i < _bindings.size(); i++)
377 _bindings[i].apply(outputBuffer);
383 for (
size_t i = 0; i < _bindings.size(); i++)
385 _bindings[i].finalize();
389 services::Status bind(
const features::FeatureIdMappingIfacePtr &mapping,
390 const services::internal::CollectionPtr<InputFeatureInfoType> &inputFeaturesInfo)
392 DAAL_ASSERT( mapping );
393 DAAL_ASSERT( inputFeaturesInfo );
395 services::Status status;
397 size_t outputFeaturesOffset = 0;
398 for (
size_t i = 0; i < _bindings.size(); i++)
400 status |= _bindings[i].bind(outputFeaturesOffset, mapping, inputFeaturesInfo);
401 DAAL_CHECK_STATUS_VAR(status);
403 outputFeaturesOffset += _bindings[i].getNumberOfOutputFeatures();
406 _inputFeaturesInfo = inputFeaturesInfo;
407 _numberOfOutputFeatures = outputFeaturesOffset;
412 size_t getNumberOfOutputFeatures()
const
414 return _numberOfOutputFeatures;
417 size_t getNumberOfModifiers()
const
419 return _bindings.size();
422 const ModifierBinding &getBinding(
size_t index)
const
424 return _bindings[index];
427 services::Collection<InputFeatureInfoType> &getInputFeaturesInfo()
429 return *_inputFeaturesInfo;
432 InputFeatureInfoType &getInputFeatureInfo(
size_t featureIndex)
434 return _inputFeaturesInfo->get(featureIndex);
438 size_t _numberOfOutputFeatures;
439 services::Collection<ModifierBinding> _bindings;
440 services::internal::CollectionPtr<InputFeatureInfoType> _inputFeaturesInfo;
450 template<
typename Modifier,
typename Config,
typename Context>
451 class ModifiersManager :
public Base
454 typedef ModifierBinding<Modifier, Config, Context> ModifierBindingType;
455 typedef typename ModifierBindingType::InputFeatureInfoType InputFeatureInfoType;
456 typedef typename ModifierBindingType::OutputFeatureInfoType OutputFeatureInfoType;
458 services::Status addModifier(
const features::FeatureIdCollectionIfacePtr &identifiers,
459 const services::SharedPtr<Modifier> &modifier)
461 return _binder.add(identifiers, modifier);
464 void applyModifiers(
const services::BufferView<DAAL_DATA_TYPE> &outputBuffer)
466 _binder.apply(outputBuffer);
474 services::Status fillDictionary(DataSourceDictionary &dictionary)
476 const size_t numberOfOutputFeatures = _binder.getNumberOfOutputFeatures();
477 dictionary.setNumberOfFeatures(numberOfOutputFeatures);
479 size_t featureCounter = 0;
480 for (
size_t i = 0; i < _binder.getNumberOfModifiers(); i++)
482 const ModifierBindingType &binding = _binder.getBinding(i);
483 for (
size_t j = 0; j < binding.getNumberOfOutputFeatures(); j++)
485 const OutputFeatureInfoType &fi = binding.getOutputFeatureInfo(j);
486 fi.fillDataSourceFeature( dictionary[featureCounter++] );
489 DAAL_ASSERT( numberOfOutputFeatures == featureCounter );
491 return services::Status();
494 size_t getNumberOfOutputFeatures()
const
496 return _binder.getNumberOfOutputFeatures();
500 ModifiersManager() { }
502 modifiers::internal::ModifiersBinder<ModifierBindingType> &getBinder()
508 modifiers::internal::ModifiersBinder<ModifierBindingType> _binder;
daal::data_management::modifiers::internal::Context
Base class for modifier context.
Definition: data_management/data_source/modifiers/internal/engine.h:216
daal::data_management::modifiers::internal::ModifiersManager
Class that holds modifiers and implements logic of modifiers applying flow.
Definition: data_management/data_source/modifiers/internal/engine.h:451
daal::data_management::modifiers::internal::Config
Base class for modifier configuration.
Definition: data_management/data_source/modifiers/internal/engine.h:102
daal::Base
Base class for Intel(R) Data Analytics Acceleration Library objects
Definition: base.h:41
daal::services::ErrorNullPtr
Definition: error_indexes.h:141
daal::data_management::modifiers::internal::InputFeatureInfo
Base class represents input feature for modifier, contains information about single input feature...
Definition: data_management/data_source/modifiers/internal/engine.h:37
daal::services::ErrorIncorrectIndex
Definition: error_indexes.h:102
daal::services::internal::CollectionPtr
Shared pointer to the Collection object.
Definition: internal/collection.h:138
daal::services::ErrorMemoryAllocationFailed
Definition: error_indexes.h:150
daal::data_management::modifiers::internal::OutputFeatureInfo
Base class represents output feature for modifier, contains information about single output feature...
Definition: data_management/data_source/modifiers/internal/engine.h:43
daal::data_management::modifiers::internal::ModifiersBinder
Class that creates and manages bindings for a modifier.
Definition: data_management/data_source/modifiers/internal/engine.h:351
daal::data_management::modifiers::internal::ModifierBinding
Class that binds feature identifiers to concrete feature indices, performs initialization of a modifi...
Definition: data_management/data_source/modifiers/internal/engine.h:268