48 #ifndef __SOA_NUMERIC_TABLE_H__
49 #define __SOA_NUMERIC_TABLE_H__
51 #include "data_management/data/numeric_table.h"
55 namespace data_management
69 class DAAL_EXPORT SOANumericTable :
public NumericTable
72 DECLARE_SERIALIZABLE_TAG();
73 DECLARE_SERIALIZABLE_IMPL();
82 SOANumericTable(
size_t nColumns = 0,
size_t nRows = 0, DictionaryIface::FeaturesEqual featuresEqual = DictionaryIface::notEqual);
92 static services::SharedPtr<SOANumericTable> create(
size_t nColumns = 0,
size_t nRows = 0,
93 DictionaryIface::FeaturesEqual featuresEqual = DictionaryIface::notEqual,
94 services::Status *stat = NULL);
103 DAAL_DEPRECATED SOANumericTable( NumericTableDictionary *ddict,
size_t nRows, AllocationFlag memoryAllocationFlag = notAllocate ):
104 NumericTable(NumericTableDictionaryPtr(ddict, services::EmptyDeleter())),
105 _arraysInitialized(0), _partialMemStatus(notAllocated)
108 this->_status |= setNumberOfRowsImpl( nRows );
109 if( !resizePointersArray( getNumberOfColumns() ) )
111 this->_status.add(services::ErrorMemoryAllocationFailed);
114 if( memoryAllocationFlag == doAllocate )
116 this->_status |= allocateDataMemoryImpl();
127 SOANumericTable( NumericTableDictionaryPtr ddict,
size_t nRows, AllocationFlag memoryAllocationFlag = notAllocate );
137 static services::SharedPtr<SOANumericTable> create(NumericTableDictionaryPtr ddict,
size_t nRows,
138 AllocationFlag memoryAllocationFlag = notAllocate,
139 services::Status *stat = NULL);
141 virtual ~SOANumericTable()
143 freeDataMemoryImpl();
153 services::Status setArray(
const services::SharedPtr<T> &ptr,
size_t idx)
155 if( _partialMemStatus != notAllocated && _partialMemStatus != userAllocated )
157 return services::Status(services::ErrorIncorrectNumberOfFeatures);
160 if( idx < getNumberOfColumns() && idx < _arrays.size() )
162 _ddict->setFeature<T>(idx);
164 if( !_arrays[idx] && ptr )
166 _arraysInitialized++;
169 if( _arrays[idx] && !ptr )
171 _arraysInitialized--;
174 _arrays[idx] = services::reinterpretPointerCast<byte, T>(ptr);
178 return services::Status(services::ErrorIncorrectNumberOfFeatures);
181 _partialMemStatus = userAllocated;
183 if(_arraysInitialized == getNumberOfColumns())
185 _memStatus = userAllocated;
187 return services::Status();
197 services::Status setArray(T *ptr,
size_t idx)
199 return setArray(services::SharedPtr<T>(ptr, services::EmptyDeleter()), idx);
207 services::SharedPtr<byte> getArraySharedPtr(
size_t idx)
209 if( idx < _ddict->getNumberOfFeatures() )
215 this->_status.add(services::ErrorIncorrectNumberOfFeatures);
216 return services::SharedPtr<byte>();
225 void *getArray(
size_t idx)
227 return getArraySharedPtr(idx).get();
230 services::Status getBlockOfRows(
size_t vector_idx,
size_t vector_num, ReadWriteMode rwflag, BlockDescriptor<double>& block) DAAL_C11_OVERRIDE
232 return getTBlock<double>(vector_idx, vector_num, rwflag, block);
234 services::Status getBlockOfRows(
size_t vector_idx,
size_t vector_num, ReadWriteMode rwflag, BlockDescriptor<float>& block) DAAL_C11_OVERRIDE
236 return getTBlock<float>(vector_idx, vector_num, rwflag, block);
238 services::Status getBlockOfRows(
size_t vector_idx,
size_t vector_num, ReadWriteMode rwflag, BlockDescriptor<int>& block) DAAL_C11_OVERRIDE
240 return getTBlock<int>(vector_idx, vector_num, rwflag, block);
243 services::Status releaseBlockOfRows(BlockDescriptor<double>& block) DAAL_C11_OVERRIDE
245 return releaseTBlock<double>(block);
247 services::Status releaseBlockOfRows(BlockDescriptor<float>& block) DAAL_C11_OVERRIDE
249 return releaseTBlock<float>(block);
251 services::Status releaseBlockOfRows(BlockDescriptor<int>& block) DAAL_C11_OVERRIDE
253 return releaseTBlock<int>(block);
256 services::Status getBlockOfColumnValues(
size_t feature_idx,
size_t vector_idx,
size_t value_num,
257 ReadWriteMode rwflag, BlockDescriptor<double>& block) DAAL_C11_OVERRIDE
259 return getTFeature<double>(feature_idx, vector_idx, value_num, rwflag, block);
261 services::Status getBlockOfColumnValues(
size_t feature_idx,
size_t vector_idx,
size_t value_num,
262 ReadWriteMode rwflag, BlockDescriptor<float>& block) DAAL_C11_OVERRIDE
264 return getTFeature<float>(feature_idx, vector_idx, value_num, rwflag, block);
266 services::Status getBlockOfColumnValues(
size_t feature_idx,
size_t vector_idx,
size_t value_num,
267 ReadWriteMode rwflag, BlockDescriptor<int>& block) DAAL_C11_OVERRIDE
269 return getTFeature<int>(feature_idx, vector_idx, value_num, rwflag, block);
272 services::Status releaseBlockOfColumnValues(BlockDescriptor<double>& block) DAAL_C11_OVERRIDE
274 return releaseTFeature<double>(block);
276 services::Status releaseBlockOfColumnValues(BlockDescriptor<float>& block) DAAL_C11_OVERRIDE
278 return releaseTFeature<float>(block);
280 services::Status releaseBlockOfColumnValues(BlockDescriptor<int>& block) DAAL_C11_OVERRIDE
282 return releaseTFeature<int>(block);
285 DAAL_DEPRECATED_VIRTUAL services::Status setDictionary( NumericTableDictionary *ddict ) DAAL_C11_OVERRIDE
288 DAAL_CHECK_STATUS(s, NumericTable::setDictionary( ddict ));
290 size_t ncol = ddict->getNumberOfFeatures();
292 if( !resizePointersArray( ncol ) )
294 return services::Status(services::ErrorMemoryAllocationFailed);
301 SOANumericTable(
size_t nColumns,
size_t nRows, DictionaryIface::FeaturesEqual featuresEqual, services::Status &st );
303 SOANumericTable( NumericTableDictionaryPtr ddict,
size_t nRows, AllocationFlag memoryAllocationFlag, services::Status &st );
305 services::Collection<services::SharedPtr<byte> > _arrays;
306 size_t _arraysInitialized;
307 MemoryStatus _partialMemStatus;
309 bool resizePointersArray(
size_t nColumns)
311 if( _arrays.size() >= nColumns )
314 for(
size_t i = 0; i < nColumns; i++)
316 counter += (_arrays[i] != 0);
318 _arraysInitialized = counter;
320 if( _arraysInitialized == nColumns )
322 _memStatus = _partialMemStatus;
326 _memStatus = notAllocated;
331 _arrays.resize(nColumns);
332 _memStatus = notAllocated;
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 return services::Status();
395 void freeDataMemoryImpl() DAAL_C11_OVERRIDE
398 _arrays.resize(_ddict->getNumberOfFeatures());
399 _arraysInitialized = 0;
401 _partialMemStatus = notAllocated;
402 _memStatus = notAllocated;
405 template<
typename Archive,
bool onDeserialize>
406 services::Status serialImpl( Archive *arch )
408 NumericTable::serialImpl<Archive, onDeserialize>( arch );
412 allocateDataMemoryImpl();
415 size_t ncol = _ddict->getNumberOfFeatures();
416 size_t nrows = getNumberOfRows();
418 for(
size_t i = 0; i < ncol; i++)
420 NumericTableFeature f = (*_ddict)[i];
421 void *ptr = getArraySharedPtr(i).get();
423 arch->set( (
char *)ptr, nrows * f.typeSize );
426 return services::Status();
431 template <
typename T>
432 services::Status getTBlock(
size_t idx,
size_t nrows, ReadWriteMode rwFlag, BlockDescriptor<T>& block )
434 size_t ncols = getNumberOfColumns();
435 size_t nobs = getNumberOfRows();
436 block.setDetails( 0, idx, rwFlag );
440 block.resizeBuffer( ncols, 0 );
441 return services::Status();
444 nrows = ( idx + nrows < nobs ) ? nrows : nobs - idx;
446 if( !block.resizeBuffer( ncols, nrows ) )
448 return services::Status(services::ErrorMemoryAllocationFailed);
451 if( !(block.getRWFlag() & (int)readOnly) )
return services::Status();
457 T *buffer = block.getBlockPtr();
459 for(
size_t i = 0 ; i < nrows ; i += di )
461 if( i + di > nrows ) { di = nrows - i; }
463 for(
size_t j = 0 ; j < ncols ; j++ )
465 NumericTableFeature &f = (*_ddict)[j];
467 char *ptr = (
char *)_arrays[j].
get() + (idx + i) * f.typeSize;
469 data_feature_utils::getVectorUpCast(f.indexType, data_feature_utils::getInternalNumType<T>())
472 for(
size_t ii = 0 ; ii < di; ii++ )
474 buffer[ (i + ii)*ncols + j ] = lbuf[ii];
478 return services::Status();
481 template <
typename T>
482 services::Status releaseTBlock( BlockDescriptor<T>& block )
484 if(block.getRWFlag() & (int)writeOnly)
486 size_t ncols = getNumberOfColumns();
487 size_t nrows = block.getNumberOfRows();
488 size_t idx = block.getRowsOffset();
493 T *blockPtr = block.getBlockPtr();
495 for(
size_t i = 0 ; i < nrows ; i += di )
497 if( i + di > nrows ) { di = nrows - i; }
499 for(
size_t j = 0 ; j < ncols ; j++ )
501 NumericTableFeature &f = (*_ddict)[j];
503 char *ptr = (
char *)_arrays[j].
get() + (idx + i) * f.typeSize;
505 for(
size_t ii = 0 ; ii < di; ii++ )
507 lbuf[ii] = blockPtr[ (i + ii) * ncols + j ];
510 data_feature_utils::getVectorDownCast(f.indexType, data_feature_utils::getInternalNumType<T>())
516 return services::Status();
519 template <
typename T>
520 services::Status getTFeature(
size_t feat_idx,
size_t idx,
size_t nrows,
int rwFlag, BlockDescriptor<T>& block )
522 size_t ncols = getNumberOfColumns();
523 size_t nobs = getNumberOfRows();
524 block.setDetails( feat_idx, idx, rwFlag );
528 block.resizeBuffer( 1, 0 );
529 return services::Status();
532 nrows = ( idx + nrows < nobs ) ? nrows : nobs - idx;
534 NumericTableFeature &f = (*_ddict)[feat_idx];
536 if( data_feature_utils::getIndexNumType<T>() == f.indexType )
538 block.setPtr(&(_arrays[feat_idx]), _arrays[feat_idx].
get() + idx * f.typeSize , 1, nrows );
542 byte *location = _arrays[feat_idx].get() + idx * f.typeSize;
544 if( !block.resizeBuffer( 1, nrows ) )
546 return services::Status(services::ErrorMemoryAllocationFailed);
549 if( !(block.getRWFlag() & (int)readOnly) )
return services::Status();
551 data_feature_utils::getVectorUpCast(f.indexType, data_feature_utils::getInternalNumType<T>())
552 ( nrows, location, block.getBlockPtr() );
554 return services::Status();
557 template <
typename T>
558 services::Status releaseTFeature( BlockDescriptor<T>& block )
560 if (block.getRWFlag() & (int)writeOnly)
562 size_t feat_idx = block.getColumnsOffset();
564 NumericTableFeature &f = (*_ddict)[feat_idx];
566 if( data_feature_utils::getIndexNumType<T>() != f.indexType )
568 char *ptr = (
char *)_arrays[feat_idx].
get() + block.getRowsOffset() * f.typeSize;
570 data_feature_utils::getVectorDownCast(f.indexType, data_feature_utils::getInternalNumType<T>())
571 ( block.getNumberOfRows(), block.getBlockPtr(), ptr );
575 return services::Status();
578 typedef services::SharedPtr<SOANumericTable> SOANumericTablePtr;
581 using interface1::SOANumericTable;
582 using interface1::SOANumericTablePtr;
daal::data_management::interface1::NumericTableIface::AllocationFlag
AllocationFlag
Enumeration to specify whether the Numeric Table must allocate memory.
Definition: numeric_table.h:309
daal::data_management::interface1::SOANumericTable::releaseBlockOfColumnValues
services::Status releaseBlockOfColumnValues(BlockDescriptor< double > &block) DAAL_C11_OVERRIDE
Definition: soa_numeric_table.h:272
daal
Definition: algorithm_base_common.h:57
daal::data_management::interface1::SOANumericTable::setArray
services::Status setArray(T *ptr, size_t idx)
Definition: soa_numeric_table.h:197
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:69
daal::data_management::interface1::SOANumericTable::releaseBlockOfColumnValues
services::Status releaseBlockOfColumnValues(BlockDescriptor< float > &block) DAAL_C11_OVERRIDE
Definition: soa_numeric_table.h:276
daal::services::ErrorMemoryAllocationFailed
Definition: error_indexes.h:170
daal::data_management::interface1::SOANumericTable::getArray
void * getArray(size_t idx)
Definition: soa_numeric_table.h:225
daal::dram
Definition: daal_defines.h:158
daal::data_management::interface1::SOANumericTable::SOANumericTable
DAAL_DEPRECATED SOANumericTable(NumericTableDictionary *ddict, size_t nRows, AllocationFlag memoryAllocationFlag=notAllocate)
Definition: soa_numeric_table.h:103
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:230
daal::data_management::interface1::SOANumericTable::releaseBlockOfRows
services::Status releaseBlockOfRows(BlockDescriptor< int > &block) DAAL_C11_OVERRIDE
Definition: soa_numeric_table.h:251
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::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:261
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:238
daal::services::daal_malloc
DAAL_EXPORT void * daal_malloc(size_t size, size_t alignment=DAAL_MALLOC_DEFAULT_ALIGNMENT)
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::SOANumericTable::releaseBlockOfRows
services::Status releaseBlockOfRows(BlockDescriptor< double > &block) DAAL_C11_OVERRIDE
Definition: soa_numeric_table.h:243
daal::data_management::interface1::SOANumericTable::setArray
services::Status setArray(const services::SharedPtr< T > &ptr, size_t idx)
Definition: soa_numeric_table.h:153
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:256
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:234
daal::data_management::interface1::SOANumericTable::releaseBlockOfColumnValues
services::Status releaseBlockOfColumnValues(BlockDescriptor< int > &block) DAAL_C11_OVERRIDE
Definition: soa_numeric_table.h:280
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:266
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::data_management::interface1::DictionaryIface::FeaturesEqual
FeaturesEqual
Enumeration to specify whether the Data Dictionary contains equal features.
Definition: data_dictionary.h:171
daal::services::ErrorIncorrectNumberOfObservations
Definition: error_indexes.h:97
daal::data_management::interface1::SOANumericTable::getArraySharedPtr
services::SharedPtr< byte > getArraySharedPtr(size_t idx)
Definition: soa_numeric_table.h:207
daal::data_management::interface1::SOANumericTable::releaseBlockOfRows
services::Status releaseBlockOfRows(BlockDescriptor< float > &block) DAAL_C11_OVERRIDE
Definition: soa_numeric_table.h:247
daal::data_management::interface1::NumericTable::setDictionary
virtual DAAL_DEPRECATED_VIRTUAL services::Status setDictionary(NumericTableDictionary *ddict) DAAL_C11_OVERRIDE
Definition: numeric_table.h:650
daal::MemType
MemType
Definition: daal_defines.h:156
daal::data_management::interface1::SOANumericTable::setDictionary
DAAL_DEPRECATED_VIRTUAL services::Status setDictionary(NumericTableDictionary *ddict) DAAL_C11_OVERRIDE
Definition: soa_numeric_table.h:285
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:184