22 #ifndef __SOA_NUMERIC_TABLE_H__
23 #define __SOA_NUMERIC_TABLE_H__
25 #include "data_management/data/numeric_table.h"
26 #include "data_management/data/internal/conversion.h"
30 namespace data_management
44 class DAAL_EXPORT SOANumericTable :
public NumericTable
47 DECLARE_SERIALIZABLE_TAG();
48 DECLARE_SERIALIZABLE_IMPL();
57 SOANumericTable(
size_t nColumns = 0,
size_t nRows = 0, DictionaryIface::FeaturesEqual featuresEqual = DictionaryIface::notEqual);
67 static services::SharedPtr<SOANumericTable> create(
size_t nColumns = 0,
size_t nRows = 0,
68 DictionaryIface::FeaturesEqual featuresEqual = DictionaryIface::notEqual,
69 services::Status *stat = NULL);
78 DAAL_DEPRECATED SOANumericTable( NumericTableDictionary *ddict,
size_t nRows, AllocationFlag memoryAllocationFlag = notAllocate ):
79 NumericTable(NumericTableDictionaryPtr(ddict, services::EmptyDeleter())),
80 _arraysInitialized(0), _partialMemStatus(notAllocated)
83 this->_status |= setNumberOfRowsImpl( nRows );
84 if( !resizePointersArray( getNumberOfColumns() ) )
86 this->_status.add(services::ErrorMemoryAllocationFailed);
89 if( memoryAllocationFlag == doAllocate )
91 this->_status |= allocateDataMemoryImpl();
102 SOANumericTable( NumericTableDictionaryPtr ddict,
size_t nRows, AllocationFlag memoryAllocationFlag = notAllocate );
112 static services::SharedPtr<SOANumericTable> create(NumericTableDictionaryPtr ddict,
size_t nRows,
113 AllocationFlag memoryAllocationFlag = notAllocate,
114 services::Status *stat = NULL);
116 virtual ~SOANumericTable()
118 freeDataMemoryImpl();
128 services::Status setArray(
const services::SharedPtr<T> &ptr,
size_t idx)
130 if( _partialMemStatus != notAllocated && _partialMemStatus != userAllocated )
132 return services::Status(services::ErrorIncorrectNumberOfFeatures);
135 if( idx < getNumberOfColumns() && idx < _arrays.size() )
137 _ddict->setFeature<T>(idx);
139 if( !_arrays[idx] && ptr )
141 _arraysInitialized++;
144 if( _arrays[idx] && !ptr )
146 _arraysInitialized--;
149 _arrays[idx] = services::reinterpretPointerCast<byte, T>(ptr);
153 return services::Status(services::ErrorIncorrectNumberOfFeatures);
156 _partialMemStatus = userAllocated;
158 if(_arraysInitialized == getNumberOfColumns())
160 _memStatus = userAllocated;
162 return services::Status();
172 services::Status setArray(T *ptr,
size_t idx)
174 return setArray(services::SharedPtr<T>(ptr, services::EmptyDeleter()), idx);
182 services::SharedPtr<byte> getArraySharedPtr(
size_t idx)
184 if( idx < _ddict->getNumberOfFeatures() )
190 this->_status.add(services::ErrorIncorrectNumberOfFeatures);
191 return services::SharedPtr<byte>();
200 void *getArray(
size_t idx)
202 return getArraySharedPtr(idx).get();
205 services::Status getBlockOfRows(
size_t vector_idx,
size_t vector_num, ReadWriteMode rwflag, BlockDescriptor<double>& block) DAAL_C11_OVERRIDE
207 return getTBlock<double>(vector_idx, vector_num, rwflag, block);
209 services::Status getBlockOfRows(
size_t vector_idx,
size_t vector_num, ReadWriteMode rwflag, BlockDescriptor<float>& block) DAAL_C11_OVERRIDE
211 return getTBlock<float>(vector_idx, vector_num, rwflag, block);
213 services::Status getBlockOfRows(
size_t vector_idx,
size_t vector_num, ReadWriteMode rwflag, BlockDescriptor<int>& block) DAAL_C11_OVERRIDE
215 return getTBlock<int>(vector_idx, vector_num, rwflag, block);
218 services::Status releaseBlockOfRows(BlockDescriptor<double>& block) DAAL_C11_OVERRIDE
220 return releaseTBlock<double>(block);
222 services::Status releaseBlockOfRows(BlockDescriptor<float>& block) DAAL_C11_OVERRIDE
224 return releaseTBlock<float>(block);
226 services::Status releaseBlockOfRows(BlockDescriptor<int>& block) DAAL_C11_OVERRIDE
228 return releaseTBlock<int>(block);
231 services::Status getBlockOfColumnValues(
size_t feature_idx,
size_t vector_idx,
size_t value_num,
232 ReadWriteMode rwflag, BlockDescriptor<double>& block) DAAL_C11_OVERRIDE
234 return getTFeature<double>(feature_idx, vector_idx, value_num, rwflag, block);
236 services::Status getBlockOfColumnValues(
size_t feature_idx,
size_t vector_idx,
size_t value_num,
237 ReadWriteMode rwflag, BlockDescriptor<float>& block) DAAL_C11_OVERRIDE
239 return getTFeature<float>(feature_idx, vector_idx, value_num, rwflag, block);
241 services::Status getBlockOfColumnValues(
size_t feature_idx,
size_t vector_idx,
size_t value_num,
242 ReadWriteMode rwflag, BlockDescriptor<int>& block) DAAL_C11_OVERRIDE
244 return getTFeature<int>(feature_idx, vector_idx, value_num, rwflag, block);
247 services::Status releaseBlockOfColumnValues(BlockDescriptor<double>& block) DAAL_C11_OVERRIDE
249 return releaseTFeature<double>(block);
251 services::Status releaseBlockOfColumnValues(BlockDescriptor<float>& block) DAAL_C11_OVERRIDE
253 return releaseTFeature<float>(block);
255 services::Status releaseBlockOfColumnValues(BlockDescriptor<int>& block) DAAL_C11_OVERRIDE
257 return releaseTFeature<int>(block);
260 DAAL_DEPRECATED_VIRTUAL services::Status setDictionary( NumericTableDictionary *ddict ) DAAL_C11_OVERRIDE
263 DAAL_CHECK_STATUS(s, NumericTable::setDictionary( ddict ));
265 size_t ncol = ddict->getNumberOfFeatures();
267 if( !resizePointersArray( ncol ) )
269 return services::Status(services::ErrorMemoryAllocationFailed);
276 SOANumericTable(
size_t nColumns,
size_t nRows, DictionaryIface::FeaturesEqual featuresEqual, services::Status &st );
278 SOANumericTable( NumericTableDictionaryPtr ddict,
size_t nRows, AllocationFlag memoryAllocationFlag, services::Status &st );
280 services::Collection<services::SharedPtr<byte> > _arrays;
281 size_t _arraysInitialized;
282 MemoryStatus _partialMemStatus;
284 bool resizePointersArray(
size_t nColumns)
286 if( _arrays.size() >= nColumns )
289 for(
size_t i = 0; i < nColumns; i++)
291 counter += (_arrays[i] != 0);
293 _arraysInitialized = counter;
295 if( _arraysInitialized == nColumns )
297 _memStatus = _partialMemStatus;
301 _memStatus = notAllocated;
306 _arrays.resize(nColumns);
307 _memStatus = notAllocated;
312 services::Status setNumberOfColumnsImpl(
size_t ncol) DAAL_C11_OVERRIDE
315 DAAL_CHECK_STATUS(s, NumericTable::setNumberOfColumnsImpl(ncol));
317 if( !resizePointersArray( ncol ) )
319 return services::Status(services::ErrorMemoryAllocationFailed);
324 services::Status allocateDataMemoryImpl(daal::MemType type = daal::dram) DAAL_C11_OVERRIDE
326 freeDataMemoryImpl();
328 size_t ncol = _ddict->getNumberOfFeatures();
329 size_t nrows = getNumberOfRows();
331 if( ncol * nrows == 0 )
335 return services::Status(services::ErrorIncorrectNumberOfObservations);
339 return services::Status(services::ErrorIncorrectNumberOfFeatures);
343 for(
size_t i = 0; i < ncol; i++)
345 NumericTableFeature f = (*_ddict)[i];
346 if( f.typeSize != 0 )
348 _arrays[i] = services::SharedPtr<byte>((byte *)daal::services::daal_malloc( f.typeSize * nrows ), services::ServiceDeleter());
349 _arraysInitialized++;
353 freeDataMemoryImpl();
354 return services::Status(services::ErrorMemoryAllocationFailed);
358 if(_arraysInitialized > 0)
360 _partialMemStatus = internallyAllocated;
363 if(_arraysInitialized == ncol)
365 _memStatus = internallyAllocated;
367 return services::Status();
370 void freeDataMemoryImpl() DAAL_C11_OVERRIDE
373 _arrays.resize(_ddict->getNumberOfFeatures());
374 _arraysInitialized = 0;
376 _partialMemStatus = notAllocated;
377 _memStatus = notAllocated;
380 template<
typename Archive,
bool onDeserialize>
381 services::Status serialImpl( Archive *arch )
383 NumericTable::serialImpl<Archive, onDeserialize>( arch );
387 allocateDataMemoryImpl();
390 size_t ncol = _ddict->getNumberOfFeatures();
391 size_t nrows = getNumberOfRows();
393 for(
size_t i = 0; i < ncol; i++)
395 NumericTableFeature f = (*_ddict)[i];
396 void *ptr = getArraySharedPtr(i).get();
398 arch->set( (
char *)ptr, nrows * f.typeSize );
401 return services::Status();
406 template <
typename T>
407 services::Status getTBlock(
size_t idx,
size_t nrows, ReadWriteMode rwFlag, BlockDescriptor<T>& block )
409 size_t ncols = getNumberOfColumns();
410 size_t nobs = getNumberOfRows();
411 block.setDetails( 0, idx, rwFlag );
415 block.resizeBuffer( ncols, 0 );
416 return services::Status();
419 nrows = ( idx + nrows < nobs ) ? nrows : nobs - idx;
421 if( !block.resizeBuffer( ncols, nrows ) )
423 return services::Status(services::ErrorMemoryAllocationFailed);
426 if( !(block.getRWFlag() & (int)readOnly) )
return services::Status();
432 T *buffer = block.getBlockPtr();
434 for(
size_t i = 0 ; i < nrows ; i += di )
436 if( i + di > nrows ) { di = nrows - i; }
438 for(
size_t j = 0 ; j < ncols ; j++ )
440 NumericTableFeature &f = (*_ddict)[j];
442 char *ptr = (
char *)_arrays[j].
get() + (idx + i) * f.typeSize;
444 internal::getVectorUpCast(f.indexType, internal::getConversionDataType<T>())
447 for(
size_t ii = 0 ; ii < di; ii++ )
449 buffer[ (i + ii)*ncols + j ] = lbuf[ii];
453 return services::Status();
456 template <
typename T>
457 services::Status releaseTBlock( BlockDescriptor<T>& block )
459 if(block.getRWFlag() & (int)writeOnly)
461 size_t ncols = getNumberOfColumns();
462 size_t nrows = block.getNumberOfRows();
463 size_t idx = block.getRowsOffset();
468 T *blockPtr = block.getBlockPtr();
470 for(
size_t i = 0 ; i < nrows ; i += di )
472 if( i + di > nrows ) { di = nrows - i; }
474 for(
size_t j = 0 ; j < ncols ; j++ )
476 NumericTableFeature &f = (*_ddict)[j];
478 char *ptr = (
char *)_arrays[j].
get() + (idx + i) * f.typeSize;
480 for(
size_t ii = 0 ; ii < di; ii++ )
482 lbuf[ii] = blockPtr[ (i + ii) * ncols + j ];
485 internal::getVectorDownCast(f.indexType, internal::getConversionDataType<T>())
491 return services::Status();
494 template <
typename T>
495 services::Status getTFeature(
size_t feat_idx,
size_t idx,
size_t nrows,
int rwFlag, BlockDescriptor<T>& block )
497 size_t ncols = getNumberOfColumns();
498 size_t nobs = getNumberOfRows();
499 block.setDetails( feat_idx, idx, rwFlag );
503 block.resizeBuffer( 1, 0 );
504 return services::Status();
507 nrows = ( idx + nrows < nobs ) ? nrows : nobs - idx;
509 NumericTableFeature &f = (*_ddict)[feat_idx];
511 if( features::internal::getIndexNumType<T>() == f.indexType )
513 block.setPtr(&(_arrays[feat_idx]), _arrays[feat_idx].
get() + idx * f.typeSize , 1, nrows );
517 byte *location = _arrays[feat_idx].get() + idx * f.typeSize;
519 if( !block.resizeBuffer( 1, nrows ) )
521 return services::Status(services::ErrorMemoryAllocationFailed);
524 if( !(block.getRWFlag() & (int)readOnly) )
return services::Status();
526 internal::getVectorUpCast(f.indexType, internal::getConversionDataType<T>())
527 ( nrows, location, block.getBlockPtr() );
529 return services::Status();
532 template <
typename T>
533 services::Status releaseTFeature( BlockDescriptor<T>& block )
535 if (block.getRWFlag() & (int)writeOnly)
537 size_t feat_idx = block.getColumnsOffset();
539 NumericTableFeature &f = (*_ddict)[feat_idx];
541 if( features::internal::getIndexNumType<T>() != f.indexType )
543 char *ptr = (
char *)_arrays[feat_idx].
get() + block.getRowsOffset() * f.typeSize;
545 internal::getVectorDownCast(f.indexType, internal::getConversionDataType<T>())
546 ( block.getNumberOfRows(), block.getBlockPtr(), ptr );
550 return services::Status();
553 typedef services::SharedPtr<SOANumericTable> SOANumericTablePtr;
556 using interface1::SOANumericTable;
557 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:247
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:172
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:44
daal::data_management::interface1::SOANumericTable::releaseBlockOfColumnValues
services::Status releaseBlockOfColumnValues(BlockDescriptor< float > &block) DAAL_C11_OVERRIDE
Definition: soa_numeric_table.h:251
daal::services::ErrorMemoryAllocationFailed
Definition: error_indexes.h:147
daal::data_management::interface1::SOANumericTable::getArray
void * getArray(size_t idx)
Definition: soa_numeric_table.h:200
daal::dram
Definition: daal_defines.h:147
daal::data_management::interface1::SOANumericTable::SOANumericTable
DAAL_DEPRECATED SOANumericTable(NumericTableDictionary *ddict, size_t nRows, AllocationFlag memoryAllocationFlag=notAllocate)
Definition: soa_numeric_table.h:78
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:205
daal::data_management::interface1::SOANumericTable::releaseBlockOfRows
services::Status releaseBlockOfRows(BlockDescriptor< int > &block) DAAL_C11_OVERRIDE
Definition: soa_numeric_table.h:226
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:236
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:213
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:575
daal::data_management::interface1::SOANumericTable::releaseBlockOfRows
services::Status releaseBlockOfRows(BlockDescriptor< double > &block) DAAL_C11_OVERRIDE
Definition: soa_numeric_table.h:218
daal::data_management::interface1::SOANumericTable::setArray
services::Status setArray(const services::SharedPtr< T > &ptr, size_t idx)
Definition: soa_numeric_table.h:128
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:231
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:209
daal::data_management::interface1::SOANumericTable::releaseBlockOfColumnValues
services::Status releaseBlockOfColumnValues(BlockDescriptor< int > &block) DAAL_C11_OVERRIDE
Definition: soa_numeric_table.h:255
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:241
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:148
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:182
daal::data_management::interface1::SOANumericTable::releaseBlockOfRows
services::Status releaseBlockOfRows(BlockDescriptor< float > &block) DAAL_C11_OVERRIDE
Definition: soa_numeric_table.h:222
daal::data_management::interface1::NumericTable::setDictionary
virtual DAAL_DEPRECATED_VIRTUAL services::Status setDictionary(NumericTableDictionary *ddict) DAAL_C11_OVERRIDE
Definition: numeric_table.h:625
daal::MemType
MemType
Definition: daal_defines.h:145
daal::data_management::interface1::SOANumericTable::setDictionary
DAAL_DEPRECATED_VIRTUAL services::Status setDictionary(NumericTableDictionary *ddict) DAAL_C11_OVERRIDE
Definition: soa_numeric_table.h:260
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:161