24 #ifndef __SOA_NUMERIC_TABLE_H__
25 #define __SOA_NUMERIC_TABLE_H__
27 #include "data_management/data/numeric_table.h"
28 #include "data_management/data/internal/conversion.h"
32 namespace data_management
46 class DAAL_EXPORT SOANumericTable :
public NumericTable
49 DECLARE_SERIALIZABLE_TAG();
50 DECLARE_SERIALIZABLE_IMPL();
59 SOANumericTable(
size_t nColumns = 0,
size_t nRows = 0, DictionaryIface::FeaturesEqual featuresEqual = DictionaryIface::notEqual);
69 static services::SharedPtr<SOANumericTable> create(
size_t nColumns = 0,
size_t nRows = 0,
70 DictionaryIface::FeaturesEqual featuresEqual = DictionaryIface::notEqual,
71 services::Status *stat = NULL);
80 DAAL_DEPRECATED SOANumericTable( NumericTableDictionary *ddict,
size_t nRows, AllocationFlag memoryAllocationFlag = notAllocate ):
81 NumericTable(NumericTableDictionaryPtr(ddict, services::EmptyDeleter())),
82 _arraysInitialized(0), _partialMemStatus(notAllocated)
87 this->_status |= setNumberOfRowsImpl(nRows);
88 if (!resizePointersArray(getNumberOfColumns()))
90 this->_status.add(services::ErrorMemoryAllocationFailed);
93 if( memoryAllocationFlag == doAllocate )
95 this->_status |= allocateDataMemoryImpl();
106 SOANumericTable( NumericTableDictionaryPtr ddict,
size_t nRows, AllocationFlag memoryAllocationFlag = notAllocate );
116 static services::SharedPtr<SOANumericTable> create(NumericTableDictionaryPtr ddict,
size_t nRows,
117 AllocationFlag memoryAllocationFlag = notAllocate,
118 services::Status *stat = NULL);
120 virtual ~SOANumericTable()
122 freeDataMemoryImpl();
125 daal::services::daal_free(_arrOffsets);
137 services::Status setArray(
const services::SharedPtr<T> &ptr,
size_t idx)
139 if( _partialMemStatus != notAllocated && _partialMemStatus != userAllocated )
141 return services::Status(services::ErrorIncorrectNumberOfFeatures);
144 if( idx < getNumberOfColumns() && idx < _arrays.size() )
146 _ddict->setFeature<T>(idx);
148 if( !_arrays[idx] && ptr )
150 _arraysInitialized++;
153 if( _arrays[idx] && !ptr )
155 _arraysInitialized--;
158 _arrays[idx] = services::reinterpretPointerCast<byte, T>(ptr);
162 return services::Status(services::ErrorIncorrectNumberOfFeatures);
165 _partialMemStatus = userAllocated;
167 if(_arraysInitialized == getNumberOfColumns())
169 _memStatus = userAllocated;
171 DAAL_CHECK_STATUS_VAR(generatesOffsets())
172 return services::Status();
182 services::Status setArray(T *ptr,
size_t idx)
184 return setArray(services::SharedPtr<T>(ptr, services::EmptyDeleter()), idx);
192 services::SharedPtr<byte> getArraySharedPtr(
size_t idx)
194 if( idx < _ddict->getNumberOfFeatures() )
200 this->_status.add(services::ErrorIncorrectNumberOfFeatures);
201 return services::SharedPtr<byte>();
210 void *getArray(
size_t idx)
212 return getArraySharedPtr(idx).get();
215 services::Status getBlockOfRows(
size_t vector_idx,
size_t vector_num, ReadWriteMode rwflag, BlockDescriptor<double>& block) DAAL_C11_OVERRIDE
217 return getTBlock<double>(vector_idx, vector_num, rwflag, block);
219 services::Status getBlockOfRows(
size_t vector_idx,
size_t vector_num, ReadWriteMode rwflag, BlockDescriptor<float>& block) DAAL_C11_OVERRIDE
221 return getTBlock<float>(vector_idx, vector_num, rwflag, block);
223 services::Status getBlockOfRows(
size_t vector_idx,
size_t vector_num, ReadWriteMode rwflag, BlockDescriptor<int>& block) DAAL_C11_OVERRIDE
225 return getTBlock<int>(vector_idx, vector_num, rwflag, block);
228 services::Status releaseBlockOfRows(BlockDescriptor<double>& block) DAAL_C11_OVERRIDE
230 return releaseTBlock<double>(block);
232 services::Status releaseBlockOfRows(BlockDescriptor<float>& block) DAAL_C11_OVERRIDE
234 return releaseTBlock<float>(block);
236 services::Status releaseBlockOfRows(BlockDescriptor<int>& block) DAAL_C11_OVERRIDE
238 return releaseTBlock<int>(block);
241 services::Status getBlockOfColumnValues(
size_t feature_idx,
size_t vector_idx,
size_t value_num,
242 ReadWriteMode rwflag, BlockDescriptor<double>& block) DAAL_C11_OVERRIDE
244 return getTFeature<double>(feature_idx, vector_idx, value_num, rwflag, block);
246 services::Status getBlockOfColumnValues(
size_t feature_idx,
size_t vector_idx,
size_t value_num,
247 ReadWriteMode rwflag, BlockDescriptor<float>& block) DAAL_C11_OVERRIDE
249 return getTFeature<float>(feature_idx, vector_idx, value_num, rwflag, block);
251 services::Status getBlockOfColumnValues(
size_t feature_idx,
size_t vector_idx,
size_t value_num,
252 ReadWriteMode rwflag, BlockDescriptor<int>& block) DAAL_C11_OVERRIDE
254 return getTFeature<int>(feature_idx, vector_idx, value_num, rwflag, block);
257 services::Status releaseBlockOfColumnValues(BlockDescriptor<double>& block) DAAL_C11_OVERRIDE
259 return releaseTFeature<double>(block);
261 services::Status releaseBlockOfColumnValues(BlockDescriptor<float>& block) DAAL_C11_OVERRIDE
263 return releaseTFeature<float>(block);
265 services::Status releaseBlockOfColumnValues(BlockDescriptor<int>& block) DAAL_C11_OVERRIDE
267 return releaseTFeature<int>(block);
270 DAAL_DEPRECATED_VIRTUAL services::Status setDictionary( NumericTableDictionary *ddict ) DAAL_C11_OVERRIDE
273 DAAL_CHECK_STATUS(s, NumericTable::setDictionary( ddict ));
275 size_t ncol = ddict->getNumberOfFeatures();
277 if( !resizePointersArray( ncol ) )
279 return services::Status(services::ErrorMemoryAllocationFailed);
286 SOANumericTable(
size_t nColumns,
size_t nRows, DictionaryIface::FeaturesEqual featuresEqual, services::Status &st );
288 SOANumericTable( NumericTableDictionaryPtr ddict,
size_t nRows, AllocationFlag memoryAllocationFlag, services::Status &st );
290 services::Collection<services::SharedPtr<byte> > _arrays;
291 size_t _arraysInitialized;
292 MemoryStatus _partialMemStatus;
293 DAAL_INT64 * _arrOffsets;
296 bool resizePointersArray(
size_t nColumns)
298 if( _arrays.size() >= nColumns )
301 for(
size_t i = 0; i < nColumns; i++)
303 counter += (_arrays[i] != 0);
305 _arraysInitialized = counter;
307 if( _arraysInitialized == nColumns )
309 _memStatus = _partialMemStatus;
313 _memStatus = notAllocated;
318 _arrays.resize(nColumns);
319 _memStatus = notAllocated;
321 bool is_resized = _arrays.resize(nColumns);
324 _memStatus = notAllocated;
329 daal::services::daal_free(_arrOffsets);
337 services::Status setNumberOfColumnsImpl(
size_t ncol) DAAL_C11_OVERRIDE
340 DAAL_CHECK_STATUS(s, NumericTable::setNumberOfColumnsImpl(ncol));
342 if( !resizePointersArray( ncol ) )
344 return services::Status(services::ErrorMemoryAllocationFailed);
349 services::Status allocateDataMemoryImpl(daal::MemType type = daal::dram) DAAL_C11_OVERRIDE
351 freeDataMemoryImpl();
353 size_t ncol = _ddict->getNumberOfFeatures();
354 size_t nrows = getNumberOfRows();
356 if( ncol * nrows == 0 )
360 return services::Status(services::ErrorIncorrectNumberOfObservations);
364 return services::Status(services::ErrorIncorrectNumberOfFeatures);
368 for(
size_t i = 0; i < ncol; i++)
370 NumericTableFeature f = (*_ddict)[i];
371 if( f.typeSize != 0 )
373 _arrays[i] = services::SharedPtr<byte>((byte *)daal::services::daal_malloc( f.typeSize * nrows ), services::ServiceDeleter());
374 _arraysInitialized++;
378 freeDataMemoryImpl();
379 return services::Status(services::ErrorMemoryAllocationFailed);
383 if(_arraysInitialized > 0)
385 _partialMemStatus = internallyAllocated;
388 if(_arraysInitialized == ncol)
390 _memStatus = internallyAllocated;
392 DAAL_CHECK_STATUS_VAR(generatesOffsets())
393 return services::Status();
396 void freeDataMemoryImpl() DAAL_C11_OVERRIDE
399 _arrays.resize(_ddict->getNumberOfFeatures());
400 _arraysInitialized = 0;
402 _partialMemStatus = notAllocated;
403 _memStatus = notAllocated;
406 template<
typename Archive,
bool onDeserialize>
407 services::Status serialImpl( Archive *arch )
409 NumericTable::serialImpl<Archive, onDeserialize>( arch );
413 allocateDataMemoryImpl();
416 size_t ncol = _ddict->getNumberOfFeatures();
417 size_t nrows = getNumberOfRows();
419 for(
size_t i = 0; i < ncol; i++)
421 NumericTableFeature f = (*_ddict)[i];
422 void *ptr = getArraySharedPtr(i).get();
424 arch->set( (
char *)ptr, nrows * f.typeSize );
427 return services::Status();
431 services::Status generatesOffsets()
435 if (isAllCompleted()) DAAL_CHECK_STATUS_VAR(searchMinPointer());
438 return services::Status();
441 bool isAllCompleted()
const
443 size_t ncols = getNumberOfColumns();
445 for (
size_t i = 0; i < ncols; ++i)
447 if (!_arrays[i].
get())
return false;
453 services::Status searchMinPointer()
455 size_t ncols = getNumberOfColumns();
457 if (_arrOffsets) daal::services::daal_free(_arrOffsets);
459 _arrOffsets = (DAAL_INT64 *)daal::services::daal_malloc(ncols *
sizeof(DAAL_INT64));
460 DAAL_CHECK_MALLOC(_arrOffsets)
462 char * ptrMin = (
char *)_arrays[0].get();
465 for (
size_t i = 1; i < ncols; ++i)
467 if ((
char *)_arrays[i].
get() < ptrMin)
470 ptrMin = (
char *)_arrays[i].
get();
475 for (
size_t i = 0; i < ncols; ++i)
477 char * pv = (
char *)(_arrays[i].
get());
478 _arrOffsets[i] = (DAAL_INT64)(pv - ptrMin);
479 DAAL_ASSERT(_arrOffsets[i] >= 0)
482 return services::Status();
486 bool isHomogeneous()
const
488 size_t ncols = getNumberOfColumns();
490 NumericTableFeature & f0 = (*_ddict)[0];
492 for (
size_t i = 0; i < ncols; ++i)
494 NumericTableFeature & f1 = (*_ddict)[i];
496 if (f1.indexType != f0.indexType)
return false;
499 return (
int)f0.indexType == (int)internal::getConversionDataType<float>()
500 || (int)f0.indexType == (
int)internal::getConversionDataType<double>();
503 template <
typename T>
504 services::Status getTBlock(
size_t idx,
size_t nrows, ReadWriteMode rwFlag, BlockDescriptor<T> & block)
506 size_t ncols = getNumberOfColumns();
507 size_t nobs = getNumberOfRows();
508 block.setDetails(0, idx, rwFlag);
512 block.resizeBuffer(ncols, 0);
513 return services::Status();
516 nrows = (idx + nrows < nobs) ? nrows : nobs - idx;
518 if (!block.resizeBuffer(ncols, nrows))
520 return services::Status(services::ErrorMemoryAllocationFailed);
523 if (!(block.getRWFlag() & (int)readOnly))
return services::Status();
525 T * buffer = block.getBlockPtr();
526 bool computed =
false;
530 NumericTableFeature & f = (*_ddict)[0];
532 if ((
int)internal::getConversionDataType<T>() == (
int)f.indexType)
534 DAAL_CHECK(_arrOffsets, services::ErrorNullPtr)
535 T const * ptrMin = (T *)(_arrays[_index].get()) + idx;
536 computed = data_management::internal::getVector<T>()(nrows, ncols, buffer, ptrMin, _arrOffsets);
544 for (
size_t i = 0; i < nrows; i += di)
551 for (
size_t j = 0; j < ncols; ++j)
553 NumericTableFeature & f = (*_ddict)[j];
555 char * ptr = (
char *)_arrays[j].
get() + (idx + i) * f.typeSize;
557 internal::getVectorUpCast(f.indexType, internal::getConversionDataType<T>())(di, ptr, lbuf);
559 for (
size_t k = 0; k < di; ++k)
561 buffer[(i + k) * ncols + j] = lbuf[k];
567 return services::Status();
570 template <
typename T>
571 services::Status releaseTBlock( BlockDescriptor<T>& block )
573 if(block.getRWFlag() & (int)writeOnly)
575 size_t ncols = getNumberOfColumns();
576 size_t nrows = block.getNumberOfRows();
577 size_t idx = block.getRowsOffset();
582 T *blockPtr = block.getBlockPtr();
584 for(
size_t i = 0 ; i < nrows ; i += di )
586 if( i + di > nrows ) { di = nrows - i; }
588 for(
size_t j = 0 ; j < ncols ; j++ )
590 NumericTableFeature &f = (*_ddict)[j];
592 char *ptr = (
char *)_arrays[j].
get() + (idx + i) * f.typeSize;
594 for(
size_t ii = 0 ; ii < di; ii++ )
596 lbuf[ii] = blockPtr[ (i + ii) * ncols + j ];
599 internal::getVectorDownCast(f.indexType, internal::getConversionDataType<T>())
605 return services::Status();
608 template <
typename T>
609 services::Status getTFeature(
size_t feat_idx,
size_t idx,
size_t nrows,
int rwFlag, BlockDescriptor<T>& block )
611 size_t ncols = getNumberOfColumns();
612 size_t nobs = getNumberOfRows();
613 block.setDetails( feat_idx, idx, rwFlag );
617 block.resizeBuffer( 1, 0 );
618 return services::Status();
621 nrows = ( idx + nrows < nobs ) ? nrows : nobs - idx;
623 NumericTableFeature &f = (*_ddict)[feat_idx];
625 if( features::internal::getIndexNumType<T>() == f.indexType )
627 block.setPtr(&(_arrays[feat_idx]), _arrays[feat_idx].
get() + idx * f.typeSize , 1, nrows );
631 byte *location = _arrays[feat_idx].get() + idx * f.typeSize;
633 if( !block.resizeBuffer( 1, nrows ) )
635 return services::Status(services::ErrorMemoryAllocationFailed);
638 if( !(block.getRWFlag() & (int)readOnly) )
return services::Status();
640 internal::getVectorUpCast(f.indexType, internal::getConversionDataType<T>())
641 ( nrows, location, block.getBlockPtr() );
643 return services::Status();
646 template <
typename T>
647 services::Status releaseTFeature( BlockDescriptor<T>& block )
649 if (block.getRWFlag() & (int)writeOnly)
651 size_t feat_idx = block.getColumnsOffset();
653 NumericTableFeature &f = (*_ddict)[feat_idx];
655 if( features::internal::getIndexNumType<T>() != f.indexType )
657 char *ptr = (
char *)_arrays[feat_idx].
get() + block.getRowsOffset() * f.typeSize;
659 internal::getVectorDownCast(f.indexType, internal::getConversionDataType<T>())
660 ( block.getNumberOfRows(), block.getBlockPtr(), ptr );
664 return services::Status();
667 typedef services::SharedPtr<SOANumericTable> SOANumericTablePtr;
670 using interface1::SOANumericTable;
671 using interface1::SOANumericTablePtr;
daal::data_management::interface1::SOANumericTable::releaseBlockOfRows
services::Status releaseBlockOfRows(BlockDescriptor< float > &block) DAAL_C11_OVERRIDE
Definition: soa_numeric_table.h:232
daal::data_management::interface1::SOANumericTable::setDictionary
DAAL_DEPRECATED_VIRTUAL services::Status setDictionary(NumericTableDictionary *ddict) DAAL_C11_OVERRIDE
Definition: soa_numeric_table.h:270
daal::data_management::interface1::SOANumericTable
Class that provides methods to access data stored as a structure of arrays, where each (contiguous) a...
Definition: soa_numeric_table.h:46
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::SOANumericTable::getArraySharedPtr
services::SharedPtr< byte > getArraySharedPtr(size_t idx)
Definition: soa_numeric_table.h:192
daal::data_management::interface1::SOANumericTable::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: soa_numeric_table.h:251
daal::data_management::interface1::Dictionary
Class that represents a dictionary of a data set and provides methods to work with the data dictionar...
Definition: data_dictionary.h:163
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::services::ErrorNullPtr
Definition: error_indexes.h:141
daal::data_management::interface1::SOANumericTable::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: soa_numeric_table.h:246
daal::data_management::interface1::SOANumericTable::releaseBlockOfColumnValues
services::Status releaseBlockOfColumnValues(BlockDescriptor< int > &block) DAAL_C11_OVERRIDE
Definition: soa_numeric_table.h:265
daal::data_management::interface1::SOANumericTable::setArray
services::Status setArray(T *ptr, size_t idx)
Definition: soa_numeric_table.h:182
daal::MemType
MemType
Definition: daal_defines.h:147
daal::data_management::interface1::NumericTable::setDictionary
virtual DAAL_DEPRECATED_VIRTUAL services::Status setDictionary(NumericTableDictionary *ddict) DAAL_C11_OVERRIDE
Definition: numeric_table.h:627
daal::data_management::interface1::SOANumericTable::getArray
void * getArray(size_t idx)
Definition: soa_numeric_table.h:210
daal::data_management::interface1::SOANumericTable::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: soa_numeric_table.h:241
daal::data_management::interface1::SOANumericTable::releaseBlockOfColumnValues
services::Status releaseBlockOfColumnValues(BlockDescriptor< float > &block) DAAL_C11_OVERRIDE
Definition: soa_numeric_table.h:261
daal::data_management::interface1::NumericTableIface::AllocationFlag
AllocationFlag
Enumeration to specify whether the Numeric Table must allocate memory.
Definition: numeric_table.h:285
daal::data_management::interface1::SOANumericTable::getBlockOfRows
services::Status getBlockOfRows(size_t vector_idx, size_t vector_num, ReadWriteMode rwflag, BlockDescriptor< double > &block) DAAL_C11_OVERRIDE
Definition: soa_numeric_table.h:215
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::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::SOANumericTable::SOANumericTable
DAAL_DEPRECATED SOANumericTable(NumericTableDictionary *ddict, size_t nRows, AllocationFlag memoryAllocationFlag=notAllocate)
Definition: soa_numeric_table.h:80
daal::services::daal_free
DAAL_EXPORT void daal_free(void *ptr)
daal::services::ErrorMemoryAllocationFailed
Definition: error_indexes.h:150
daal::services::ErrorIncorrectNumberOfFeatures
Definition: error_indexes.h:72
daal::data_management::interface1::SOANumericTable::releaseBlockOfRows
services::Status releaseBlockOfRows(BlockDescriptor< double > &block) DAAL_C11_OVERRIDE
Definition: soa_numeric_table.h:228
daal::data_management::interface1::SOANumericTable::setArray
services::Status setArray(const services::SharedPtr< T > &ptr, size_t idx)
Definition: soa_numeric_table.h:137
daal::data_management::interface1::SOANumericTable::releaseBlockOfRows
services::Status releaseBlockOfRows(BlockDescriptor< int > &block) DAAL_C11_OVERRIDE
Definition: soa_numeric_table.h:236
daal::data_management::interface1::SOANumericTable::getBlockOfRows
services::Status getBlockOfRows(size_t vector_idx, size_t vector_num, ReadWriteMode rwflag, BlockDescriptor< float > &block) DAAL_C11_OVERRIDE
Definition: soa_numeric_table.h:219
daal::data_management::interface1::SOANumericTable::getBlockOfRows
services::Status getBlockOfRows(size_t vector_idx, size_t vector_num, ReadWriteMode rwflag, BlockDescriptor< int > &block) DAAL_C11_OVERRIDE
Definition: soa_numeric_table.h:223
daal::data_management::interface1::SOANumericTable::releaseBlockOfColumnValues
services::Status releaseBlockOfColumnValues(BlockDescriptor< double > &block) DAAL_C11_OVERRIDE
Definition: soa_numeric_table.h:257