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 "data_management/data/internal/conversion.h"
28 #include "services/daal_defines.h"
32 namespace data_management
38 #define DAAL_STRUCT_MEMBER_OFFSET(class_name, member_name) \
39 ((ptrdiff_t)&(reinterpret_cast<class_name*>(0x1000)->member_name) - 0x1000)
54 class DAAL_EXPORT AOSNumericTable :
public NumericTable
57 DECLARE_SERIALIZABLE_TAG();
58 DECLARE_SERIALIZABLE_IMPL();
67 AOSNumericTable(
size_t structSize = 0,
size_t ncol = 0,
size_t nrow = 0 );
77 static services::SharedPtr<AOSNumericTable> create(
size_t structSize = 0,
size_t ncol = 0,
size_t nrow = 0, services::Status *stat = NULL);
86 template<
typename StructDataType>
87 AOSNumericTable(
const services::SharedPtr<StructDataType> &ptr,
size_t ncol,
size_t nrow = 0 ): NumericTable(ncol, nrow)
89 _ptr = services::reinterpretPointerCast<byte, StructDataType>(ptr);
91 _structSize =
sizeof(StructDataType);
104 template<
typename StructDataType>
105 static services::SharedPtr<AOSNumericTable> create(
const services::SharedPtr<StructDataType> &ptr,
size_t ncol,
size_t nrow = 0, services::Status *stat = NULL )
107 DAAL_DEFAULT_CREATE_IMPL_EX(AOSNumericTable, ptr, ncol, nrow);
117 template<
typename StructDataType>
118 AOSNumericTable( StructDataType *ptr,
size_t ncol,
size_t nrow = 0 ): NumericTable(ncol, nrow)
120 _ptr = services::SharedPtr<byte>((byte*)ptr, services::EmptyDeleter());
122 _structSize =
sizeof(StructDataType);
135 template<
typename StructDataType>
136 static services::SharedPtr<AOSNumericTable> create( StructDataType *ptr,
size_t ncol,
size_t nrow = 0, services::Status *stat = NULL )
138 return create(services::SharedPtr<StructDataType>(ptr, services::EmptyDeleter()), ncol, nrow);
142 virtual ~AOSNumericTable()
145 daal::services::daal_free(_offsets);
146 freeDataMemoryImpl();
154 services::Status setArray(
void *
const ptr,
size_t obsnum = 0)
156 _ptr = services::SharedPtr<byte>((byte*)ptr, services::EmptyDeleter());
157 _memStatus = userAllocated;
158 return setNumberOfRowsImpl( obsnum );
166 services::Status setArray(
const services::SharedPtr<byte>& ptr,
size_t obsnum = 0)
169 _memStatus = userAllocated;
170 return setNumberOfRowsImpl( obsnum );
179 return (
void *)(_ptr.get());
186 const void *getArray()
const
188 return (
void *)(_ptr.get());
195 services::SharedPtr<byte> getArraySharedPtr()
209 services::Status setFeature(
size_t idx,
size_t offset, features::FeatureType featureType = features::DAAL_CONTINUOUS,
size_t categoryNumber=0)
212 if( _ddict.get() == NULL )
214 _ddict = NumericTableDictionary::create(&s);
218 s = _ddict->setFeature<T>(idx);
220 (*_ddict)[idx].featureType = featureType;
221 (*_ddict)[idx].categoryNumber = categoryNumber;
223 _offsets[idx] = offset;
232 void setOffset(
size_t idx,
size_t offset)
234 _offsets[idx] = offset;
237 services::Status getBlockOfRows(
size_t vector_idx,
size_t vector_num, ReadWriteMode rwflag, BlockDescriptor<double>& block) DAAL_C11_OVERRIDE
239 return getTBlock<double>(vector_idx, vector_num, rwflag, block);
241 services::Status getBlockOfRows(
size_t vector_idx,
size_t vector_num, ReadWriteMode rwflag, BlockDescriptor<float>& block) DAAL_C11_OVERRIDE
243 return getTBlock<float>(vector_idx, vector_num, rwflag, block);
245 services::Status getBlockOfRows(
size_t vector_idx,
size_t vector_num, ReadWriteMode rwflag, BlockDescriptor<int>& block) DAAL_C11_OVERRIDE
247 return getTBlock<int>(vector_idx, vector_num, rwflag, block);
250 services::Status releaseBlockOfRows(BlockDescriptor<double>& block) DAAL_C11_OVERRIDE
252 return releaseTBlock<double>(block);
254 services::Status releaseBlockOfRows(BlockDescriptor<float>& block) DAAL_C11_OVERRIDE
256 return releaseTBlock<float>(block);
258 services::Status releaseBlockOfRows(BlockDescriptor<int>& block) DAAL_C11_OVERRIDE
260 return releaseTBlock<int>(block);
263 services::Status getBlockOfColumnValues(
size_t feature_idx,
size_t vector_idx,
size_t value_num,
264 ReadWriteMode rwflag, BlockDescriptor<double>& block) DAAL_C11_OVERRIDE
266 return getTFeature<double>(feature_idx, vector_idx, value_num, rwflag, block);
268 services::Status getBlockOfColumnValues(
size_t feature_idx,
size_t vector_idx,
size_t value_num,
269 ReadWriteMode rwflag, BlockDescriptor<float>& block) DAAL_C11_OVERRIDE
271 return getTFeature<float>(feature_idx, vector_idx, value_num, rwflag, block);
273 services::Status getBlockOfColumnValues(
size_t feature_idx,
size_t vector_idx,
size_t value_num,
274 ReadWriteMode rwflag, BlockDescriptor<int>& block) DAAL_C11_OVERRIDE
276 return getTFeature<int>(feature_idx, vector_idx, value_num, rwflag, block);
279 services::Status releaseBlockOfColumnValues(BlockDescriptor<double>& block) DAAL_C11_OVERRIDE
281 return releaseTFeature<double>(block);
283 services::Status releaseBlockOfColumnValues(BlockDescriptor<float>& block) DAAL_C11_OVERRIDE
285 return releaseTFeature<float>(block);
287 services::Status releaseBlockOfColumnValues(BlockDescriptor<int>& block) DAAL_C11_OVERRIDE
289 return releaseTFeature<int>(block);
293 services::SharedPtr<byte> _ptr;
297 AOSNumericTable(
size_t structSize,
size_t ncol,
size_t nrow, services::Status &st );
299 template<
typename StructDataType>
300 AOSNumericTable(
const services::SharedPtr<StructDataType> &ptr,
size_t ncol,
size_t nrow, services::Status &st) : NumericTable(ncol, nrow, DictionaryIface::notEqual, st)
302 _ptr = services::reinterpretPointerCast<byte, StructDataType>(ptr);
304 _structSize =
sizeof(StructDataType);
309 services::Status allocateDataMemoryImpl(daal::MemType type = daal::dram) DAAL_C11_OVERRIDE
313 services::Status s = createOffsetsFromDictionary();
317 freeDataMemoryImpl();
319 const size_t size = _structSize * getNumberOfRows();
322 return services::Status(getNumberOfRows() == 0 ? services::ErrorIncorrectNumberOfObservations :
323 services::ErrorIncorrectNumberOfFeatures);
325 _ptr = services::SharedPtr<byte>((byte *)daal::services::daal_malloc(size), services::ServiceDeleter());
327 return services::Status(services::ErrorMemoryAllocationFailed);
329 _memStatus = internallyAllocated;
330 return services::Status();
333 bool checkOffsets()
const
335 if (!_offsets)
return true;
337 const size_t ncols = getNumberOfColumns();
339 size_t sizeOfRowInDict = 0;
340 for(
size_t i = 0; i < ncols; ++i )
342 if (!(*_ddict)[i].typeSize)
346 sizeOfRowInDict += (*_ddict)[i].typeSize;
348 if (sizeOfRowInDict > _structSize)
353 for(
size_t i = 1; i < ncols; ++i )
355 if ( _offsets[i-1] >= _offsets[i] )
363 services::Status createOffsetsFromDictionary()
365 const size_t ncols = getNumberOfColumns();
368 daal::services::daal_free(_offsets);
370 _offsets = (
size_t *)daal::services::daal_malloc(
sizeof(
size_t) * (ncols));
372 return services::Status(services::ErrorMemoryAllocationFailed);
375 for(
size_t i = 0; i < ncols; ++i )
377 _offsets[i] = offset;
378 offset += (*_ddict)[i].typeSize;
380 _structSize = offset;
382 return services::Status();
385 void freeDataMemoryImpl() DAAL_C11_OVERRIDE
387 _ptr = services::SharedPtr<byte>();
388 _memStatus = notAllocated;
392 template<
typename Archive,
bool onDeserialize>
393 services::Status serialImpl( Archive *arch )
395 NumericTable::serialImpl<Archive, onDeserialize>( arch );
396 arch->set(_structSize);
402 arch->set((
char*)_offsets, getNumberOfColumns() *
sizeof(
size_t));
406 allocateDataMemoryImpl();
409 size_t size = getNumberOfRows();
411 arch->set( (
char *)_ptr.get(), size * _structSize );
413 return services::Status();
418 template <
typename T>
419 services::Status getTBlock(
size_t idx,
size_t nrows,
int rwFlag, BlockDescriptor<T>& block)
421 size_t ncols = getNumberOfColumns();
422 size_t nobs = getNumberOfRows();
423 block.setDetails( 0, idx, rwFlag );
427 block.resizeBuffer( ncols, 0 );
428 return services::Status();
431 nrows = ( idx + nrows < nobs ) ? nrows : nobs - idx;
433 if( !block.resizeBuffer( ncols, nrows ) )
434 return services::Status(services::ErrorMemoryAllocationFailed);
436 if( !(rwFlag & (
int)readOnly) )
437 return services::Status();
439 char *ptr = (
char *)(_ptr.get()) + _structSize * idx;
441 for(
size_t j = 0 ; j < ncols ; j++ )
443 NumericTableFeature &f = (*_ddict)[j];
445 char *location = ptr + _offsets[j];
447 T* blockPtr = block.getBlockPtr();
449 internal::getVectorStrideUpCast(f.indexType, internal::getConversionDataType<T>())
450 ( nrows, location, _structSize, blockPtr + j,
sizeof(T)*ncols );
452 return services::Status();
455 template <
typename T>
456 services::Status releaseTBlock( BlockDescriptor<T>& block )
458 if(block.getRWFlag() & (int)writeOnly)
460 size_t ncols = getNumberOfColumns();
462 char *ptr = (
char *)(_ptr.get()) + _structSize * block.getRowsOffset();
464 T* blockPtr = block.getBlockPtr();
466 for(
size_t j = 0 ; j < ncols ; j++ )
468 NumericTableFeature &f = (*_ddict)[j];
470 char *location = ptr + _offsets[j];
472 internal::getVectorStrideDownCast(f.indexType, internal::getConversionDataType<T>())
473 ( block.getNumberOfRows(), blockPtr + j,
sizeof(T)*ncols, location, _structSize );
477 return services::Status();
480 template <
typename T>
481 services::Status getTFeature(
size_t feat_idx,
size_t idx,
size_t nrows,
int rwFlag, BlockDescriptor<T>& block)
483 size_t ncols = getNumberOfColumns();
484 size_t nobs = getNumberOfRows();
485 block.setDetails( feat_idx, idx, rwFlag );
489 block.resizeBuffer( 1, 0 );
490 return services::Status();
493 nrows = ( idx + nrows < nobs ) ? nrows : nobs - idx;
495 if( !block.resizeBuffer( 1, nrows ) )
496 return services::Status(services::ErrorMemoryAllocationFailed);
498 if((block.getRWFlag() & (int)readOnly))
500 NumericTableFeature &f = (*_ddict)[feat_idx];
501 char *ptr = (
char *)(_ptr.get()) + _structSize * idx + _offsets[feat_idx];
502 internal::getVectorStrideUpCast(f.indexType, internal::getConversionDataType<T>())
503 (nrows, ptr, _structSize, block.getBlockPtr(),
sizeof(T));
505 return services::Status();
508 template <
typename T>
509 services::Status releaseTFeature( BlockDescriptor<T>& block )
511 if (block.getRWFlag() & (int)writeOnly)
513 size_t feat_idx = block.getColumnsOffset();
515 NumericTableFeature &f = (*_ddict)[feat_idx];
517 char *ptr = (
char *)(_ptr.get()) + _structSize * block.getRowsOffset() + _offsets[feat_idx];
519 internal::getVectorStrideDownCast(f.indexType, internal::getConversionDataType<T>())
520 ( block.getNumberOfRows(), block.getBlockPtr(),
sizeof(T), ptr, _structSize );
523 return services::Status();
526 services::Status initOffsets()
528 const size_t ncols = getNumberOfColumns();
531 _offsets = (
size_t *)daal::services::daal_malloc(
sizeof(
size_t) * (ncols));
533 return services::Status(services::ErrorMemoryAllocationFailed);
534 for(
size_t i = 0; i < ncols; ++i ) _offsets[i] = 0;
540 return services::Status();
543 typedef services::SharedPtr<AOSNumericTable> AOSNumericTablePtr;
546 using interface1::AOSNumericTable;
547 using interface1::AOSNumericTablePtr;
daal::data_management::interface1::AOSNumericTable::setFeature
services::Status setFeature(size_t idx, size_t offset, features::FeatureType featureType=features::DAAL_CONTINUOUS, size_t categoryNumber=0)
Definition: aos_numeric_table.h:209
daal::data_management::interface1::AOSNumericTable::getArray
const void * getArray() const
Definition: aos_numeric_table.h:186
daal::data_management::interface1::AOSNumericTable::AOSNumericTable
AOSNumericTable(StructDataType *ptr, size_t ncol, size_t nrow=0)
Definition: aos_numeric_table.h:118
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:87
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:263
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:245
daal::services::ErrorMemoryAllocationFailed
Definition: error_indexes.h:147
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:273
daal::dram
Definition: daal_defines.h:147
daal::data_management::interface1::AOSNumericTable::releaseBlockOfColumnValues
services::Status releaseBlockOfColumnValues(BlockDescriptor< float > &block) DAAL_C11_OVERRIDE
Definition: aos_numeric_table.h:283
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:166
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:279
daal::data_management::interface1::NumericTable
Class for a data management component responsible for representation of data in the numeric format...
Definition: numeric_table.h:575
daal::data_management::interface1::AOSNumericTable::getArray
void * getArray()
Definition: aos_numeric_table.h:177
daal::data_management::interface1::AOSNumericTable::setOffset
void setOffset(size_t idx, size_t offset)
Definition: aos_numeric_table.h:232
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:54
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:195
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:136
daal::data_management::interface1::AOSNumericTable::releaseBlockOfRows
services::Status releaseBlockOfRows(BlockDescriptor< float > &block) DAAL_C11_OVERRIDE
Definition: aos_numeric_table.h:254
daal::data_management::interface1::AOSNumericTable::setArray
services::Status setArray(void *const ptr, size_t obsnum=0)
Definition: aos_numeric_table.h:154
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:105
daal::data_management::interface1::AOSNumericTable::releaseBlockOfRows
services::Status releaseBlockOfRows(BlockDescriptor< double > &block) DAAL_C11_OVERRIDE
Definition: aos_numeric_table.h:250
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:237
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:241
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:186
daal::data_management::interface1::AOSNumericTable::releaseBlockOfColumnValues
services::Status releaseBlockOfColumnValues(BlockDescriptor< int > &block) DAAL_C11_OVERRIDE
Definition: aos_numeric_table.h:287
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:268
daal::MemType
MemType
Definition: daal_defines.h:145
daal::data_management::interface1::AOSNumericTable::releaseBlockOfRows
services::Status releaseBlockOfRows(BlockDescriptor< int > &block) DAAL_C11_OVERRIDE
Definition: aos_numeric_table.h:258