16 #ifndef __DATA_SOURCE_MODIFIERS_INTERNAL_ENGINE_H__
17 #define __DATA_SOURCE_MODIFIERS_INTERNAL_ENGINE_H__
19 #include "services/collection.h"
20 #include "data_management/features/identifiers.h"
24 namespace data_management
35 class InputFeatureInfo :
public Base { };
41 class OutputFeatureInfo :
public Base
45 _numberOfCategories(0),
46 _featureType(features::DAAL_CONTINUOUS) { }
48 void setNumberOfCategories(
size_t numberOfCategories)
50 _numberOfCategories = numberOfCategories;
53 void setFeatureType(features::FeatureType featureType)
55 _featureType = featureType;
58 void setCategoricalDictionary(
const CategoricalFeatureDictionaryPtr &dictionary)
60 _dictionary = dictionary;
63 void fillDataSourceFeature(DataSourceFeature &feature)
const
65 setDataSourceFeatureType(feature);
66 feature.ntFeature.categoryNumber = _numberOfCategories;
67 feature.setCategoricalDictionary(_dictionary);
71 void setDataSourceFeatureType(DataSourceFeature &feature)
const
75 case features::DAAL_CONTINUOUS:
76 feature.setType<DAAL_DATA_TYPE>();
79 case features::DAAL_ORDINAL:
80 case features::DAAL_CATEGORICAL:
81 feature.setType<
int>();
84 feature.ntFeature.featureType = _featureType;
88 size_t _numberOfCategories;
89 features::FeatureType _featureType;
90 CategoricalFeatureDictionaryPtr _dictionary;
99 template<
typename InputFeatureInfo,
typename OutputFeatureInfo>
103 typedef InputFeatureInfo InputFeatureInfoType;
104 typedef OutputFeatureInfo OutputFeatureInfoType;
108 explicit Config(
const services::internal::CollectionPtr<InputFeatureInfo *> &pickedInputFeatures,
109 services::Status *status = NULL) :
110 _pickedInputFeatures(pickedInputFeatures)
112 services::Status localStatus = reallocateOutputFeatures( pickedInputFeatures->size() );
113 services::internal::tryAssignStatusAndThrow(status, localStatus);
116 size_t getNumberOfInputFeatures()
const
118 return _pickedInputFeatures->size();
121 services::Status setNumberOfOutputFeatures(
size_t numberOfOutputFeatures)
123 return reallocateOutputFeatures(numberOfOutputFeatures);
126 services::Status setOutputFeatureType(
size_t outputFeatureIndex,
127 features::FeatureType featureType)
129 if (outputFeatureIndex >= _outputFeatures.size())
130 {
return services::throwIfPossible(services::ErrorIncorrectIndex); }
132 _outputFeatures[outputFeatureIndex].setFeatureType(featureType);
133 return services::Status();
136 services::Status setNumberOfCategories(
size_t outputFeatureIndex,
137 size_t numberOfCategories)
139 if (outputFeatureIndex >= _outputFeatures.size())
140 {
return services::throwIfPossible(services::ErrorIncorrectIndex); }
142 _outputFeatures[outputFeatureIndex].setNumberOfCategories(numberOfCategories);
143 return services::Status();
146 services::Status setCategoricalDictionary(
size_t outputFeatureIndex,
147 const CategoricalFeatureDictionaryPtr &dictionary)
149 if (outputFeatureIndex >= _outputFeatures.size())
150 {
return services::throwIfPossible(services::ErrorIncorrectIndex); }
152 _outputFeatures[outputFeatureIndex].setCategoricalDictionary(dictionary);
153 return services::Status();
156 size_t getNumberOfOutputFeatures()
const
158 return _outputFeatures.size();
161 const services::Collection<OutputFeatureInfo> &getOutputFeaturesInfo()
const
163 return _outputFeatures;
167 const services::Collection<InputFeatureInfo *> &getPickedInputFeatures()
const
169 return *_pickedInputFeatures;
172 const InputFeatureInfo &getPickedInputFeature(
size_t index)
const
174 return *( _pickedInputFeatures->get(index) );
177 services::Collection<OutputFeatureInfo> &getOutputFeatures()
179 return _outputFeatures;
182 const OutputFeatureInfo &getOutputFeature(
size_t index)
const
184 return _outputFeatures[index];
187 OutputFeatureInfo &getOutputFeature(
size_t index)
189 return _outputFeatures[index];
193 services::Status reallocateOutputFeatures(
size_t numberOfOutputFeatures)
195 _outputFeatures = services::Collection<OutputFeatureInfo>(numberOfOutputFeatures);
196 if (!_outputFeatures.data())
197 {
return services::throwIfPossible(services::ErrorMemoryAllocationFailed); }
199 return services::Status();
203 services::internal::CollectionPtr<InputFeatureInfo *> _pickedInputFeatures;
204 services::Collection<OutputFeatureInfo> _outputFeatures;
213 template<
typename InputFeatureInfo,
typename OutputFeatureInfo>
217 typedef InputFeatureInfo InputFeatureInfoType;
218 typedef OutputFeatureInfo OutputFeatureInfoType;
222 explicit Context(
const services::internal::CollectionPtr<InputFeatureInfoType *> &pickedInputFeatures,
223 services::Status *status = NULL) :
224 _pickedInputFeatures(pickedInputFeatures) { }
226 size_t getNumberOfInputFeatures()
const
228 return _pickedInputFeatures->size();
231 services::BufferView<DAAL_DATA_TYPE> getOutputBuffer()
const
233 return _outputBuffer;
236 void setOutputBuffer(
const services::BufferView<DAAL_DATA_TYPE> &buffer)
238 _outputBuffer = buffer;
242 const services::Collection<InputFeatureInfoType *> &getPickedInputFeatures()
const
244 return *_pickedInputFeatures;
247 const InputFeatureInfoType &getPickedInputFeature(
size_t index)
const
249 return *( _pickedInputFeatures->get(index) );
253 services::BufferView<DAAL_DATA_TYPE> _outputBuffer;
254 services::internal::CollectionPtr<InputFeatureInfoType *> _pickedInputFeatures;
265 template<
typename Modifier,
typename Config,
typename Context>
266 class ModifierBinding :
public Base
269 typedef Modifier ModifierType;
270 typedef typename Config::InputFeatureInfoType InputFeatureInfoType;
271 typedef typename Config::OutputFeatureInfoType OutputFeatureInfoType;
274 _outputFeaturesOffset(0),
275 _numberOfOutputFeatures(0) { }
277 explicit ModifierBinding(
const features::FeatureIdCollectionIfacePtr &identifiers,
278 const services::SharedPtr<Modifier> &modifier,
279 services::Status *status = NULL) :
281 _identifiers(identifiers),
282 _outputFeaturesOffset(0),
283 _numberOfOutputFeatures(0) { }
285 services::Status bind(
size_t outputFeaturesOffset,
286 const features::FeatureIdMappingIfacePtr &mapping,
287 const services::internal::CollectionPtr<InputFeatureInfoType> &inputFeaturesInfo)
289 services::Status status;
291 features::FeatureIndicesIfacePtr indices = _identifiers->mapToFeatureIndices(*mapping, &status);
292 DAAL_CHECK_STATUS_VAR(status);
294 services::internal::CollectionPtr<InputFeatureInfoType *> pickedInputFeatureInfo =
295 features::internal::pickElements(indices, inputFeaturesInfo, &status);
296 DAAL_CHECK_STATUS_VAR(status);
298 _config = Config(pickedInputFeatureInfo, &status);
299 _context = Context(pickedInputFeatureInfo, &status);
300 DAAL_CHECK_STATUS_VAR(status);
302 _modifier->initialize(_config);
304 _outputFeaturesOffset = outputFeaturesOffset;
305 _numberOfOutputFeatures = _config.getNumberOfOutputFeatures();
310 void apply(
const services::BufferView<DAAL_DATA_TYPE> &outputBuffer)
312 _context.setOutputBuffer( outputBuffer.getBlock(_outputFeaturesOffset,
313 _numberOfOutputFeatures) );
314 _modifier->apply(_context);
319 _modifier->finalize(_config);
322 const OutputFeatureInfoType &getOutputFeatureInfo(
size_t featureIndex)
const
324 return _config.getOutputFeaturesInfo()[featureIndex];
327 size_t getNumberOfOutputFeatures()
const
329 return _numberOfOutputFeatures;
336 size_t _outputFeaturesOffset;
337 size_t _numberOfOutputFeatures;
339 services::SharedPtr<Modifier> _modifier;
340 features::FeatureIdCollectionIfacePtr _identifiers;
348 template<
typename ModifierBinding>
349 class ModifiersBinder :
public Base
352 typedef typename ModifierBinding::ModifierType ModifierType;
353 typedef typename ModifierBinding::InputFeatureInfoType InputFeatureInfoType;
354 typedef typename ModifierBinding::OutputFeatureInfoType OutputFeatureInfoType;
357 _numberOfOutputFeatures(0) { }
359 services::Status add(
const features::FeatureIdCollectionIfacePtr &identifiers,
360 const services::SharedPtr<ModifierType> &modifier)
362 if (!identifiers || !modifier)
363 {
return services::throwIfPossible(services::ErrorNullPtr); }
365 if ( !_bindings.safe_push_back(ModifierBinding(identifiers, modifier)) )
366 {
return services::throwIfPossible(services::ErrorMemoryAllocationFailed); }
368 return services::Status();
371 void apply(
const services::BufferView<DAAL_DATA_TYPE> &outputBuffer)
373 for (
size_t i = 0; i < _bindings.size(); i++)
375 _bindings[i].apply(outputBuffer);
381 for (
size_t i = 0; i < _bindings.size(); i++)
383 _bindings[i].finalize();
387 services::Status bind(
const features::FeatureIdMappingIfacePtr &mapping,
388 const services::internal::CollectionPtr<InputFeatureInfoType> &inputFeaturesInfo)
390 DAAL_ASSERT( mapping );
391 DAAL_ASSERT( inputFeaturesInfo );
393 services::Status status;
395 size_t outputFeaturesOffset = 0;
396 for (
size_t i = 0; i < _bindings.size(); i++)
398 status |= _bindings[i].bind(outputFeaturesOffset, mapping, inputFeaturesInfo);
399 DAAL_CHECK_STATUS_VAR(status);
401 outputFeaturesOffset += _bindings[i].getNumberOfOutputFeatures();
404 _inputFeaturesInfo = inputFeaturesInfo;
405 _numberOfOutputFeatures = outputFeaturesOffset;
410 size_t getNumberOfOutputFeatures()
const
412 return _numberOfOutputFeatures;
415 size_t getNumberOfModifiers()
const
417 return _bindings.size();
420 const ModifierBinding &getBinding(
size_t index)
const
422 return _bindings[index];
425 services::Collection<InputFeatureInfoType> &getInputFeaturesInfo()
427 return *_inputFeaturesInfo;
430 InputFeatureInfoType &getInputFeatureInfo(
size_t featureIndex)
432 return _inputFeaturesInfo->get(featureIndex);
436 size_t _numberOfOutputFeatures;
437 services::Collection<ModifierBinding> _bindings;
438 services::internal::CollectionPtr<InputFeatureInfoType> _inputFeaturesInfo;
448 template<
typename Modifier,
typename Config,
typename Context>
449 class ModifiersManager :
public Base
452 typedef ModifierBinding<Modifier, Config, Context> ModifierBindingType;
453 typedef typename ModifierBindingType::InputFeatureInfoType InputFeatureInfoType;
454 typedef typename ModifierBindingType::OutputFeatureInfoType OutputFeatureInfoType;
456 services::Status addModifier(
const features::FeatureIdCollectionIfacePtr &identifiers,
457 const services::SharedPtr<Modifier> &modifier)
459 return _binder.add(identifiers, modifier);
462 void applyModifiers(
const services::BufferView<DAAL_DATA_TYPE> &outputBuffer)
464 _binder.apply(outputBuffer);
472 services::Status fillDictionary(DataSourceDictionary &dictionary)
474 const size_t numberOfOutputFeatures = _binder.getNumberOfOutputFeatures();
475 dictionary.setNumberOfFeatures(numberOfOutputFeatures);
477 size_t featureCounter = 0;
478 for (
size_t i = 0; i < _binder.getNumberOfModifiers(); i++)
480 const ModifierBindingType &binding = _binder.getBinding(i);
481 for (
size_t j = 0; j < binding.getNumberOfOutputFeatures(); j++)
483 const OutputFeatureInfoType &fi = binding.getOutputFeatureInfo(j);
484 fi.fillDataSourceFeature( dictionary[featureCounter++] );
487 DAAL_ASSERT( numberOfOutputFeatures == featureCounter );
489 return services::Status();
492 size_t getNumberOfOutputFeatures()
const
494 return _binder.getNumberOfOutputFeatures();
498 ModifiersManager() { }
500 modifiers::internal::ModifiersBinder<ModifierBindingType> &getBinder()
506 modifiers::internal::ModifiersBinder<ModifierBindingType> _binder;
daal
Definition: algorithm_base_common.h:31
daal::data_management::modifiers::internal::ModifiersBinder
Class that creates and manages bindings for a modifier.
Definition: data_management/data_source/modifiers/internal/engine.h:349
daal::data_management::modifiers::internal::Config
Base class for modifier configuration.
Definition: data_management/data_source/modifiers/internal/engine.h:100
daal::services::internal::CollectionPtr
Shared pointer to the Collection object.
Definition: internal/collection.h:136
daal::services::ErrorMemoryAllocationFailed
Definition: error_indexes.h:147
daal::services::ErrorIncorrectIndex
Definition: error_indexes.h:100
daal::services::ErrorNullPtr
Definition: error_indexes.h:139
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:41
daal::Base
Base class for Intel(R) Data Analytics Acceleration Library objects
Definition: base.h:39
daal::data_management::modifiers::internal::Context
Base class for modifier context.
Definition: data_management/data_source/modifiers/internal/engine.h:214
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:266
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:449