49 #ifndef __ROW_MERGED_NUMERIC_TABLE_H__
50 #define __ROW_MERGED_NUMERIC_TABLE_H__
52 #include "data_management/data/numeric_table.h"
53 #include "services/daal_memory.h"
54 #include "services/daal_defines.h"
55 #include "data_management/data/data_serialize.h"
59 namespace data_management
72 class DAAL_EXPORT RowMergedNumericTable :
public NumericTable
75 DECLARE_SERIALIZABLE_TAG();
76 DECLARE_SERIALIZABLE_IMPL();
82 RowMergedNumericTable();
89 RowMergedNumericTable(NumericTablePtr table);
95 static services::SharedPtr<RowMergedNumericTable> create(services::Status *stat = NULL);
102 static services::SharedPtr<RowMergedNumericTable> create(
const NumericTablePtr &nestedTable,
103 services::Status *stat = NULL);
109 services::Status addNumericTable(NumericTablePtr table)
111 if (table->getDataLayout() & csrArray)
112 return services::Status(services::ErrorIncorrectTypeOfInputNumericTable);
114 size_t ncols = getNumberOfColumns();
115 size_t cols = table->getNumberOfColumns();
117 if (ncols != 0 && ncols != cols)
118 return services::Status(services::ErrorIncorrectNumberOfFeatures);
120 _tables->push_back(table);
124 DictionaryIface::FeaturesEqual featuresEqual = table->getDictionarySharedPtr()->getFeaturesEqual();
126 _ddict = NumericTableDictionary::create(ncols, featuresEqual, &s);
129 s = setNumberOfColumnsImpl(cols);
132 if (featuresEqual == DictionaryIface::equal)
134 NumericTableFeature &f = table->getDictionarySharedPtr()->operator[](0);
135 _ddict->setFeature(f, 0);
139 for (
size_t i = 0; i < cols; i++)
141 NumericTableFeature &f = table->getDictionarySharedPtr()->operator[](i);
142 _ddict->setFeature(f, i);
147 size_t obs = table->getNumberOfRows();
148 return setNumberOfRowsImpl(_obsnum + obs);
151 services::Status resize(
size_t nrows) DAAL_C11_OVERRIDE
153 return services::Status(services::throwIfPossible(services::ErrorMethodNotSupported));
156 MemoryStatus getDataMemoryStatus() const DAAL_C11_OVERRIDE
158 if (_tables->size() == 0)
163 for (
size_t i = 0;i < _tables->size(); i++)
165 NumericTable* nt = (NumericTable*)(_tables->operator[](i).get());
166 if (nt->getDataMemoryStatus() == notAllocated)
172 return internallyAllocated;
175 services::Status getBlockOfRows(
size_t vector_idx,
size_t vector_num,
176 ReadWriteMode rwflag, BlockDescriptor<double>& block) DAAL_C11_OVERRIDE
178 return getTBlock<double>(vector_idx, vector_num, rwflag, block);
180 services::Status getBlockOfRows(
size_t vector_idx,
size_t vector_num,
181 ReadWriteMode rwflag, BlockDescriptor<float>& block) DAAL_C11_OVERRIDE
183 return getTBlock<float>(vector_idx, vector_num, rwflag, block);
185 services::Status getBlockOfRows(
size_t vector_idx,
size_t vector_num,
186 ReadWriteMode rwflag, BlockDescriptor<int>& block) DAAL_C11_OVERRIDE
188 return getTBlock<int>(vector_idx, vector_num, rwflag, block);
191 services::Status releaseBlockOfRows(BlockDescriptor<double>& block) DAAL_C11_OVERRIDE
193 return releaseTBlock<double>(block);
195 services::Status releaseBlockOfRows(BlockDescriptor<float>& block) DAAL_C11_OVERRIDE
197 return releaseTBlock<float>(block);
199 services::Status releaseBlockOfRows(BlockDescriptor<int>& block) DAAL_C11_OVERRIDE
201 return releaseTBlock<int>(block);
204 services::Status getBlockOfColumnValues(
size_t feature_idx,
size_t vector_idx,
size_t value_num,
205 ReadWriteMode rwflag, BlockDescriptor<double>& block) DAAL_C11_OVERRIDE
207 return getTFeature<double>(feature_idx, vector_idx, value_num, rwflag, block);
209 services::Status getBlockOfColumnValues(
size_t feature_idx,
size_t vector_idx,
size_t value_num,
210 ReadWriteMode rwflag, BlockDescriptor<float>& block) DAAL_C11_OVERRIDE
212 return getTFeature<float>(feature_idx, vector_idx, value_num, rwflag, block);
214 services::Status getBlockOfColumnValues(
size_t feature_idx,
size_t vector_idx,
size_t value_num,
215 ReadWriteMode rwflag, BlockDescriptor<int>& block) DAAL_C11_OVERRIDE
217 return getTFeature<int>(feature_idx, vector_idx, value_num, rwflag, block);
220 services::Status releaseBlockOfColumnValues(BlockDescriptor<double>& block) DAAL_C11_OVERRIDE
222 return releaseTFeature<double>(block);
224 services::Status releaseBlockOfColumnValues(BlockDescriptor<float>& block) DAAL_C11_OVERRIDE
226 return releaseTFeature<float>(block);
228 services::Status releaseBlockOfColumnValues(BlockDescriptor<int>& block) DAAL_C11_OVERRIDE
230 return releaseTFeature<int>(block);
235 template<
typename Archive,
bool onDeserialize>
236 services::Status serialImpl( Archive *arch )
238 NumericTable::serialImpl<Archive, onDeserialize>( arch );
240 arch->setSharedPtrObj(_tables);
242 return services::Status();
247 void internal_inner_repack(
size_t idx,
size_t rows,
size_t ncols, T *src, T *dst )
251 for(i = 0; i < rows; i++)
253 for(j = 0; j < ncols; j++)
255 dst[(idx + i) * ncols + j] = src[i * ncols + j];
261 void internal_outer_repack(
size_t idx,
size_t rows,
size_t ncols, T *src, T *dst )
265 for(i = 0; i < rows; i++)
267 for(j = 0; j < ncols; j++)
269 dst[i * ncols + j] = src[(i + idx) * ncols + j];
275 template <
typename T>
276 services::Status getTBlock(
size_t idx,
size_t nrows,
int rwFlag, BlockDescriptor<T>& block)
279 size_t ncols = getNumberOfColumns();
280 size_t nobs = getNumberOfRows();
281 block.setDetails( 0, idx, rwFlag );
285 block.resizeBuffer( ncols, 0 );
286 return services::Status();
289 nrows = ( idx + nrows < nobs ) ? nrows : nobs - idx;
291 if( !block.resizeBuffer( ncols, nrows ) )
292 return services::Status(services::ErrorMemoryAllocationFailed);
294 if( rwFlag & (
int)readOnly )
297 BlockDescriptor<T> innerBlock;
298 for (
size_t k = 0; k < _tables->size() && rows < idx + nrows; k++)
300 NumericTable* nt = (NumericTable*)(_tables->operator[](k).get());
301 size_t lrows = nt->getNumberOfRows();
303 if (rows + lrows > idx)
305 size_t idxBegin = (rows < idx) ? idx : rows;
306 size_t idxEnd = (rows + lrows < idx + nrows) ? rows + lrows : idx + nrows;
307 s |= nt->getBlockOfRows(idxBegin - rows, idxEnd - idxBegin, readOnly, innerBlock);
309 internal_inner_repack<T>( idxBegin - idx, idxEnd - idxBegin, ncols, innerBlock.getBlockPtr(), block.getBlockPtr());
311 s |= nt->releaseBlockOfRows(innerBlock);
320 template <
typename T>
321 services::Status releaseTBlock(BlockDescriptor<T>& block)
324 if(block.getRWFlag() & (int)writeOnly)
326 size_t ncols = getNumberOfColumns();
327 size_t nrows = block.getNumberOfRows();
328 size_t idx = block.getRowsOffset();
330 BlockDescriptor<T> innerBlock;
331 for (
size_t k = 0; k < _tables->size() && rows < idx + nrows; k++)
333 NumericTable* nt = (NumericTable*)(_tables->operator[](k).get());
334 size_t lrows = nt->getNumberOfRows();
336 if (rows + lrows > idx)
338 size_t idxBegin = (rows < idx) ? idx : rows;
339 size_t idxEnd = (rows + lrows < idx + nrows) ? rows + lrows : idx + nrows;
340 s |= nt->getBlockOfRows(idxBegin - rows, idxEnd - idxBegin, writeOnly, innerBlock);
342 internal_outer_repack<T>( idxBegin - idx, idxEnd - idxBegin, ncols, block.getBlockPtr(), innerBlock.getBlockPtr());
344 s |= nt->releaseBlockOfRows(innerBlock);
354 template <
typename T>
355 services::Status getTFeature(
size_t feat_idx,
size_t idx,
size_t nrows,
int rwFlag, BlockDescriptor<T>& block)
358 size_t ncols = getNumberOfColumns();
359 size_t nobs = getNumberOfRows();
360 block.setDetails( feat_idx, idx, rwFlag );
364 block.resizeBuffer( 1, 0 );
365 return services::Status();
368 nrows = ( idx + nrows < nobs ) ? nrows : nobs - idx;
369 if( !block.resizeBuffer( 1, nrows ) )
370 return services::Status(services::ErrorMemoryAllocationFailed);
372 if( rwFlag & (
int)readOnly )
374 T* buffer = block.getBlockPtr();
376 for (
size_t k = 0; k < _tables->size() && rows < idx + nrows; k++)
378 NumericTable* nt = (NumericTable*)(_tables->operator[](k).get());
379 size_t lrows = nt->getNumberOfRows();
381 if (rows + lrows > idx)
383 size_t idxBegin = (rows < idx) ? idx : rows;
384 size_t idxEnd = (rows + lrows < idx + nrows) ? rows + lrows : idx + nrows;
386 BlockDescriptor<T> innerBlock;
387 s |= nt->getBlockOfColumnValues(feat_idx, idxBegin - rows, idxEnd - idxBegin, readOnly, innerBlock);
388 T* location = innerBlock.getBlockPtr();
389 for (
size_t i = idxBegin; i < idxEnd; i++)
391 buffer[i] = location[i - idxBegin];
393 s |= nt->releaseBlockOfColumnValues(innerBlock);
402 template <
typename T>
403 services::Status releaseTFeature( BlockDescriptor<T>& block )
406 if (block.getRWFlag() & (int)writeOnly)
408 size_t feat_idx = block.getColumnsOffset();
409 size_t idx = block.getRowsOffset();
410 size_t nrows = block.getNumberOfRows();
412 T* buffer = block.getBlockPtr();
413 for (
size_t k = 0; k < _tables->size() && rows < idx + nrows; k++)
415 NumericTable* nt = (NumericTable*)(_tables->operator[](k).get());
416 size_t lrows = nt->getNumberOfRows();
418 if (rows + lrows > idx)
420 size_t idxBegin = (rows < idx) ? idx : rows;
421 size_t idxEnd = (rows + lrows < idx + nrows) ? rows + lrows : idx + nrows;
423 BlockDescriptor<T> innerBlock;
424 s |= nt->getBlockOfColumnValues(feat_idx, idxBegin - rows, idxEnd - idxBegin, writeOnly, innerBlock);
425 T* location = innerBlock.getBlockPtr();
426 for (
size_t i = idxBegin; i < idxEnd; i++)
428 location[i - idxBegin] = buffer[i];
430 s |= nt->releaseBlockOfColumnValues(innerBlock);
440 services::Status setNumberOfColumnsImpl(
size_t ncols) DAAL_C11_OVERRIDE;
441 services::Status allocateDataMemoryImpl(daal::MemType type = daal::dram) DAAL_C11_OVERRIDE;
442 void freeDataMemoryImpl() DAAL_C11_OVERRIDE;
445 DataCollectionPtr _tables;
447 RowMergedNumericTable(services::Status &st);
449 RowMergedNumericTable(const NumericTablePtr &table, services::Status &st);
451 typedef services::SharedPtr<RowMergedNumericTable> RowMergedNumericTablePtr;
454 using interface1::RowMergedNumericTable;
455 using interface1::RowMergedNumericTablePtr;
daal
Definition: algorithm_base_common.h:57
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:185
daal::data_management::interface1::RowMergedNumericTable::addNumericTable
services::Status addNumericTable(NumericTablePtr table)
Definition: row_merged_numeric_table.h:109
daal::data_management::interface1::RowMergedNumericTable::releaseBlockOfColumnValues
services::Status releaseBlockOfColumnValues(BlockDescriptor< double > &block) DAAL_C11_OVERRIDE
Definition: row_merged_numeric_table.h:220
daal::services::ErrorMemoryAllocationFailed
Definition: error_indexes.h:170
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:204
daal::dram
Definition: daal_defines.h:158
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::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:214
daal::data_management::interface1::RowMergedNumericTable::releaseBlockOfColumnValues
services::Status releaseBlockOfColumnValues(BlockDescriptor< int > &block) DAAL_C11_OVERRIDE
Definition: row_merged_numeric_table.h:228
daal::data_management::interface1::NumericTableIface::MemoryStatus
MemoryStatus
Enumeration to specify the status of memory related to the Numeric Table.
Definition: numeric_table.h:298
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::RowMergedNumericTable::releaseBlockOfRows
services::Status releaseBlockOfRows(BlockDescriptor< int > &block) DAAL_C11_OVERRIDE
Definition: row_merged_numeric_table.h:199
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:209
daal::data_management::interface1::RowMergedNumericTable::getDataMemoryStatus
MemoryStatus getDataMemoryStatus() const DAAL_C11_OVERRIDE
Definition: row_merged_numeric_table.h:156
daal::services::ErrorIncorrectTypeOfInputNumericTable
Definition: error_indexes.h:117
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:180
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::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:175
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:72
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:209
daal::data_management::interface1::RowMergedNumericTable::releaseBlockOfRows
services::Status releaseBlockOfRows(BlockDescriptor< float > &block) DAAL_C11_OVERRIDE
Definition: row_merged_numeric_table.h:195
daal::data_management::interface1::NumericTableFeature
Data structure describes the Numeric Table feature.
Definition: data_dictionary.h:74
daal::data_management::interface1::NumericTable::getDataMemoryStatus
virtual MemoryStatus getDataMemoryStatus() const
Definition: numeric_table.h:745
daal::MemType
MemType
Definition: daal_defines.h:156
daal::data_management::interface1::RowMergedNumericTable::resize
services::Status resize(size_t nrows) DAAL_C11_OVERRIDE
Definition: row_merged_numeric_table.h:151
daal::data_management::interface1::RowMergedNumericTable::releaseBlockOfColumnValues
services::Status releaseBlockOfColumnValues(BlockDescriptor< float > &block) DAAL_C11_OVERRIDE
Definition: row_merged_numeric_table.h:224
daal::services::ErrorMethodNotSupported
Definition: error_indexes.h:95
daal::data_management::interface1::RowMergedNumericTable::releaseBlockOfRows
services::Status releaseBlockOfRows(BlockDescriptor< double > &block) DAAL_C11_OVERRIDE
Definition: row_merged_numeric_table.h:191