24 #ifndef __AOS_NUMERIC_TABLE_H__
25 #define __AOS_NUMERIC_TABLE_H__
27 #include "data_management/data/data_serialize.h"
28 #include "data_management/data/numeric_table.h"
29 #include "data_management/data/internal/conversion.h"
30 #include "services/daal_defines.h"
34 namespace data_management
40 #define DAAL_STRUCT_MEMBER_OFFSET(class_name, member_name) \
41 ((ptrdiff_t)&(reinterpret_cast<class_name*>(0x1000)->member_name) - 0x1000)
56 class DAAL_EXPORT AOSNumericTable :
public NumericTable
59 DECLARE_SERIALIZABLE_TAG();
60 DECLARE_SERIALIZABLE_IMPL();
69 AOSNumericTable(
size_t structSize = 0,
size_t ncol = 0,
size_t nrow = 0 );
79 static services::SharedPtr<AOSNumericTable> create(
size_t structSize = 0,
size_t ncol = 0,
size_t nrow = 0, services::Status *stat = NULL);
88 template<
typename StructDataType>
89 AOSNumericTable(
const services::SharedPtr<StructDataType> &ptr,
size_t ncol,
size_t nrow = 0 ): NumericTable(ncol, nrow)
91 _ptr = services::reinterpretPointerCast<byte, StructDataType>(ptr);
93 _structSize =
sizeof(StructDataType);
106 template<
typename StructDataType>
107 static services::SharedPtr<AOSNumericTable> create(
const services::SharedPtr<StructDataType> &ptr,
size_t ncol,
size_t nrow = 0, services::Status *stat = NULL )
109 DAAL_DEFAULT_CREATE_IMPL_EX(AOSNumericTable, ptr, ncol, nrow);
119 template<
typename StructDataType>
120 AOSNumericTable( StructDataType *ptr,
size_t ncol,
size_t nrow = 0 ): NumericTable(ncol, nrow)
122 _ptr = services::SharedPtr<byte>((byte*)ptr, services::EmptyDeleter());
124 _structSize =
sizeof(StructDataType);
137 template<
typename StructDataType>
138 static services::SharedPtr<AOSNumericTable> create( StructDataType *ptr,
size_t ncol,
size_t nrow = 0, services::Status *stat = NULL )
140 return create(services::SharedPtr<StructDataType>(ptr, services::EmptyDeleter()), ncol, nrow);
144 virtual ~AOSNumericTable()
148 daal::services::daal_free(_offsets);
151 freeDataMemoryImpl();
159 services::Status setArray(
void *
const ptr,
size_t obsnum = 0)
161 _ptr = services::SharedPtr<byte>((byte*)ptr, services::EmptyDeleter());
162 _memStatus = userAllocated;
163 return setNumberOfRowsImpl( obsnum );
171 services::Status setArray(
const services::SharedPtr<byte>& ptr,
size_t obsnum = 0)
174 _memStatus = userAllocated;
175 return setNumberOfRowsImpl( obsnum );
184 return (
void *)(_ptr.get());
191 const void *getArray()
const
193 return (
void *)(_ptr.get());
200 services::SharedPtr<byte> getArraySharedPtr()
214 services::Status setFeature(
size_t idx,
size_t offset, features::FeatureType featureType = features::DAAL_CONTINUOUS,
size_t categoryNumber=0)
216 if (offset >= _structSize || idx >= getNumberOfColumns())
218 return services::throwIfPossible(services::Status(services::ErrorIncorrectDataRange));
222 if( _ddict.get() == NULL )
224 _ddict = NumericTableDictionary::create(&s);
228 s = _ddict->setFeature<T>(idx);
230 (*_ddict)[idx].featureType = featureType;
231 (*_ddict)[idx].categoryNumber = categoryNumber;
233 _offsets[idx] = offset;
242 void setOffset(
size_t idx,
size_t offset)
244 if (offset >= _structSize || idx >= getNumberOfColumns())
246 _status.add(services::throwIfPossible(services::Status(services::ErrorIncorrectDataRange)));
250 _offsets[idx] = offset;
254 services::Status getBlockOfRows(
size_t vector_idx,
size_t vector_num, ReadWriteMode rwflag, BlockDescriptor<double>& block) DAAL_C11_OVERRIDE
256 return getTBlock<double>(vector_idx, vector_num, rwflag, block);
258 services::Status getBlockOfRows(
size_t vector_idx,
size_t vector_num, ReadWriteMode rwflag, BlockDescriptor<float>& block) DAAL_C11_OVERRIDE
260 return getTBlock<float>(vector_idx, vector_num, rwflag, block);
262 services::Status getBlockOfRows(
size_t vector_idx,
size_t vector_num, ReadWriteMode rwflag, BlockDescriptor<int>& block) DAAL_C11_OVERRIDE
264 return getTBlock<int>(vector_idx, vector_num, rwflag, block);
267 services::Status releaseBlockOfRows(BlockDescriptor<double>& block) DAAL_C11_OVERRIDE
269 return releaseTBlock<double>(block);
271 services::Status releaseBlockOfRows(BlockDescriptor<float>& block) DAAL_C11_OVERRIDE
273 return releaseTBlock<float>(block);
275 services::Status releaseBlockOfRows(BlockDescriptor<int>& block) DAAL_C11_OVERRIDE
277 return releaseTBlock<int>(block);
280 services::Status getBlockOfColumnValues(
size_t feature_idx,
size_t vector_idx,
size_t value_num,
281 ReadWriteMode rwflag, BlockDescriptor<double>& block) DAAL_C11_OVERRIDE
283 return getTFeature<double>(feature_idx, vector_idx, value_num, rwflag, block);
285 services::Status getBlockOfColumnValues(
size_t feature_idx,
size_t vector_idx,
size_t value_num,
286 ReadWriteMode rwflag, BlockDescriptor<float>& block) DAAL_C11_OVERRIDE
288 return getTFeature<float>(feature_idx, vector_idx, value_num, rwflag, block);
290 services::Status getBlockOfColumnValues(
size_t feature_idx,
size_t vector_idx,
size_t value_num,
291 ReadWriteMode rwflag, BlockDescriptor<int>& block) DAAL_C11_OVERRIDE
293 return getTFeature<int>(feature_idx, vector_idx, value_num, rwflag, block);
296 services::Status releaseBlockOfColumnValues(BlockDescriptor<double>& block) DAAL_C11_OVERRIDE
298 return releaseTFeature<double>(block);
300 services::Status releaseBlockOfColumnValues(BlockDescriptor<float>& block) DAAL_C11_OVERRIDE
302 return releaseTFeature<float>(block);
304 services::Status releaseBlockOfColumnValues(BlockDescriptor<int>& block) DAAL_C11_OVERRIDE
306 return releaseTFeature<int>(block);
310 services::SharedPtr<byte> _ptr;
314 AOSNumericTable(
size_t structSize,
size_t ncol,
size_t nrow, services::Status &st );
316 template<
typename StructDataType>
317 AOSNumericTable(
const services::SharedPtr<StructDataType> &ptr,
size_t ncol,
size_t nrow, services::Status &st) : NumericTable(ncol, nrow, DictionaryIface::notEqual, st)
319 _ptr = services::reinterpretPointerCast<byte, StructDataType>(ptr);
321 _structSize =
sizeof(StructDataType);
326 services::Status allocateDataMemoryImpl(daal::MemType type = daal::dram) DAAL_C11_OVERRIDE
330 services::Status s = createOffsetsFromDictionary();
334 freeDataMemoryImpl();
336 const size_t size = _structSize * getNumberOfRows();
339 return services::Status(getNumberOfRows() == 0 ? services::ErrorIncorrectNumberOfObservations :
340 services::ErrorIncorrectNumberOfFeatures);
342 _ptr = services::SharedPtr<byte>((byte *)daal::services::daal_malloc(size), services::ServiceDeleter());
344 return services::Status(services::ErrorMemoryAllocationFailed);
346 _memStatus = internallyAllocated;
347 return services::Status();
350 bool checkOffsets()
const
352 if (!_offsets)
return true;
354 const size_t ncols = getNumberOfColumns();
356 size_t sizeOfRowInDict = 0;
357 for(
size_t i = 0; i < ncols; ++i )
359 if (!(*_ddict)[i].typeSize)
363 sizeOfRowInDict += (*_ddict)[i].typeSize;
365 if (sizeOfRowInDict > _structSize)
370 for(
size_t i = 1; i < ncols; ++i )
372 if ( _offsets[i-1] >= _offsets[i] )
380 services::Status createOffsetsFromDictionary()
382 const size_t ncols = getNumberOfColumns();
385 daal::services::daal_free(_offsets);
387 _offsets = (
size_t *)daal::services::daal_malloc(
sizeof(
size_t) * (ncols));
389 return services::Status(services::ErrorMemoryAllocationFailed);
392 for(
size_t i = 0; i < ncols; ++i )
394 _offsets[i] = offset;
395 offset += (*_ddict)[i].typeSize;
397 _structSize = offset;
399 return services::Status();
402 void freeDataMemoryImpl() DAAL_C11_OVERRIDE
404 _ptr = services::SharedPtr<byte>();
405 _memStatus = notAllocated;
409 template<
typename Archive,
bool onDeserialize>
410 services::Status serialImpl( Archive *arch )
412 NumericTable::serialImpl<Archive, onDeserialize>( arch );
413 arch->set(_structSize);
419 arch->set((
char*)_offsets, getNumberOfColumns() *
sizeof(
size_t));
423 allocateDataMemoryImpl();
426 size_t size = getNumberOfRows();
428 arch->set( (
char *)_ptr.get(), size * _structSize );
430 return services::Status();
435 template <
typename T>
436 services::Status getTBlock(
size_t idx,
size_t nrows,
int rwFlag, BlockDescriptor<T>& block)
438 size_t ncols = getNumberOfColumns();
439 size_t nobs = getNumberOfRows();
440 block.setDetails( 0, idx, rwFlag );
444 block.resizeBuffer( ncols, 0 );
445 return services::Status();
448 nrows = ( idx + nrows < nobs ) ? nrows : nobs - idx;
450 if( !block.resizeBuffer( ncols, nrows ) )
451 return services::Status(services::ErrorMemoryAllocationFailed);
453 if( !(rwFlag & (
int)readOnly) )
454 return services::Status();
456 char *ptr = (
char *)(_ptr.get()) + _structSize * idx;
458 for(
size_t j = 0 ; j < ncols ; j++ )
460 NumericTableFeature &f = (*_ddict)[j];
462 char *location = ptr + _offsets[j];
464 T* blockPtr = block.getBlockPtr();
466 internal::getVectorStrideUpCast(f.indexType, internal::getConversionDataType<T>())
467 ( nrows, location, _structSize, blockPtr + j,
sizeof(T)*ncols );
469 return services::Status();
472 template <
typename T>
473 services::Status releaseTBlock( BlockDescriptor<T>& block )
475 if(block.getRWFlag() & (int)writeOnly)
477 size_t ncols = getNumberOfColumns();
479 char *ptr = (
char *)(_ptr.get()) + _structSize * block.getRowsOffset();
481 T* blockPtr = block.getBlockPtr();
483 for(
size_t j = 0 ; j < ncols ; j++ )
485 NumericTableFeature &f = (*_ddict)[j];
487 char *location = ptr + _offsets[j];
489 internal::getVectorStrideDownCast(f.indexType, internal::getConversionDataType<T>())
490 ( block.getNumberOfRows(), blockPtr + j,
sizeof(T)*ncols, location, _structSize );
494 return services::Status();
497 template <
typename T>
498 services::Status getTFeature(
size_t feat_idx,
size_t idx,
size_t nrows,
int rwFlag, BlockDescriptor<T>& block)
500 size_t ncols = getNumberOfColumns();
501 size_t nobs = getNumberOfRows();
502 block.setDetails( feat_idx, idx, rwFlag );
506 block.resizeBuffer( 1, 0 );
507 return services::Status();
510 nrows = ( idx + nrows < nobs ) ? nrows : nobs - idx;
512 if( !block.resizeBuffer( 1, nrows ) )
513 return services::Status(services::ErrorMemoryAllocationFailed);
515 if((block.getRWFlag() & (int)readOnly))
517 NumericTableFeature &f = (*_ddict)[feat_idx];
518 char *ptr = (
char *)(_ptr.get()) + _structSize * idx + _offsets[feat_idx];
519 internal::getVectorStrideUpCast(f.indexType, internal::getConversionDataType<T>())
520 (nrows, ptr, _structSize, block.getBlockPtr(),
sizeof(T));
522 return services::Status();
525 template <
typename T>
526 services::Status releaseTFeature( BlockDescriptor<T>& block )
528 if (block.getRWFlag() & (int)writeOnly)
530 size_t feat_idx = block.getColumnsOffset();
532 NumericTableFeature &f = (*_ddict)[feat_idx];
534 char *ptr = (
char *)(_ptr.get()) + _structSize * block.getRowsOffset() + _offsets[feat_idx];
536 internal::getVectorStrideDownCast(f.indexType, internal::getConversionDataType<T>())
537 ( block.getNumberOfRows(), block.getBlockPtr(),
sizeof(T), ptr, _structSize );
540 return services::Status();
543 services::Status initOffsets()
545 const size_t ncols = getNumberOfColumns();
548 _offsets = (
size_t *)daal::services::daal_malloc(
sizeof(
size_t) * (ncols));
550 return services::Status(services::ErrorMemoryAllocationFailed);
551 for(
size_t i = 0; i < ncols; ++i ) _offsets[i] = 0;
557 return services::Status();
560 typedef services::SharedPtr<AOSNumericTable> AOSNumericTablePtr;
563 using interface1::AOSNumericTable;
564 using interface1::AOSNumericTablePtr;
daal::data_management::interface1::AOSNumericTable::getArray
const void * getArray() const
Definition: aos_numeric_table.h:191
daal::data_management::interface1::AOSNumericTable::releaseBlockOfColumnValues
services::Status releaseBlockOfColumnValues(BlockDescriptor< int > &block) DAAL_C11_OVERRIDE
Definition: aos_numeric_table.h:304
daal::data_management::interface1::AOSNumericTable::getArraySharedPtr
services::SharedPtr< byte > getArraySharedPtr()
Definition: aos_numeric_table.h:200
daal::algorithms::multivariate_outlier_detection::location
Definition: outlier_detection_multivariate_types.h:74
daal::services::ErrorIncorrectNumberOfObservations
Definition: error_indexes.h:73
daal::data_management::interface1::NumericTable
Class for a data management component responsible for representation of data in the numeric format...
Definition: numeric_table.h:577
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:254
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:107
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:290
daal::MemType
MemType
Definition: daal_defines.h:147
daal::data_management::interface1::AOSNumericTable::setOffset
void setOffset(size_t idx, size_t offset)
Definition: aos_numeric_table.h:242
daal::data_management::interface1::AOSNumericTable::AOSNumericTable
AOSNumericTable(const services::SharedPtr< StructDataType > &ptr, size_t ncol, size_t nrow=0)
Definition: aos_numeric_table.h:89
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:56
daal::data_management::interface1::AOSNumericTable::releaseBlockOfColumnValues
services::Status releaseBlockOfColumnValues(BlockDescriptor< float > &block) DAAL_C11_OVERRIDE
Definition: aos_numeric_table.h:300
daal::data_management::interface1::AOSNumericTable::setArray
services::Status setArray(const services::SharedPtr< byte > &ptr, size_t obsnum=0)
Definition: aos_numeric_table.h:171
daal::data_management::interface1::AOSNumericTable::setArray
services::Status setArray(void *const ptr, size_t obsnum=0)
Definition: aos_numeric_table.h:159
daal::data_management::interface1::AOSNumericTable::releaseBlockOfRows
services::Status releaseBlockOfRows(BlockDescriptor< double > &block) DAAL_C11_OVERRIDE
Definition: aos_numeric_table.h:267
daal::dram
Definition: daal_defines.h:149
daal::services::daal_malloc
DAAL_EXPORT void * daal_malloc(size_t size, size_t alignment=DAAL_MALLOC_DEFAULT_ALIGNMENT)
daal::services::ErrorIncorrectDataRange
Definition: error_indexes.h:79
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:285
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:188
daal::data_management::interface1::BlockDescriptor
Base class that manages buffer memory for read/write operations required by numeric tables...
Definition: numeric_table.h:57
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:138
daal::services::daal_free
DAAL_EXPORT void daal_free(void *ptr)
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:258
daal::services::ErrorMemoryAllocationFailed
Definition: error_indexes.h:150
daal::services::ErrorIncorrectNumberOfFeatures
Definition: error_indexes.h:72
daal::data_management::interface1::AOSNumericTable::releaseBlockOfRows
services::Status releaseBlockOfRows(BlockDescriptor< int > &block) DAAL_C11_OVERRIDE
Definition: aos_numeric_table.h:275
daal::data_management::interface1::AOSNumericTable::releaseBlockOfRows
services::Status releaseBlockOfRows(BlockDescriptor< float > &block) DAAL_C11_OVERRIDE
Definition: aos_numeric_table.h:271
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:262
daal::data_management::interface1::AOSNumericTable::getArray
void * getArray()
Definition: aos_numeric_table.h:182
daal::algorithms::implicit_als::training::offset
Definition: implicit_als_training_types.h:150
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:280
daal::data_management::interface1::AOSNumericTable::AOSNumericTable
AOSNumericTable(StructDataType *ptr, size_t ncol, size_t nrow=0)
Definition: aos_numeric_table.h:120
daal::data_management::interface1::AOSNumericTable::releaseBlockOfColumnValues
services::Status releaseBlockOfColumnValues(BlockDescriptor< double > &block) DAAL_C11_OVERRIDE
Definition: aos_numeric_table.h:296
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:214