22 #ifndef __AOS_NUMERIC_TABLE_H__
23 #define __AOS_NUMERIC_TABLE_H__
25 #include "data_management/data/data_serialize.h"
26 #include "data_management/data/numeric_table.h"
27 #include "services/daal_defines.h"
31 namespace data_management
37 #define DAAL_STRUCT_MEMBER_OFFSET(class_name, member_name) \
38 ((ptrdiff_t)&(reinterpret_cast<class_name*>(0x1000)->member_name) - 0x1000)
53 class DAAL_EXPORT AOSNumericTable :
public NumericTable
56 DECLARE_SERIALIZABLE_TAG();
57 DECLARE_SERIALIZABLE_IMPL();
66 AOSNumericTable(
size_t structSize = 0,
size_t ncol = 0,
size_t nrow = 0 );
76 static services::SharedPtr<AOSNumericTable> create(
size_t structSize = 0,
size_t ncol = 0,
size_t nrow = 0, services::Status *stat = NULL);
85 template<
typename StructDataType>
86 AOSNumericTable(
const services::SharedPtr<StructDataType> &ptr,
size_t ncol,
size_t nrow = 0 ): NumericTable(ncol, nrow)
88 _ptr = services::reinterpretPointerCast<byte, StructDataType>(ptr);
90 _structSize =
sizeof(StructDataType);
103 template<
typename StructDataType>
104 static services::SharedPtr<AOSNumericTable> create(
const services::SharedPtr<StructDataType> &ptr,
size_t ncol,
size_t nrow = 0, services::Status *stat = NULL )
106 DAAL_DEFAULT_CREATE_IMPL_EX(AOSNumericTable, ptr, ncol, nrow);
116 template<
typename StructDataType>
117 AOSNumericTable( StructDataType *ptr,
size_t ncol,
size_t nrow = 0 ): NumericTable(ncol, nrow)
119 _ptr = services::SharedPtr<byte>((byte*)ptr, services::EmptyDeleter());
121 _structSize =
sizeof(StructDataType);
134 template<
typename StructDataType>
135 static services::SharedPtr<AOSNumericTable> create( StructDataType *ptr,
size_t ncol,
size_t nrow = 0, services::Status *stat = NULL )
137 return create(services::SharedPtr<StructDataType>(ptr, services::EmptyDeleter()), ncol, nrow);
141 virtual ~AOSNumericTable()
144 daal::services::daal_free(_offsets);
145 freeDataMemoryImpl();
153 services::Status setArray(
void *
const ptr,
size_t obsnum = 0)
155 _ptr = services::SharedPtr<byte>((byte*)ptr, services::EmptyDeleter());
156 _memStatus = userAllocated;
157 return setNumberOfRowsImpl( obsnum );
165 services::Status setArray(
const services::SharedPtr<byte>& ptr,
size_t obsnum = 0)
168 _memStatus = userAllocated;
169 return setNumberOfRowsImpl( obsnum );
178 return (
void *)(_ptr.get());
185 const void *getArray()
const
187 return (
void *)(_ptr.get());
194 services::SharedPtr<byte> getArraySharedPtr()
208 services::Status setFeature(
size_t idx,
size_t offset, data_feature_utils::FeatureType featureType = data_feature_utils::DAAL_CONTINUOUS,
size_t categoryNumber=0)
211 if( _ddict.get() == NULL )
213 _ddict = NumericTableDictionary::create(&s);
217 s = _ddict->setFeature<T>(idx);
219 (*_ddict)[idx].featureType = featureType;
220 (*_ddict)[idx].categoryNumber = categoryNumber;
222 _offsets[idx] = offset;
231 void setOffset(
size_t idx,
size_t offset)
233 _offsets[idx] = offset;
236 services::Status getBlockOfRows(
size_t vector_idx,
size_t vector_num, ReadWriteMode rwflag, BlockDescriptor<double>& block) DAAL_C11_OVERRIDE
238 return getTBlock<double>(vector_idx, vector_num, rwflag, block);
240 services::Status getBlockOfRows(
size_t vector_idx,
size_t vector_num, ReadWriteMode rwflag, BlockDescriptor<float>& block) DAAL_C11_OVERRIDE
242 return getTBlock<float>(vector_idx, vector_num, rwflag, block);
244 services::Status getBlockOfRows(
size_t vector_idx,
size_t vector_num, ReadWriteMode rwflag, BlockDescriptor<int>& block) DAAL_C11_OVERRIDE
246 return getTBlock<int>(vector_idx, vector_num, rwflag, block);
249 services::Status releaseBlockOfRows(BlockDescriptor<double>& block) DAAL_C11_OVERRIDE
251 return releaseTBlock<double>(block);
253 services::Status releaseBlockOfRows(BlockDescriptor<float>& block) DAAL_C11_OVERRIDE
255 return releaseTBlock<float>(block);
257 services::Status releaseBlockOfRows(BlockDescriptor<int>& block) DAAL_C11_OVERRIDE
259 return releaseTBlock<int>(block);
262 services::Status getBlockOfColumnValues(
size_t feature_idx,
size_t vector_idx,
size_t value_num,
263 ReadWriteMode rwflag, BlockDescriptor<double>& block) DAAL_C11_OVERRIDE
265 return getTFeature<double>(feature_idx, vector_idx, value_num, rwflag, block);
267 services::Status getBlockOfColumnValues(
size_t feature_idx,
size_t vector_idx,
size_t value_num,
268 ReadWriteMode rwflag, BlockDescriptor<float>& block) DAAL_C11_OVERRIDE
270 return getTFeature<float>(feature_idx, vector_idx, value_num, rwflag, block);
272 services::Status getBlockOfColumnValues(
size_t feature_idx,
size_t vector_idx,
size_t value_num,
273 ReadWriteMode rwflag, BlockDescriptor<int>& block) DAAL_C11_OVERRIDE
275 return getTFeature<int>(feature_idx, vector_idx, value_num, rwflag, block);
278 services::Status releaseBlockOfColumnValues(BlockDescriptor<double>& block) DAAL_C11_OVERRIDE
280 return releaseTFeature<double>(block);
282 services::Status releaseBlockOfColumnValues(BlockDescriptor<float>& block) DAAL_C11_OVERRIDE
284 return releaseTFeature<float>(block);
286 services::Status releaseBlockOfColumnValues(BlockDescriptor<int>& block) DAAL_C11_OVERRIDE
288 return releaseTFeature<int>(block);
292 services::SharedPtr<byte> _ptr;
296 AOSNumericTable(
size_t structSize,
size_t ncol,
size_t nrow, services::Status &st );
298 template<
typename StructDataType>
299 AOSNumericTable(
const services::SharedPtr<StructDataType> &ptr,
size_t ncol,
size_t nrow, services::Status &st) : NumericTable(ncol, nrow, DictionaryIface::notEqual, st)
301 _ptr = services::reinterpretPointerCast<byte, StructDataType>(ptr);
303 _structSize =
sizeof(StructDataType);
308 services::Status allocateDataMemoryImpl(daal::MemType type = daal::dram) DAAL_C11_OVERRIDE
312 services::Status s = createOffsetsFromDictionary();
316 freeDataMemoryImpl();
318 const size_t size = _structSize * getNumberOfRows();
321 return services::Status(getNumberOfRows() == 0 ? services::ErrorIncorrectNumberOfObservations :
322 services::ErrorIncorrectNumberOfFeatures);
324 _ptr = services::SharedPtr<byte>((byte *)daal::services::daal_malloc(size), services::ServiceDeleter());
326 return services::Status(services::ErrorMemoryAllocationFailed);
328 _memStatus = internallyAllocated;
329 return services::Status();
332 bool checkOffsets()
const
334 if (!_offsets)
return true;
336 const size_t ncols = getNumberOfColumns();
338 size_t sizeOfRowInDict = 0;
339 for(
size_t i = 0; i < ncols; ++i )
341 if (!(*_ddict)[i].typeSize)
345 sizeOfRowInDict += (*_ddict)[i].typeSize;
347 if (sizeOfRowInDict > _structSize)
352 for(
size_t i = 1; i < ncols; ++i )
354 if ( _offsets[i-1] >= _offsets[i] )
362 services::Status createOffsetsFromDictionary()
364 const size_t ncols = getNumberOfColumns();
367 daal::services::daal_free(_offsets);
369 _offsets = (
size_t *)daal::services::daal_malloc(
sizeof(
size_t) * (ncols));
371 return services::Status(services::ErrorMemoryAllocationFailed);
374 for(
size_t i = 0; i < ncols; ++i )
376 _offsets[i] = offset;
377 offset += (*_ddict)[i].typeSize;
379 _structSize = offset;
381 return services::Status();
384 void freeDataMemoryImpl() DAAL_C11_OVERRIDE
386 _ptr = services::SharedPtr<byte>();
387 _memStatus = notAllocated;
391 template<
typename Archive,
bool onDeserialize>
392 services::Status serialImpl( Archive *arch )
394 NumericTable::serialImpl<Archive, onDeserialize>( arch );
395 arch->set(_structSize);
401 arch->set((
char*)_offsets, getNumberOfColumns() *
sizeof(
size_t));
405 allocateDataMemoryImpl();
408 size_t size = getNumberOfRows();
410 arch->set( (
char *)_ptr.get(), size * _structSize );
412 return services::Status();
417 template <
typename T>
418 services::Status getTBlock(
size_t idx,
size_t nrows,
int rwFlag, BlockDescriptor<T>& block)
420 size_t ncols = getNumberOfColumns();
421 size_t nobs = getNumberOfRows();
422 block.setDetails( 0, idx, rwFlag );
426 block.resizeBuffer( ncols, 0 );
427 return services::Status();
430 nrows = ( idx + nrows < nobs ) ? nrows : nobs - idx;
432 if( !block.resizeBuffer( ncols, nrows ) )
433 return services::Status(services::ErrorMemoryAllocationFailed);
435 if( !(rwFlag & (
int)readOnly) )
436 return services::Status();
438 char *ptr = (
char *)(_ptr.get()) + _structSize * idx;
440 for(
size_t j = 0 ; j < ncols ; j++ )
442 NumericTableFeature &f = (*_ddict)[j];
444 char *location = ptr + _offsets[j];
446 T* blockPtr = block.getBlockPtr();
448 data_feature_utils::getVectorStrideUpCast(f.indexType, data_feature_utils::getInternalNumType<T>())
449 ( nrows, location, _structSize, blockPtr + j,
sizeof(T)*ncols );
451 return services::Status();
454 template <
typename T>
455 services::Status releaseTBlock( BlockDescriptor<T>& block )
457 if(block.getRWFlag() & (int)writeOnly)
459 size_t ncols = getNumberOfColumns();
461 char *ptr = (
char *)(_ptr.get()) + _structSize * block.getRowsOffset();
463 T* blockPtr = block.getBlockPtr();
465 for(
size_t j = 0 ; j < ncols ; j++ )
467 NumericTableFeature &f = (*_ddict)[j];
469 char *location = ptr + _offsets[j];
471 data_feature_utils::getVectorStrideDownCast(f.indexType, data_feature_utils::getInternalNumType<T>())
472 ( block.getNumberOfRows(), blockPtr + j,
sizeof(T)*ncols, location, _structSize );
476 return services::Status();
479 template <
typename T>
480 services::Status getTFeature(
size_t feat_idx,
size_t idx,
size_t nrows,
int rwFlag, BlockDescriptor<T>& block)
482 size_t ncols = getNumberOfColumns();
483 size_t nobs = getNumberOfRows();
484 block.setDetails( feat_idx, idx, rwFlag );
488 block.resizeBuffer( 1, 0 );
489 return services::Status();
492 nrows = ( idx + nrows < nobs ) ? nrows : nobs - idx;
494 if( !block.resizeBuffer( 1, nrows ) )
495 return services::Status(services::ErrorMemoryAllocationFailed);
497 if((block.getRWFlag() & (int)readOnly))
499 NumericTableFeature &f = (*_ddict)[feat_idx];
500 char *ptr = (
char *)(_ptr.get()) + _structSize * idx + _offsets[feat_idx];
501 data_feature_utils::getVectorStrideUpCast(f.indexType, data_feature_utils::getInternalNumType<T>())
502 (nrows, ptr, _structSize, block.getBlockPtr(),
sizeof(T));
504 return services::Status();
507 template <
typename T>
508 services::Status releaseTFeature( BlockDescriptor<T>& block )
510 if (block.getRWFlag() & (int)writeOnly)
512 size_t feat_idx = block.getColumnsOffset();
514 NumericTableFeature &f = (*_ddict)[feat_idx];
516 char *ptr = (
char *)(_ptr.get()) + _structSize * block.getRowsOffset() + _offsets[feat_idx];
518 data_feature_utils::getVectorStrideDownCast(f.indexType, data_feature_utils::getInternalNumType<T>())
519 ( block.getNumberOfRows(), block.getBlockPtr(),
sizeof(T), ptr, _structSize );
522 return services::Status();
525 services::Status initOffsets()
527 const size_t ncols = getNumberOfColumns();
530 _offsets = (
size_t *)daal::services::daal_malloc(
sizeof(
size_t) * (ncols));
532 return services::Status(services::ErrorMemoryAllocationFailed);
533 for(
size_t i = 0; i < ncols; ++i ) _offsets[i] = 0;
539 return services::Status();
542 typedef services::SharedPtr<AOSNumericTable> AOSNumericTablePtr;
545 using interface1::AOSNumericTable;
546 using interface1::AOSNumericTablePtr;
daal::data_management::interface1::AOSNumericTable::getArray
const void * getArray() const
Definition: aos_numeric_table.h:185
daal::data_management::interface1::AOSNumericTable::AOSNumericTable
AOSNumericTable(StructDataType *ptr, size_t ncol, size_t nrow=0)
Definition: aos_numeric_table.h:117
daal
Definition: algorithm_base_common.h:31
daal::data_management::interface1::AOSNumericTable::AOSNumericTable
AOSNumericTable(const services::SharedPtr< StructDataType > &ptr, size_t ncol, size_t nrow=0)
Definition: aos_numeric_table.h:86
daal::data_management::interface1::AOSNumericTable::getBlockOfColumnValues
services::Status getBlockOfColumnValues(size_t feature_idx, size_t vector_idx, size_t value_num, ReadWriteMode rwflag, BlockDescriptor< double > &block) DAAL_C11_OVERRIDE
Definition: aos_numeric_table.h:262
daal::data_management::interface1::AOSNumericTable::getBlockOfRows
services::Status getBlockOfRows(size_t vector_idx, size_t vector_num, ReadWriteMode rwflag, BlockDescriptor< int > &block) DAAL_C11_OVERRIDE
Definition: aos_numeric_table.h:244
daal::services::ErrorMemoryAllocationFailed
Definition: error_indexes.h:146
daal::data_management::interface1::AOSNumericTable::setFeature
services::Status setFeature(size_t idx, size_t offset, data_feature_utils::FeatureType featureType=data_feature_utils::DAAL_CONTINUOUS, size_t categoryNumber=0)
Definition: aos_numeric_table.h:208
daal::data_management::interface1::AOSNumericTable::getBlockOfColumnValues
services::Status getBlockOfColumnValues(size_t feature_idx, size_t vector_idx, size_t value_num, ReadWriteMode rwflag, BlockDescriptor< int > &block) DAAL_C11_OVERRIDE
Definition: aos_numeric_table.h:272
daal::dram
Definition: daal_defines.h:133
daal::data_management::interface1::AOSNumericTable::releaseBlockOfColumnValues
services::Status releaseBlockOfColumnValues(BlockDescriptor< float > &block) DAAL_C11_OVERRIDE
Definition: aos_numeric_table.h:282
daal::services::ErrorIncorrectNumberOfFeatures
Definition: error_indexes.h:70
daal::algorithms::multivariate_outlier_detection::location
Definition: outlier_detection_multivariate_types.h:72
daal::data_management::interface1::AOSNumericTable::setArray
services::Status setArray(const services::SharedPtr< byte > &ptr, size_t obsnum=0)
Definition: aos_numeric_table.h:165
daal::services::daal_malloc
DAAL_EXPORT void * daal_malloc(size_t size, size_t alignment=DAAL_MALLOC_DEFAULT_ALIGNMENT)
daal::data_management::interface1::AOSNumericTable::releaseBlockOfColumnValues
services::Status releaseBlockOfColumnValues(BlockDescriptor< double > &block) DAAL_C11_OVERRIDE
Definition: aos_numeric_table.h:278
daal::data_management::interface1::NumericTable
Class for a data management component responsible for representation of data in the numeric format...
Definition: numeric_table.h:574
daal::data_management::interface1::AOSNumericTable::getArray
void * getArray()
Definition: aos_numeric_table.h:176
daal::data_management::interface1::AOSNumericTable::setOffset
void setOffset(size_t idx, size_t offset)
Definition: aos_numeric_table.h:231
daal::data_management::interface1::AOSNumericTable
Class that provides methods to access data stored as a contiguous array of heterogeneous feature vect...
Definition: aos_numeric_table.h:53
daal::services::daal_free
DAAL_EXPORT void daal_free(void *ptr)
daal::data_management::interface1::AOSNumericTable::getArraySharedPtr
services::SharedPtr< byte > getArraySharedPtr()
Definition: aos_numeric_table.h:194
daal::data_management::interface1::AOSNumericTable::create
static services::SharedPtr< AOSNumericTable > create(StructDataType *ptr, size_t ncol, size_t nrow=0, services::Status *stat=NULL)
Definition: aos_numeric_table.h:135
daal::data_management::interface1::AOSNumericTable::releaseBlockOfRows
services::Status releaseBlockOfRows(BlockDescriptor< float > &block) DAAL_C11_OVERRIDE
Definition: aos_numeric_table.h:253
daal::data_management::interface1::AOSNumericTable::setArray
services::Status setArray(void *const ptr, size_t obsnum=0)
Definition: aos_numeric_table.h:153
daal::data_management::interface1::AOSNumericTable::create
static services::SharedPtr< AOSNumericTable > create(const services::SharedPtr< StructDataType > &ptr, size_t ncol, size_t nrow=0, services::Status *stat=NULL)
Definition: aos_numeric_table.h:104
daal::data_management::interface1::AOSNumericTable::releaseBlockOfRows
services::Status releaseBlockOfRows(BlockDescriptor< double > &block) DAAL_C11_OVERRIDE
Definition: aos_numeric_table.h:249
daal::data_management::interface1::AOSNumericTable::getBlockOfRows
services::Status getBlockOfRows(size_t vector_idx, size_t vector_num, ReadWriteMode rwflag, BlockDescriptor< double > &block) DAAL_C11_OVERRIDE
Definition: aos_numeric_table.h:236
daal::data_management::interface1::BlockDescriptor
Base class that manages buffer memory for read/write operations required by numeric tables...
Definition: numeric_table.h:55
daal::services::ErrorIncorrectNumberOfObservations
Definition: error_indexes.h:71
daal::data_management::interface1::AOSNumericTable::getBlockOfRows
services::Status getBlockOfRows(size_t vector_idx, size_t vector_num, ReadWriteMode rwflag, BlockDescriptor< float > &block) DAAL_C11_OVERRIDE
Definition: aos_numeric_table.h:240
daal::algorithms::implicit_als::training::offset
Definition: implicit_als_training_types.h:148
daal::data_management::interface1::Dictionary::create
static services::SharedPtr< Dictionary > create(size_t nfeat, FeaturesEqual featuresEqual=notEqual, services::Status *stat=NULL)
Definition: data_dictionary.h:183
daal::data_management::interface1::AOSNumericTable::releaseBlockOfColumnValues
services::Status releaseBlockOfColumnValues(BlockDescriptor< int > &block) DAAL_C11_OVERRIDE
Definition: aos_numeric_table.h:286
daal::data_management::interface1::AOSNumericTable::getBlockOfColumnValues
services::Status getBlockOfColumnValues(size_t feature_idx, size_t vector_idx, size_t value_num, ReadWriteMode rwflag, BlockDescriptor< float > &block) DAAL_C11_OVERRIDE
Definition: aos_numeric_table.h:267
daal::MemType
MemType
Definition: daal_defines.h:131
daal::data_management::interface1::AOSNumericTable::releaseBlockOfRows
services::Status releaseBlockOfRows(BlockDescriptor< int > &block) DAAL_C11_OVERRIDE
Definition: aos_numeric_table.h:257