22 #ifndef __SOA_NUMERIC_TABLE_H__
23 #define __SOA_NUMERIC_TABLE_H__
25 #include "data_management/data/numeric_table.h"
29 namespace data_management
43 class DAAL_EXPORT SOANumericTable :
public NumericTable
46 DECLARE_SERIALIZABLE_TAG();
47 DECLARE_SERIALIZABLE_IMPL();
56 SOANumericTable(
size_t nColumns = 0,
size_t nRows = 0, DictionaryIface::FeaturesEqual featuresEqual = DictionaryIface::notEqual);
66 static services::SharedPtr<SOANumericTable> create(
size_t nColumns = 0,
size_t nRows = 0,
67 DictionaryIface::FeaturesEqual featuresEqual = DictionaryIface::notEqual,
68 services::Status *stat = NULL);
77 DAAL_DEPRECATED SOANumericTable( NumericTableDictionary *ddict,
size_t nRows, AllocationFlag memoryAllocationFlag = notAllocate ):
78 NumericTable(NumericTableDictionaryPtr(ddict, services::EmptyDeleter())),
79 _arraysInitialized(0), _partialMemStatus(notAllocated)
82 this->_status |= setNumberOfRowsImpl( nRows );
83 if( !resizePointersArray( getNumberOfColumns() ) )
85 this->_status.add(services::ErrorMemoryAllocationFailed);
88 if( memoryAllocationFlag == doAllocate )
90 this->_status |= allocateDataMemoryImpl();
101 SOANumericTable( NumericTableDictionaryPtr ddict,
size_t nRows, AllocationFlag memoryAllocationFlag = notAllocate );
111 static services::SharedPtr<SOANumericTable> create(NumericTableDictionaryPtr ddict,
size_t nRows,
112 AllocationFlag memoryAllocationFlag = notAllocate,
113 services::Status *stat = NULL);
115 virtual ~SOANumericTable()
117 freeDataMemoryImpl();
127 services::Status setArray(
const services::SharedPtr<T> &ptr,
size_t idx)
129 if( _partialMemStatus != notAllocated && _partialMemStatus != userAllocated )
131 return services::Status(services::ErrorIncorrectNumberOfFeatures);
134 if( idx < getNumberOfColumns() && idx < _arrays.size() )
136 _ddict->setFeature<T>(idx);
138 if( !_arrays[idx] && ptr )
140 _arraysInitialized++;
143 if( _arrays[idx] && !ptr )
145 _arraysInitialized--;
148 _arrays[idx] = services::reinterpretPointerCast<byte, T>(ptr);
152 return services::Status(services::ErrorIncorrectNumberOfFeatures);
155 _partialMemStatus = userAllocated;
157 if(_arraysInitialized == getNumberOfColumns())
159 _memStatus = userAllocated;
161 return services::Status();
171 services::Status setArray(T *ptr,
size_t idx)
173 return setArray(services::SharedPtr<T>(ptr, services::EmptyDeleter()), idx);
181 services::SharedPtr<byte> getArraySharedPtr(
size_t idx)
183 if( idx < _ddict->getNumberOfFeatures() )
189 this->_status.add(services::ErrorIncorrectNumberOfFeatures);
190 return services::SharedPtr<byte>();
199 void *getArray(
size_t idx)
201 return getArraySharedPtr(idx).get();
204 services::Status getBlockOfRows(
size_t vector_idx,
size_t vector_num, ReadWriteMode rwflag, BlockDescriptor<double>& block) DAAL_C11_OVERRIDE
206 return getTBlock<double>(vector_idx, vector_num, rwflag, block);
208 services::Status getBlockOfRows(
size_t vector_idx,
size_t vector_num, ReadWriteMode rwflag, BlockDescriptor<float>& block) DAAL_C11_OVERRIDE
210 return getTBlock<float>(vector_idx, vector_num, rwflag, block);
212 services::Status getBlockOfRows(
size_t vector_idx,
size_t vector_num, ReadWriteMode rwflag, BlockDescriptor<int>& block) DAAL_C11_OVERRIDE
214 return getTBlock<int>(vector_idx, vector_num, rwflag, block);
217 services::Status releaseBlockOfRows(BlockDescriptor<double>& block) DAAL_C11_OVERRIDE
219 return releaseTBlock<double>(block);
221 services::Status releaseBlockOfRows(BlockDescriptor<float>& block) DAAL_C11_OVERRIDE
223 return releaseTBlock<float>(block);
225 services::Status releaseBlockOfRows(BlockDescriptor<int>& block) DAAL_C11_OVERRIDE
227 return releaseTBlock<int>(block);
230 services::Status getBlockOfColumnValues(
size_t feature_idx,
size_t vector_idx,
size_t value_num,
231 ReadWriteMode rwflag, BlockDescriptor<double>& block) DAAL_C11_OVERRIDE
233 return getTFeature<double>(feature_idx, vector_idx, value_num, rwflag, block);
235 services::Status getBlockOfColumnValues(
size_t feature_idx,
size_t vector_idx,
size_t value_num,
236 ReadWriteMode rwflag, BlockDescriptor<float>& block) DAAL_C11_OVERRIDE
238 return getTFeature<float>(feature_idx, vector_idx, value_num, rwflag, block);
240 services::Status getBlockOfColumnValues(
size_t feature_idx,
size_t vector_idx,
size_t value_num,
241 ReadWriteMode rwflag, BlockDescriptor<int>& block) DAAL_C11_OVERRIDE
243 return getTFeature<int>(feature_idx, vector_idx, value_num, rwflag, block);
246 services::Status releaseBlockOfColumnValues(BlockDescriptor<double>& block) DAAL_C11_OVERRIDE
248 return releaseTFeature<double>(block);
250 services::Status releaseBlockOfColumnValues(BlockDescriptor<float>& block) DAAL_C11_OVERRIDE
252 return releaseTFeature<float>(block);
254 services::Status releaseBlockOfColumnValues(BlockDescriptor<int>& block) DAAL_C11_OVERRIDE
256 return releaseTFeature<int>(block);
259 DAAL_DEPRECATED_VIRTUAL services::Status setDictionary( NumericTableDictionary *ddict ) DAAL_C11_OVERRIDE
262 DAAL_CHECK_STATUS(s, NumericTable::setDictionary( ddict ));
264 size_t ncol = ddict->getNumberOfFeatures();
266 if( !resizePointersArray( ncol ) )
268 return services::Status(services::ErrorMemoryAllocationFailed);
275 SOANumericTable(
size_t nColumns,
size_t nRows, DictionaryIface::FeaturesEqual featuresEqual, services::Status &st );
277 SOANumericTable( NumericTableDictionaryPtr ddict,
size_t nRows, AllocationFlag memoryAllocationFlag, services::Status &st );
279 services::Collection<services::SharedPtr<byte> > _arrays;
280 size_t _arraysInitialized;
281 MemoryStatus _partialMemStatus;
283 bool resizePointersArray(
size_t nColumns)
285 if( _arrays.size() >= nColumns )
288 for(
size_t i = 0; i < nColumns; i++)
290 counter += (_arrays[i] != 0);
292 _arraysInitialized = counter;
294 if( _arraysInitialized == nColumns )
296 _memStatus = _partialMemStatus;
300 _memStatus = notAllocated;
305 _arrays.resize(nColumns);
306 _memStatus = notAllocated;
311 services::Status setNumberOfColumnsImpl(
size_t ncol) DAAL_C11_OVERRIDE
314 DAAL_CHECK_STATUS(s, NumericTable::setNumberOfColumnsImpl(ncol));
316 if( !resizePointersArray( ncol ) )
318 return services::Status(services::ErrorMemoryAllocationFailed);
323 services::Status allocateDataMemoryImpl(daal::MemType type = daal::dram) DAAL_C11_OVERRIDE
325 freeDataMemoryImpl();
327 size_t ncol = _ddict->getNumberOfFeatures();
328 size_t nrows = getNumberOfRows();
330 if( ncol * nrows == 0 )
334 return services::Status(services::ErrorIncorrectNumberOfObservations);
338 return services::Status(services::ErrorIncorrectNumberOfFeatures);
342 for(
size_t i = 0; i < ncol; i++)
344 NumericTableFeature f = (*_ddict)[i];
345 if( f.typeSize != 0 )
347 _arrays[i] = services::SharedPtr<byte>((byte *)daal::services::daal_malloc( f.typeSize * nrows ), services::ServiceDeleter());
348 _arraysInitialized++;
352 freeDataMemoryImpl();
353 return services::Status(services::ErrorMemoryAllocationFailed);
357 if(_arraysInitialized > 0)
359 _partialMemStatus = internallyAllocated;
362 if(_arraysInitialized == ncol)
364 _memStatus = internallyAllocated;
366 return services::Status();
369 void freeDataMemoryImpl() DAAL_C11_OVERRIDE
372 _arrays.resize(_ddict->getNumberOfFeatures());
373 _arraysInitialized = 0;
375 _partialMemStatus = notAllocated;
376 _memStatus = notAllocated;
379 template<
typename Archive,
bool onDeserialize>
380 services::Status serialImpl( Archive *arch )
382 NumericTable::serialImpl<Archive, onDeserialize>( arch );
386 allocateDataMemoryImpl();
389 size_t ncol = _ddict->getNumberOfFeatures();
390 size_t nrows = getNumberOfRows();
392 for(
size_t i = 0; i < ncol; i++)
394 NumericTableFeature f = (*_ddict)[i];
395 void *ptr = getArraySharedPtr(i).get();
397 arch->set( (
char *)ptr, nrows * f.typeSize );
400 return services::Status();
405 template <
typename T>
406 services::Status getTBlock(
size_t idx,
size_t nrows, ReadWriteMode rwFlag, BlockDescriptor<T>& block )
408 size_t ncols = getNumberOfColumns();
409 size_t nobs = getNumberOfRows();
410 block.setDetails( 0, idx, rwFlag );
414 block.resizeBuffer( ncols, 0 );
415 return services::Status();
418 nrows = ( idx + nrows < nobs ) ? nrows : nobs - idx;
420 if( !block.resizeBuffer( ncols, nrows ) )
422 return services::Status(services::ErrorMemoryAllocationFailed);
425 if( !(block.getRWFlag() & (int)readOnly) )
return services::Status();
431 T *buffer = block.getBlockPtr();
433 for(
size_t i = 0 ; i < nrows ; i += di )
435 if( i + di > nrows ) { di = nrows - i; }
437 for(
size_t j = 0 ; j < ncols ; j++ )
439 NumericTableFeature &f = (*_ddict)[j];
441 char *ptr = (
char *)_arrays[j].
get() + (idx + i) * f.typeSize;
443 data_feature_utils::getVectorUpCast(f.indexType, data_feature_utils::getInternalNumType<T>())
446 for(
size_t ii = 0 ; ii < di; ii++ )
448 buffer[ (i + ii)*ncols + j ] = lbuf[ii];
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();
461 size_t nrows = block.getNumberOfRows();
462 size_t idx = block.getRowsOffset();
467 T *blockPtr = block.getBlockPtr();
469 for(
size_t i = 0 ; i < nrows ; i += di )
471 if( i + di > nrows ) { di = nrows - i; }
473 for(
size_t j = 0 ; j < ncols ; j++ )
475 NumericTableFeature &f = (*_ddict)[j];
477 char *ptr = (
char *)_arrays[j].
get() + (idx + i) * f.typeSize;
479 for(
size_t ii = 0 ; ii < di; ii++ )
481 lbuf[ii] = blockPtr[ (i + ii) * ncols + j ];
484 data_feature_utils::getVectorDownCast(f.indexType, data_feature_utils::getInternalNumType<T>())
490 return services::Status();
493 template <
typename T>
494 services::Status getTFeature(
size_t feat_idx,
size_t idx,
size_t nrows,
int rwFlag, BlockDescriptor<T>& block )
496 size_t ncols = getNumberOfColumns();
497 size_t nobs = getNumberOfRows();
498 block.setDetails( feat_idx, idx, rwFlag );
502 block.resizeBuffer( 1, 0 );
503 return services::Status();
506 nrows = ( idx + nrows < nobs ) ? nrows : nobs - idx;
508 NumericTableFeature &f = (*_ddict)[feat_idx];
510 if( data_feature_utils::getIndexNumType<T>() == f.indexType )
512 block.setPtr(&(_arrays[feat_idx]), _arrays[feat_idx].
get() + idx * f.typeSize , 1, nrows );
516 byte *location = _arrays[feat_idx].get() + idx * f.typeSize;
518 if( !block.resizeBuffer( 1, nrows ) )
520 return services::Status(services::ErrorMemoryAllocationFailed);
523 if( !(block.getRWFlag() & (int)readOnly) )
return services::Status();
525 data_feature_utils::getVectorUpCast(f.indexType, data_feature_utils::getInternalNumType<T>())
526 ( nrows, location, block.getBlockPtr() );
528 return services::Status();
531 template <
typename T>
532 services::Status releaseTFeature( BlockDescriptor<T>& block )
534 if (block.getRWFlag() & (int)writeOnly)
536 size_t feat_idx = block.getColumnsOffset();
538 NumericTableFeature &f = (*_ddict)[feat_idx];
540 if( data_feature_utils::getIndexNumType<T>() != f.indexType )
542 char *ptr = (
char *)_arrays[feat_idx].
get() + block.getRowsOffset() * f.typeSize;
544 data_feature_utils::getVectorDownCast(f.indexType, data_feature_utils::getInternalNumType<T>())
545 ( block.getNumberOfRows(), block.getBlockPtr(), ptr );
549 return services::Status();
552 typedef services::SharedPtr<SOANumericTable> SOANumericTablePtr;
555 using interface1::SOANumericTable;
556 using interface1::SOANumericTablePtr;
daal::data_management::interface1::NumericTableIface::AllocationFlag
AllocationFlag
Enumeration to specify whether the Numeric Table must allocate memory.
Definition: numeric_table.h:283
daal::data_management::interface1::SOANumericTable::releaseBlockOfColumnValues
services::Status releaseBlockOfColumnValues(BlockDescriptor< double > &block) DAAL_C11_OVERRIDE
Definition: soa_numeric_table.h:246
daal
Definition: algorithm_base_common.h:31
daal::data_management::interface1::SOANumericTable::setArray
services::Status setArray(T *ptr, size_t idx)
Definition: soa_numeric_table.h:171
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:43
daal::data_management::interface1::SOANumericTable::releaseBlockOfColumnValues
services::Status releaseBlockOfColumnValues(BlockDescriptor< float > &block) DAAL_C11_OVERRIDE
Definition: soa_numeric_table.h:250
daal::services::ErrorMemoryAllocationFailed
Definition: error_indexes.h:146
daal::data_management::interface1::SOANumericTable::getArray
void * getArray(size_t idx)
Definition: soa_numeric_table.h:199
daal::dram
Definition: daal_defines.h:133
daal::data_management::interface1::SOANumericTable::SOANumericTable
DAAL_DEPRECATED SOANumericTable(NumericTableDictionary *ddict, size_t nRows, AllocationFlag memoryAllocationFlag=notAllocate)
Definition: soa_numeric_table.h:77
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:204
daal::data_management::interface1::SOANumericTable::releaseBlockOfRows
services::Status releaseBlockOfRows(BlockDescriptor< int > &block) DAAL_C11_OVERRIDE
Definition: soa_numeric_table.h:225
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::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:235
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:212
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:574
daal::data_management::interface1::SOANumericTable::releaseBlockOfRows
services::Status releaseBlockOfRows(BlockDescriptor< double > &block) DAAL_C11_OVERRIDE
Definition: soa_numeric_table.h:217
daal::data_management::interface1::SOANumericTable::setArray
services::Status setArray(const services::SharedPtr< T > &ptr, size_t idx)
Definition: soa_numeric_table.h:127
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:230
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:208
daal::data_management::interface1::SOANumericTable::releaseBlockOfColumnValues
services::Status releaseBlockOfColumnValues(BlockDescriptor< int > &block) DAAL_C11_OVERRIDE
Definition: soa_numeric_table.h:254
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:240
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::data_management::interface1::DictionaryIface::FeaturesEqual
FeaturesEqual
Enumeration to specify whether the Data Dictionary contains equal features.
Definition: data_dictionary.h:145
daal::services::ErrorIncorrectNumberOfObservations
Definition: error_indexes.h:71
daal::data_management::interface1::SOANumericTable::getArraySharedPtr
services::SharedPtr< byte > getArraySharedPtr(size_t idx)
Definition: soa_numeric_table.h:181
daal::data_management::interface1::SOANumericTable::releaseBlockOfRows
services::Status releaseBlockOfRows(BlockDescriptor< float > &block) DAAL_C11_OVERRIDE
Definition: soa_numeric_table.h:221
daal::data_management::interface1::NumericTable::setDictionary
virtual DAAL_DEPRECATED_VIRTUAL services::Status setDictionary(NumericTableDictionary *ddict) DAAL_C11_OVERRIDE
Definition: numeric_table.h:624
daal::MemType
MemType
Definition: daal_defines.h:131
daal::data_management::interface1::SOANumericTable::setDictionary
DAAL_DEPRECATED_VIRTUAL services::Status setDictionary(NumericTableDictionary *ddict) DAAL_C11_OVERRIDE
Definition: soa_numeric_table.h:259
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:158