48 #ifndef __AOS_NUMERIC_TABLE_H__
49 #define __AOS_NUMERIC_TABLE_H__
51 #include "data_management/data/data_serialize.h"
52 #include "data_management/data/numeric_table.h"
53 #include "services/daal_defines.h"
57 namespace data_management
63 #define DAAL_STRUCT_MEMBER_OFFSET(class_name, member_name) \
64 ((ptrdiff_t)&(reinterpret_cast<class_name*>(0x1000)->member_name) - 0x1000)
79 class DAAL_EXPORT AOSNumericTable :
public NumericTable
82 DECLARE_SERIALIZABLE_TAG();
83 DECLARE_SERIALIZABLE_IMPL();
92 AOSNumericTable(
size_t structSize = 0,
size_t ncol = 0,
size_t nrow = 0 );
102 static services::SharedPtr<AOSNumericTable> create(
size_t structSize = 0,
size_t ncol = 0,
size_t nrow = 0, services::Status *stat = NULL);
111 template<
typename StructDataType>
112 AOSNumericTable(
const services::SharedPtr<StructDataType> &ptr,
size_t ncol,
size_t nrow = 0 ): NumericTable(ncol, nrow)
114 _ptr = services::reinterpretPointerCast<byte, StructDataType>(ptr);
116 _structSize =
sizeof(StructDataType);
129 template<
typename StructDataType>
130 static services::SharedPtr<AOSNumericTable> create(
const services::SharedPtr<StructDataType> &ptr,
size_t ncol,
size_t nrow = 0, services::Status *stat = NULL )
132 DAAL_DEFAULT_CREATE_IMPL_EX(AOSNumericTable, ptr, ncol, nrow);
142 template<
typename StructDataType>
143 AOSNumericTable( StructDataType *ptr,
size_t ncol,
size_t nrow = 0 ): NumericTable(ncol, nrow)
145 _ptr = services::SharedPtr<byte>((byte*)ptr, services::EmptyDeleter());
147 _structSize =
sizeof(StructDataType);
160 template<
typename StructDataType>
161 static services::SharedPtr<AOSNumericTable> create( StructDataType *ptr,
size_t ncol,
size_t nrow = 0, services::Status *stat = NULL )
163 return create(services::SharedPtr<StructDataType>(ptr, services::EmptyDeleter()), ncol, nrow);
167 virtual ~AOSNumericTable()
170 daal::services::daal_free(_offsets);
171 freeDataMemoryImpl();
179 services::Status setArray(
void *
const ptr,
size_t obsnum = 0)
181 _ptr = services::SharedPtr<byte>((byte*)ptr, services::EmptyDeleter());
182 _memStatus = userAllocated;
183 return setNumberOfRowsImpl( obsnum );
191 services::Status setArray(
const services::SharedPtr<byte>& ptr,
size_t obsnum = 0)
194 _memStatus = userAllocated;
195 return setNumberOfRowsImpl( obsnum );
204 return (
void *)(_ptr.get());
211 const void *getArray()
const
213 return (
void *)(_ptr.get());
220 services::SharedPtr<byte> getArraySharedPtr()
234 services::Status setFeature(
size_t idx,
size_t offset, data_feature_utils::FeatureType featureType = data_feature_utils::DAAL_CONTINUOUS,
size_t categoryNumber=0)
237 if( _ddict.get() == NULL )
239 _ddict = NumericTableDictionary::create(&s);
243 s = _ddict->setFeature<T>(idx);
245 (*_ddict)[idx].featureType = featureType;
246 (*_ddict)[idx].categoryNumber = categoryNumber;
248 _offsets[idx] = offset;
257 void setOffset(
size_t idx,
size_t offset)
259 _offsets[idx] = offset;
262 services::Status getBlockOfRows(
size_t vector_idx,
size_t vector_num, ReadWriteMode rwflag, BlockDescriptor<double>& block) DAAL_C11_OVERRIDE
264 return getTBlock<double>(vector_idx, vector_num, rwflag, block);
266 services::Status getBlockOfRows(
size_t vector_idx,
size_t vector_num, ReadWriteMode rwflag, BlockDescriptor<float>& block) DAAL_C11_OVERRIDE
268 return getTBlock<float>(vector_idx, vector_num, rwflag, block);
270 services::Status getBlockOfRows(
size_t vector_idx,
size_t vector_num, ReadWriteMode rwflag, BlockDescriptor<int>& block) DAAL_C11_OVERRIDE
272 return getTBlock<int>(vector_idx, vector_num, rwflag, block);
275 services::Status releaseBlockOfRows(BlockDescriptor<double>& block) DAAL_C11_OVERRIDE
277 return releaseTBlock<double>(block);
279 services::Status releaseBlockOfRows(BlockDescriptor<float>& block) DAAL_C11_OVERRIDE
281 return releaseTBlock<float>(block);
283 services::Status releaseBlockOfRows(BlockDescriptor<int>& block) DAAL_C11_OVERRIDE
285 return releaseTBlock<int>(block);
288 services::Status getBlockOfColumnValues(
size_t feature_idx,
size_t vector_idx,
size_t value_num,
289 ReadWriteMode rwflag, BlockDescriptor<double>& block) DAAL_C11_OVERRIDE
291 return getTFeature<double>(feature_idx, vector_idx, value_num, rwflag, block);
293 services::Status getBlockOfColumnValues(
size_t feature_idx,
size_t vector_idx,
size_t value_num,
294 ReadWriteMode rwflag, BlockDescriptor<float>& block) DAAL_C11_OVERRIDE
296 return getTFeature<float>(feature_idx, vector_idx, value_num, rwflag, block);
298 services::Status getBlockOfColumnValues(
size_t feature_idx,
size_t vector_idx,
size_t value_num,
299 ReadWriteMode rwflag, BlockDescriptor<int>& block) DAAL_C11_OVERRIDE
301 return getTFeature<int>(feature_idx, vector_idx, value_num, rwflag, block);
304 services::Status releaseBlockOfColumnValues(BlockDescriptor<double>& block) DAAL_C11_OVERRIDE
306 return releaseTFeature<double>(block);
308 services::Status releaseBlockOfColumnValues(BlockDescriptor<float>& block) DAAL_C11_OVERRIDE
310 return releaseTFeature<float>(block);
312 services::Status releaseBlockOfColumnValues(BlockDescriptor<int>& block) DAAL_C11_OVERRIDE
314 return releaseTFeature<int>(block);
318 services::SharedPtr<byte> _ptr;
322 AOSNumericTable(
size_t structSize,
size_t ncol,
size_t nrow, services::Status &st );
324 template<
typename StructDataType>
325 AOSNumericTable(
const services::SharedPtr<StructDataType> &ptr,
size_t ncol,
size_t nrow, services::Status &st) : NumericTable(ncol, nrow, DictionaryIface::notEqual, st)
327 _ptr = services::reinterpretPointerCast<byte, StructDataType>(ptr);
329 _structSize =
sizeof(StructDataType);
334 services::Status allocateDataMemoryImpl(daal::MemType type = daal::dram) DAAL_C11_OVERRIDE
338 services::Status s = createOffsetsFromDictionary();
342 freeDataMemoryImpl();
344 const size_t size = _structSize * getNumberOfRows();
347 return services::Status(getNumberOfRows() == 0 ? services::ErrorIncorrectNumberOfObservations :
348 services::ErrorIncorrectNumberOfFeatures);
350 _ptr = services::SharedPtr<byte>((byte *)daal::services::daal_malloc(size), services::ServiceDeleter());
352 return services::Status(services::ErrorMemoryAllocationFailed);
354 _memStatus = internallyAllocated;
355 return services::Status();
358 bool checkOffsets()
const
360 if (!_offsets)
return true;
362 const size_t ncols = getNumberOfColumns();
364 size_t sizeOfRowInDict = 0;
365 for(
size_t i = 0; i < ncols; ++i )
367 if (!(*_ddict)[i].typeSize)
371 sizeOfRowInDict += (*_ddict)[i].typeSize;
373 if (sizeOfRowInDict > _structSize)
378 for(
size_t i = 1; i < ncols; ++i )
380 if ( _offsets[i-1] >= _offsets[i] )
388 services::Status createOffsetsFromDictionary()
390 const size_t ncols = getNumberOfColumns();
393 daal::services::daal_free(_offsets);
395 _offsets = (
size_t *)daal::services::daal_malloc(
sizeof(
size_t) * (ncols));
397 return services::Status(services::ErrorMemoryAllocationFailed);
400 for(
size_t i = 0; i < ncols; ++i )
402 _offsets[i] = offset;
403 offset += (*_ddict)[i].typeSize;
405 _structSize = offset;
407 return services::Status();
410 void freeDataMemoryImpl() DAAL_C11_OVERRIDE
412 _ptr = services::SharedPtr<byte>();
413 _memStatus = notAllocated;
417 template<
typename Archive,
bool onDeserialize>
418 services::Status serialImpl( Archive *arch )
420 NumericTable::serialImpl<Archive, onDeserialize>( arch );
421 arch->set(_structSize);
427 arch->set((
char*)_offsets, getNumberOfColumns() *
sizeof(
size_t));
431 allocateDataMemoryImpl();
434 size_t size = getNumberOfRows();
436 arch->set( (
char *)_ptr.get(), size * _structSize );
438 return services::Status();
443 template <
typename T>
444 services::Status getTBlock(
size_t idx,
size_t nrows,
int rwFlag, BlockDescriptor<T>& block)
446 size_t ncols = getNumberOfColumns();
447 size_t nobs = getNumberOfRows();
448 block.setDetails( 0, idx, rwFlag );
452 block.resizeBuffer( ncols, 0 );
453 return services::Status();
456 nrows = ( idx + nrows < nobs ) ? nrows : nobs - idx;
458 if( !block.resizeBuffer( ncols, nrows ) )
459 return services::Status(services::ErrorMemoryAllocationFailed);
461 if( !(rwFlag & (
int)readOnly) )
462 return services::Status();
464 char *ptr = (
char *)(_ptr.get()) + _structSize * idx;
466 for(
size_t j = 0 ; j < ncols ; j++ )
468 NumericTableFeature &f = (*_ddict)[j];
470 char *location = ptr + _offsets[j];
472 T* blockPtr = block.getBlockPtr();
474 data_feature_utils::getVectorStrideUpCast(f.indexType, data_feature_utils::getInternalNumType<T>())
475 ( nrows, location, _structSize, blockPtr + j,
sizeof(T)*ncols );
477 return services::Status();
480 template <
typename T>
481 services::Status releaseTBlock( BlockDescriptor<T>& block )
483 if(block.getRWFlag() & (int)writeOnly)
485 size_t ncols = getNumberOfColumns();
487 char *ptr = (
char *)(_ptr.get()) + _structSize * block.getRowsOffset();
489 T* blockPtr = block.getBlockPtr();
491 for(
size_t j = 0 ; j < ncols ; j++ )
493 NumericTableFeature &f = (*_ddict)[j];
495 char *location = ptr + _offsets[j];
497 data_feature_utils::getVectorStrideDownCast(f.indexType, data_feature_utils::getInternalNumType<T>())
498 ( block.getNumberOfRows(), blockPtr + j,
sizeof(T)*ncols, location, _structSize );
502 return services::Status();
505 template <
typename T>
506 services::Status getTFeature(
size_t feat_idx,
size_t idx,
size_t nrows,
int rwFlag, BlockDescriptor<T>& block)
508 size_t ncols = getNumberOfColumns();
509 size_t nobs = getNumberOfRows();
510 block.setDetails( feat_idx, idx, rwFlag );
514 block.resizeBuffer( 1, 0 );
515 return services::Status();
518 nrows = ( idx + nrows < nobs ) ? nrows : nobs - idx;
520 if( !block.resizeBuffer( 1, nrows ) )
521 return services::Status(services::ErrorMemoryAllocationFailed);
523 if((block.getRWFlag() & (int)readOnly))
525 NumericTableFeature &f = (*_ddict)[feat_idx];
526 char *ptr = (
char *)(_ptr.get()) + _structSize * idx + _offsets[feat_idx];
527 data_feature_utils::getVectorStrideUpCast(f.indexType, data_feature_utils::getInternalNumType<T>())
528 (nrows, ptr, _structSize, block.getBlockPtr(),
sizeof(T));
530 return services::Status();
533 template <
typename T>
534 services::Status releaseTFeature( BlockDescriptor<T>& block )
536 if (block.getRWFlag() & (int)writeOnly)
538 size_t feat_idx = block.getColumnsOffset();
540 NumericTableFeature &f = (*_ddict)[feat_idx];
542 char *ptr = (
char *)(_ptr.get()) + _structSize * block.getRowsOffset() + _offsets[feat_idx];
544 data_feature_utils::getVectorStrideDownCast(f.indexType, data_feature_utils::getInternalNumType<T>())
545 ( block.getNumberOfRows(), block.getBlockPtr(),
sizeof(T), ptr, _structSize );
548 return services::Status();
551 services::Status initOffsets()
553 const size_t ncols = getNumberOfColumns();
556 _offsets = (
size_t *)daal::services::daal_malloc(
sizeof(
size_t) * (ncols));
558 return services::Status(services::ErrorMemoryAllocationFailed);
559 for(
size_t i = 0; i < ncols; ++i ) _offsets[i] = 0;
565 return services::Status();
568 typedef services::SharedPtr<AOSNumericTable> AOSNumericTablePtr;
571 using interface1::AOSNumericTable;
572 using interface1::AOSNumericTablePtr;
daal::data_management::interface1::AOSNumericTable::getArray
const void * getArray() const
Definition: aos_numeric_table.h:211
daal::data_management::interface1::AOSNumericTable::AOSNumericTable
AOSNumericTable(StructDataType *ptr, size_t ncol, size_t nrow=0)
Definition: aos_numeric_table.h:143
daal
Definition: algorithm_base_common.h:57
daal::data_management::interface1::AOSNumericTable::AOSNumericTable
AOSNumericTable(const services::SharedPtr< StructDataType > &ptr, size_t ncol, size_t nrow=0)
Definition: aos_numeric_table.h:112
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:288
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:270
daal::services::ErrorMemoryAllocationFailed
Definition: error_indexes.h:170
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:234
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:298
daal::dram
Definition: daal_defines.h:158
daal::data_management::interface1::AOSNumericTable::releaseBlockOfColumnValues
services::Status releaseBlockOfColumnValues(BlockDescriptor< float > &block) DAAL_C11_OVERRIDE
Definition: aos_numeric_table.h:308
daal::services::ErrorIncorrectNumberOfFeatures
Definition: error_indexes.h:96
daal::algorithms::multivariate_outlier_detection::location
Definition: outlier_detection_multivariate_types.h:98
daal::data_management::interface1::AOSNumericTable::setArray
services::Status setArray(const services::SharedPtr< byte > &ptr, size_t obsnum=0)
Definition: aos_numeric_table.h:191
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:304
daal::data_management::interface1::NumericTable
Class for a data management component responsible for representation of data in the numeric format...
Definition: numeric_table.h:600
daal::data_management::interface1::AOSNumericTable::getArray
void * getArray()
Definition: aos_numeric_table.h:202
daal::data_management::interface1::AOSNumericTable::setOffset
void setOffset(size_t idx, size_t offset)
Definition: aos_numeric_table.h:257
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:79
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:220
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:161
daal::data_management::interface1::AOSNumericTable::releaseBlockOfRows
services::Status releaseBlockOfRows(BlockDescriptor< float > &block) DAAL_C11_OVERRIDE
Definition: aos_numeric_table.h:279
daal::data_management::interface1::AOSNumericTable::setArray
services::Status setArray(void *const ptr, size_t obsnum=0)
Definition: aos_numeric_table.h:179
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:130
daal::data_management::interface1::AOSNumericTable::releaseBlockOfRows
services::Status releaseBlockOfRows(BlockDescriptor< double > &block) DAAL_C11_OVERRIDE
Definition: aos_numeric_table.h:275
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:262
daal::data_management::interface1::BlockDescriptor
Base class that manages buffer memory for read/write operations required by numeric tables...
Definition: numeric_table.h:81
daal::services::ErrorIncorrectNumberOfObservations
Definition: error_indexes.h:97
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:266
daal::algorithms::implicit_als::training::offset
Definition: implicit_als_training_types.h:174
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:209
daal::data_management::interface1::AOSNumericTable::releaseBlockOfColumnValues
services::Status releaseBlockOfColumnValues(BlockDescriptor< int > &block) DAAL_C11_OVERRIDE
Definition: aos_numeric_table.h:312
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:293
daal::MemType
MemType
Definition: daal_defines.h:156
daal::data_management::interface1::AOSNumericTable::releaseBlockOfRows
services::Status releaseBlockOfRows(BlockDescriptor< int > &block) DAAL_C11_OVERRIDE
Definition: aos_numeric_table.h:283