23 #ifndef __ROW_MERGED_NUMERIC_TABLE_H__
24 #define __ROW_MERGED_NUMERIC_TABLE_H__
26 #include "data_management/data/numeric_table.h"
27 #include "services/daal_memory.h"
28 #include "services/daal_defines.h"
29 #include "data_management/data/data_serialize.h"
33 namespace data_management
46 class DAAL_EXPORT RowMergedNumericTable :
public NumericTable
49 DECLARE_SERIALIZABLE_TAG();
50 DECLARE_SERIALIZABLE_IMPL();
56 RowMergedNumericTable();
63 RowMergedNumericTable(NumericTablePtr table);
69 static services::SharedPtr<RowMergedNumericTable> create(services::Status *stat = NULL);
76 static services::SharedPtr<RowMergedNumericTable> create(
const NumericTablePtr &nestedTable,
77 services::Status *stat = NULL);
83 services::Status addNumericTable(NumericTablePtr table)
85 if (table->getDataLayout() & csrArray)
86 return services::Status(services::ErrorIncorrectTypeOfInputNumericTable);
88 size_t ncols = getNumberOfColumns();
89 size_t cols = table->getNumberOfColumns();
91 if (ncols != 0 && ncols != cols)
92 return services::Status(services::ErrorIncorrectNumberOfFeatures);
94 _tables->push_back(table);
98 DictionaryIface::FeaturesEqual featuresEqual = table->getDictionarySharedPtr()->getFeaturesEqual();
100 _ddict = NumericTableDictionary::create(ncols, featuresEqual, &s);
103 s = setNumberOfColumnsImpl(cols);
106 if (featuresEqual == DictionaryIface::equal)
108 NumericTableFeature &f = table->getDictionarySharedPtr()->operator[](0);
109 _ddict->setFeature(f, 0);
113 for (
size_t i = 0; i < cols; i++)
115 NumericTableFeature &f = table->getDictionarySharedPtr()->operator[](i);
116 _ddict->setFeature(f, i);
121 size_t obs = table->getNumberOfRows();
122 return setNumberOfRowsImpl(_obsnum + obs);
125 services::Status resize(
size_t nrows) DAAL_C11_OVERRIDE
127 return services::Status(services::throwIfPossible(services::ErrorMethodNotSupported));
130 MemoryStatus getDataMemoryStatus() const DAAL_C11_OVERRIDE
132 if (_tables->size() == 0)
137 for (
size_t i = 0;i < _tables->size(); i++)
139 NumericTable* nt = (NumericTable*)(_tables->operator[](i).get());
140 if (nt->getDataMemoryStatus() == notAllocated)
146 return internallyAllocated;
149 services::Status getBlockOfRows(
size_t vector_idx,
size_t vector_num,
150 ReadWriteMode rwflag, BlockDescriptor<double>& block) DAAL_C11_OVERRIDE
152 return getTBlock<double>(vector_idx, vector_num, rwflag, block);
154 services::Status getBlockOfRows(
size_t vector_idx,
size_t vector_num,
155 ReadWriteMode rwflag, BlockDescriptor<float>& block) DAAL_C11_OVERRIDE
157 return getTBlock<float>(vector_idx, vector_num, rwflag, block);
159 services::Status getBlockOfRows(
size_t vector_idx,
size_t vector_num,
160 ReadWriteMode rwflag, BlockDescriptor<int>& block) DAAL_C11_OVERRIDE
162 return getTBlock<int>(vector_idx, vector_num, rwflag, block);
165 services::Status releaseBlockOfRows(BlockDescriptor<double>& block) DAAL_C11_OVERRIDE
167 return releaseTBlock<double>(block);
169 services::Status releaseBlockOfRows(BlockDescriptor<float>& block) DAAL_C11_OVERRIDE
171 return releaseTBlock<float>(block);
173 services::Status releaseBlockOfRows(BlockDescriptor<int>& block) DAAL_C11_OVERRIDE
175 return releaseTBlock<int>(block);
178 services::Status getBlockOfColumnValues(
size_t feature_idx,
size_t vector_idx,
size_t value_num,
179 ReadWriteMode rwflag, BlockDescriptor<double>& block) DAAL_C11_OVERRIDE
181 return getTFeature<double>(feature_idx, vector_idx, value_num, rwflag, block);
183 services::Status getBlockOfColumnValues(
size_t feature_idx,
size_t vector_idx,
size_t value_num,
184 ReadWriteMode rwflag, BlockDescriptor<float>& block) DAAL_C11_OVERRIDE
186 return getTFeature<float>(feature_idx, vector_idx, value_num, rwflag, block);
188 services::Status getBlockOfColumnValues(
size_t feature_idx,
size_t vector_idx,
size_t value_num,
189 ReadWriteMode rwflag, BlockDescriptor<int>& block) DAAL_C11_OVERRIDE
191 return getTFeature<int>(feature_idx, vector_idx, value_num, rwflag, block);
194 services::Status releaseBlockOfColumnValues(BlockDescriptor<double>& block) DAAL_C11_OVERRIDE
196 return releaseTFeature<double>(block);
198 services::Status releaseBlockOfColumnValues(BlockDescriptor<float>& block) DAAL_C11_OVERRIDE
200 return releaseTFeature<float>(block);
202 services::Status releaseBlockOfColumnValues(BlockDescriptor<int>& block) DAAL_C11_OVERRIDE
204 return releaseTFeature<int>(block);
209 template<
typename Archive,
bool onDeserialize>
210 services::Status serialImpl( Archive *arch )
212 NumericTable::serialImpl<Archive, onDeserialize>( arch );
214 arch->setSharedPtrObj(_tables);
216 return services::Status();
221 void internal_inner_repack(
size_t idx,
size_t rows,
size_t ncols, T *src, T *dst )
225 for(i = 0; i < rows; i++)
227 for(j = 0; j < ncols; j++)
229 dst[(idx + i) * ncols + j] = src[i * ncols + j];
235 void internal_outer_repack(
size_t idx,
size_t rows,
size_t ncols, T *src, T *dst )
239 for(i = 0; i < rows; i++)
241 for(j = 0; j < ncols; j++)
243 dst[i * ncols + j] = src[(i + idx) * ncols + j];
249 template <
typename T>
250 services::Status getTBlock(
size_t idx,
size_t nrows,
int rwFlag, BlockDescriptor<T>& block)
253 size_t ncols = getNumberOfColumns();
254 size_t nobs = getNumberOfRows();
255 block.setDetails( 0, idx, rwFlag );
259 block.resizeBuffer( ncols, 0 );
260 return services::Status();
263 nrows = ( idx + nrows < nobs ) ? nrows : nobs - idx;
265 if( !block.resizeBuffer( ncols, nrows ) )
266 return services::Status(services::ErrorMemoryAllocationFailed);
268 if( rwFlag & (
int)readOnly )
271 BlockDescriptor<T> innerBlock;
272 for (
size_t k = 0; k < _tables->size() && rows < idx + nrows; k++)
274 NumericTable* nt = (NumericTable*)(_tables->operator[](k).get());
275 size_t lrows = nt->getNumberOfRows();
277 if (rows + lrows > idx)
279 size_t idxBegin = (rows < idx) ? idx : rows;
280 size_t idxEnd = (rows + lrows < idx + nrows) ? rows + lrows : idx + nrows;
281 s |= nt->getBlockOfRows(idxBegin - rows, idxEnd - idxBegin, readOnly, innerBlock);
283 internal_inner_repack<T>( idxBegin - idx, idxEnd - idxBegin, ncols, innerBlock.getBlockPtr(), block.getBlockPtr());
285 s |= nt->releaseBlockOfRows(innerBlock);
294 template <
typename T>
295 services::Status releaseTBlock(BlockDescriptor<T>& block)
298 if(block.getRWFlag() & (int)writeOnly)
300 size_t ncols = getNumberOfColumns();
301 size_t nrows = block.getNumberOfRows();
302 size_t idx = block.getRowsOffset();
304 BlockDescriptor<T> innerBlock;
305 for (
size_t k = 0; k < _tables->size() && rows < idx + nrows; k++)
307 NumericTable* nt = (NumericTable*)(_tables->operator[](k).get());
308 size_t lrows = nt->getNumberOfRows();
310 if (rows + lrows > idx)
312 size_t idxBegin = (rows < idx) ? idx : rows;
313 size_t idxEnd = (rows + lrows < idx + nrows) ? rows + lrows : idx + nrows;
314 s |= nt->getBlockOfRows(idxBegin - rows, idxEnd - idxBegin, writeOnly, innerBlock);
316 internal_outer_repack<T>( idxBegin - idx, idxEnd - idxBegin, ncols, block.getBlockPtr(), innerBlock.getBlockPtr());
318 s |= nt->releaseBlockOfRows(innerBlock);
328 template <
typename T>
329 services::Status getTFeature(
size_t feat_idx,
size_t idx,
size_t nrows,
int rwFlag, BlockDescriptor<T>& block)
332 size_t ncols = getNumberOfColumns();
333 size_t nobs = getNumberOfRows();
334 block.setDetails( feat_idx, idx, rwFlag );
338 block.resizeBuffer( 1, 0 );
339 return services::Status();
342 nrows = ( idx + nrows < nobs ) ? nrows : nobs - idx;
343 if( !block.resizeBuffer( 1, nrows ) )
344 return services::Status(services::ErrorMemoryAllocationFailed);
346 if( rwFlag & (
int)readOnly )
348 T* buffer = block.getBlockPtr();
350 for (
size_t k = 0; k < _tables->size() && rows < idx + nrows; k++)
352 NumericTable* nt = (NumericTable*)(_tables->operator[](k).get());
353 size_t lrows = nt->getNumberOfRows();
355 if (rows + lrows > idx)
357 size_t idxBegin = (rows < idx) ? idx : rows;
358 size_t idxEnd = (rows + lrows < idx + nrows) ? rows + lrows : idx + nrows;
360 BlockDescriptor<T> innerBlock;
361 s |= nt->getBlockOfColumnValues(feat_idx, idxBegin - rows, idxEnd - idxBegin, readOnly, innerBlock);
362 T* location = innerBlock.getBlockPtr();
363 for (
size_t i = idxBegin; i < idxEnd; i++)
365 buffer[i] = location[i - idxBegin];
367 s |= nt->releaseBlockOfColumnValues(innerBlock);
376 template <
typename T>
377 services::Status releaseTFeature( BlockDescriptor<T>& block )
380 if (block.getRWFlag() & (int)writeOnly)
382 size_t feat_idx = block.getColumnsOffset();
383 size_t idx = block.getRowsOffset();
384 size_t nrows = block.getNumberOfRows();
386 T* buffer = block.getBlockPtr();
387 for (
size_t k = 0; k < _tables->size() && rows < idx + nrows; k++)
389 NumericTable* nt = (NumericTable*)(_tables->operator[](k).get());
390 size_t lrows = nt->getNumberOfRows();
392 if (rows + lrows > idx)
394 size_t idxBegin = (rows < idx) ? idx : rows;
395 size_t idxEnd = (rows + lrows < idx + nrows) ? rows + lrows : idx + nrows;
397 BlockDescriptor<T> innerBlock;
398 s |= nt->getBlockOfColumnValues(feat_idx, idxBegin - rows, idxEnd - idxBegin, writeOnly, innerBlock);
399 T* location = innerBlock.getBlockPtr();
400 for (
size_t i = idxBegin; i < idxEnd; i++)
402 location[i - idxBegin] = buffer[i];
404 s |= nt->releaseBlockOfColumnValues(innerBlock);
414 services::Status setNumberOfColumnsImpl(
size_t ncols) DAAL_C11_OVERRIDE;
415 services::Status allocateDataMemoryImpl(daal::MemType type = daal::dram) DAAL_C11_OVERRIDE;
416 void freeDataMemoryImpl() DAAL_C11_OVERRIDE;
419 DataCollectionPtr _tables;
421 RowMergedNumericTable(services::Status &st);
423 RowMergedNumericTable(const NumericTablePtr &table, services::Status &st);
425 typedef services::SharedPtr<RowMergedNumericTable> RowMergedNumericTablePtr;
428 using interface1::RowMergedNumericTable;
429 using interface1::RowMergedNumericTablePtr;
daal
Definition: algorithm_base_common.h:31
daal::data_management::interface1::RowMergedNumericTable::getBlockOfRows
services::Status getBlockOfRows(size_t vector_idx, size_t vector_num, ReadWriteMode rwflag, BlockDescriptor< int > &block) DAAL_C11_OVERRIDE
Definition: row_merged_numeric_table.h:159
daal::data_management::interface1::RowMergedNumericTable::addNumericTable
services::Status addNumericTable(NumericTablePtr table)
Definition: row_merged_numeric_table.h:83
daal::data_management::interface1::RowMergedNumericTable::releaseBlockOfColumnValues
services::Status releaseBlockOfColumnValues(BlockDescriptor< double > &block) DAAL_C11_OVERRIDE
Definition: row_merged_numeric_table.h:194
daal::services::ErrorMemoryAllocationFailed
Definition: error_indexes.h:147
daal::data_management::interface1::RowMergedNumericTable::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: row_merged_numeric_table.h:178
daal::dram
Definition: daal_defines.h:147
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::RowMergedNumericTable::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: row_merged_numeric_table.h:188
daal::data_management::interface1::RowMergedNumericTable::releaseBlockOfColumnValues
services::Status releaseBlockOfColumnValues(BlockDescriptor< int > &block) DAAL_C11_OVERRIDE
Definition: row_merged_numeric_table.h:202
daal::data_management::interface1::NumericTableIface::MemoryStatus
MemoryStatus
Enumeration to specify the status of memory related to the Numeric Table.
Definition: numeric_table.h:272
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::RowMergedNumericTable::releaseBlockOfRows
services::Status releaseBlockOfRows(BlockDescriptor< int > &block) DAAL_C11_OVERRIDE
Definition: row_merged_numeric_table.h:173
daal::data_management::interface1::RowMergedNumericTable::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: row_merged_numeric_table.h:183
daal::data_management::interface1::RowMergedNumericTable::getDataMemoryStatus
MemoryStatus getDataMemoryStatus() const DAAL_C11_OVERRIDE
Definition: row_merged_numeric_table.h:130
daal::services::ErrorIncorrectTypeOfInputNumericTable
Definition: error_indexes.h:91
daal::data_management::interface1::RowMergedNumericTable::getBlockOfRows
services::Status getBlockOfRows(size_t vector_idx, size_t vector_num, ReadWriteMode rwflag, BlockDescriptor< float > &block) DAAL_C11_OVERRIDE
Definition: row_merged_numeric_table.h:154
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::data_management::interface1::RowMergedNumericTable::getBlockOfRows
services::Status getBlockOfRows(size_t vector_idx, size_t vector_num, ReadWriteMode rwflag, BlockDescriptor< double > &block) DAAL_C11_OVERRIDE
Definition: row_merged_numeric_table.h:149
daal::data_management::interface1::RowMergedNumericTable
Class that provides methods to access a collection of numeric tables as if they are joined by rows...
Definition: row_merged_numeric_table.h:46
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:186
daal::data_management::interface1::RowMergedNumericTable::releaseBlockOfRows
services::Status releaseBlockOfRows(BlockDescriptor< float > &block) DAAL_C11_OVERRIDE
Definition: row_merged_numeric_table.h:169
daal::data_management::interface1::NumericTableFeature
Data structure describes the Numeric Table feature.
Definition: data_dictionary.h:51
daal::data_management::interface1::NumericTable::getDataMemoryStatus
virtual MemoryStatus getDataMemoryStatus() const
Definition: numeric_table.h:720
daal::MemType
MemType
Definition: daal_defines.h:145
daal::data_management::interface1::RowMergedNumericTable::resize
services::Status resize(size_t nrows) DAAL_C11_OVERRIDE
Definition: row_merged_numeric_table.h:125
daal::data_management::interface1::RowMergedNumericTable::releaseBlockOfColumnValues
services::Status releaseBlockOfColumnValues(BlockDescriptor< float > &block) DAAL_C11_OVERRIDE
Definition: row_merged_numeric_table.h:198
daal::services::ErrorMethodNotSupported
Definition: error_indexes.h:69
daal::data_management::interface1::RowMergedNumericTable::releaseBlockOfRows
services::Status releaseBlockOfRows(BlockDescriptor< double > &block) DAAL_C11_OVERRIDE
Definition: row_merged_numeric_table.h:165