23 #ifndef __MERGED_NUMERIC_TABLE_H__
24 #define __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 MergedNumericTable :
public NumericTable
49 DECLARE_SERIALIZABLE_TAG();
50 DECLARE_SERIALIZABLE_IMPL();
63 MergedNumericTable(NumericTablePtr table);
71 MergedNumericTable(NumericTablePtr first, NumericTablePtr second);
77 static services::SharedPtr<MergedNumericTable> create(services::Status *stat = NULL);
85 static services::SharedPtr<MergedNumericTable> create(
const NumericTablePtr &nestedTable,
86 services::Status *stat = NULL);
95 static services::SharedPtr<MergedNumericTable> create(
const NumericTablePtr &first,
96 const NumericTablePtr &second,
97 services::Status *stat = NULL);
103 services::Status addNumericTable(NumericTablePtr table)
105 if (table->getDataLayout() & csrArray)
106 return services::Status(services::ErrorIncorrectTypeOfInputNumericTable);
108 _tables->push_back(table);
110 size_t ncols = getNumberOfColumns();
111 size_t cols = table->getNumberOfColumns();
114 DAAL_CHECK_STATUS(s, setNumberOfColumnsImpl(ncols + cols));
116 for (
size_t i = 0; i < cols; i++)
118 NumericTableFeature &f = table->getDictionarySharedPtr()->operator[](i);
119 _ddict->setFeature(f, ncols + i);
122 size_t obs = table->getNumberOfRows();
125 if (obs < _obsnum || _tables->size() == 1)
129 DAAL_CHECK_STATUS(s, setNumberOfRowsImpl(_obsnum));
135 services::Status resize(
size_t nrow) DAAL_C11_OVERRIDE
137 for (
size_t i = 0;i < _tables->size(); i++)
139 NumericTable* nt = (NumericTable*)(_tables->operator[](i).get());
140 services::Status s = nt->resize(nrow);
145 return services::Status();
148 MemoryStatus getDataMemoryStatus() const DAAL_C11_OVERRIDE
150 if (_tables->size() == 0)
155 for (
size_t i = 0;i < _tables->size(); i++)
157 NumericTable* nt = (NumericTable*)(_tables->operator[](i).get());
158 if (nt->getDataMemoryStatus() == notAllocated)
164 return internallyAllocated;
167 services::Status getBlockOfRows(
size_t vector_idx,
size_t vector_num,
168 ReadWriteMode rwflag, BlockDescriptor<double>& block) DAAL_C11_OVERRIDE
170 return getTBlock<double>(vector_idx, vector_num, rwflag, block);
172 services::Status getBlockOfRows(
size_t vector_idx,
size_t vector_num,
173 ReadWriteMode rwflag, BlockDescriptor<float>& block) DAAL_C11_OVERRIDE
175 return getTBlock<float>(vector_idx, vector_num, rwflag, block);
177 services::Status getBlockOfRows(
size_t vector_idx,
size_t vector_num,
178 ReadWriteMode rwflag, BlockDescriptor<int>& block) DAAL_C11_OVERRIDE
180 return getTBlock<int>(vector_idx, vector_num, rwflag, block);
183 services::Status releaseBlockOfRows(BlockDescriptor<double>& block) DAAL_C11_OVERRIDE
185 return releaseTBlock<double>(block);
187 services::Status releaseBlockOfRows(BlockDescriptor<float>& block) DAAL_C11_OVERRIDE
189 return releaseTBlock<float>(block);
191 services::Status releaseBlockOfRows(BlockDescriptor<int>& block) DAAL_C11_OVERRIDE
193 return releaseTBlock<int>(block);
196 services::Status getBlockOfColumnValues(
size_t feature_idx,
size_t vector_idx,
size_t value_num,
197 ReadWriteMode rwflag, BlockDescriptor<double>& block) DAAL_C11_OVERRIDE
199 return getTFeature<double>(feature_idx, vector_idx, value_num, rwflag, block);
201 services::Status getBlockOfColumnValues(
size_t feature_idx,
size_t vector_idx,
size_t value_num,
202 ReadWriteMode rwflag, BlockDescriptor<float>& block) DAAL_C11_OVERRIDE
204 return getTFeature<float>(feature_idx, vector_idx, value_num, rwflag, block);
206 services::Status getBlockOfColumnValues(
size_t feature_idx,
size_t vector_idx,
size_t value_num,
207 ReadWriteMode rwflag, BlockDescriptor<int>& block) DAAL_C11_OVERRIDE
209 return getTFeature<int>(feature_idx, vector_idx, value_num, rwflag, block);
212 services::Status releaseBlockOfColumnValues(BlockDescriptor<double>& block) DAAL_C11_OVERRIDE
214 return releaseTFeature<double>(block);
216 services::Status releaseBlockOfColumnValues(BlockDescriptor<float>& block) DAAL_C11_OVERRIDE
218 return releaseTFeature<float>(block);
220 services::Status releaseBlockOfColumnValues(BlockDescriptor<int>& block) DAAL_C11_OVERRIDE
222 return releaseTFeature<int>(block);
225 services::Status allocateBasicStatistics() DAAL_C11_OVERRIDE
227 size_t ncols = getNumberOfColumns();
228 size_t ntables = _tables->size();
229 services::SharedPtr<MergedNumericTable> minMergeNT (
new MergedNumericTable());
230 services::SharedPtr<MergedNumericTable> maxMergeNT (
new MergedNumericTable());
231 services::SharedPtr<MergedNumericTable> sumMergeNT (
new MergedNumericTable());
232 services::SharedPtr<MergedNumericTable> sumSqMergeNT (
new MergedNumericTable());
233 for (
size_t i = 0; i < ntables; i++) {
234 NumericTable* nt = (NumericTable*)(_tables->operator[](i).get());
235 nt->allocateBasicStatistics();
236 minMergeNT->addNumericTable(nt->basicStatistics.get(NumericTable::minimum));
237 maxMergeNT->addNumericTable(nt->basicStatistics.get(NumericTable::maximum));
238 sumMergeNT->addNumericTable(nt->basicStatistics.get(NumericTable::sum));
239 sumSqMergeNT->addNumericTable(nt->basicStatistics.get(NumericTable::sumSquares));
241 if (basicStatistics.get(NumericTable::minimum).get() == NULL ||
242 basicStatistics.get(NumericTable::minimum)->getNumberOfColumns() != ncols)
244 basicStatistics.set(NumericTable::minimum, minMergeNT);
246 if (basicStatistics.get(NumericTable::maximum).get() == NULL ||
247 basicStatistics.get(NumericTable::maximum)->getNumberOfColumns() != ncols)
249 basicStatistics.set(NumericTable::maximum, maxMergeNT);
251 if (basicStatistics.get(NumericTable::sum).get() == NULL ||
252 basicStatistics.get(NumericTable::sum)->getNumberOfColumns() != ncols)
254 basicStatistics.set(NumericTable::sum, sumMergeNT);
256 if (basicStatistics.get(NumericTable::sumSquares).get() == NULL ||
257 basicStatistics.get(NumericTable::sumSquares)->getNumberOfColumns() != ncols)
259 basicStatistics.set(NumericTable::sumSquares, sumSqMergeNT);
261 return services::Status();
265 template<
typename Archive,
bool onDeserialize>
266 services::Status serialImpl( Archive *arch )
268 NumericTable::serialImpl<Archive, onDeserialize>( arch );
270 arch->setSharedPtrObj(_tables);
272 return services::Status();
278 void internal_inner_repack(
size_t pos,
size_t cols,
size_t rows,
size_t ncols, T *src, T *dst )
282 for(i = 0; i < rows; i++)
284 for(j = 0; j < cols; j++)
286 dst[i * ncols + j + pos] = src[i * cols + j];
292 void internal_outer_repack(
size_t pos,
size_t cols,
size_t rows,
size_t ncols, T *src, T *dst )
296 for(i = 0; i < rows; i++)
298 for(j = 0; j < cols; j++)
300 dst[i * cols + j] = src[i * ncols + j + pos];
307 template <
typename T>
308 services::Status getTBlock(
size_t idx,
size_t nrows,
int rwFlag, BlockDescriptor<T>& block )
311 size_t ncols = getNumberOfColumns();
312 size_t nobs = getNumberOfRows();
313 block.setDetails( 0, idx, rwFlag );
317 block.resizeBuffer( ncols, 0 );
318 return services::Status();
321 nrows = ( idx + nrows < nobs ) ? nrows : nobs - idx;
323 if( !block.resizeBuffer( ncols, nrows ) )
324 return services::Status(services::ErrorMemoryAllocationFailed);
326 if( rwFlag & (
int)readOnly )
329 BlockDescriptor<T> innerBlock;
330 for (
size_t k = 0; k < _tables->size(); k++)
332 NumericTable* nt = (NumericTable*)(_tables->operator[](k).get());
333 size_t lcols = nt->getNumberOfColumns();
335 s |= nt->getBlockOfRows(idx, nrows, readOnly, innerBlock);
337 internal_inner_repack<T>( cols, lcols, nrows, ncols, innerBlock.getBlockPtr(), block.getBlockPtr());
339 s |= nt->releaseBlockOfRows(innerBlock);
347 template <
typename T>
348 services::Status releaseTBlock(BlockDescriptor<T>& block)
351 if(block.getRWFlag() & (int)writeOnly)
353 size_t ncols = getNumberOfColumns();
354 size_t nrows = block.getNumberOfRows();
355 size_t offset = block.getRowsOffset();
357 BlockDescriptor<T> innerBlock;
358 for (
size_t k = 0; k < _tables->size(); k++)
360 NumericTable* nt = (NumericTable*)(_tables->operator[](k).get());
361 size_t lcols = nt->getNumberOfColumns();
363 s |= nt->getBlockOfRows(offset, nrows, writeOnly, innerBlock);
365 internal_outer_repack<T>( cols, lcols, nrows, ncols, block.getBlockPtr(), innerBlock.getBlockPtr());
367 s |= nt->releaseBlockOfRows(innerBlock);
376 template <
typename T>
377 services::Status getTFeature(
size_t feat_idx,
size_t idx,
size_t nrows,
int rwFlag, BlockDescriptor<T>& block)
380 size_t ncols = getNumberOfColumns();
381 size_t nobs = getNumberOfRows();
382 block.setDetails( feat_idx, idx, rwFlag );
386 block.resizeBuffer( 1, 0 );
387 return services::Status();
390 nrows = ( idx + nrows < nobs ) ? nrows : nobs - idx;
391 if( !block.resizeBuffer( 1, nrows ) )
392 return services::Status(services::ErrorMemoryAllocationFailed);
394 if( rwFlag & (
int)readOnly )
396 T* buffer = block.getBlockPtr();
397 for (
size_t k = 0; k < _tables->size(); k++)
399 NumericTable* nt = (NumericTable*)(_tables->operator[](k).get());
400 size_t lcols = nt->getNumberOfColumns();
402 if (lcols > feat_idx)
404 BlockDescriptor<T> innerBlock;
405 s |= nt->getBlockOfColumnValues(feat_idx, idx, nrows, readOnly, innerBlock);
406 T* location = innerBlock.getBlockPtr();
407 for (
size_t i = 0; i < nrows; i++)
409 buffer[i] = location[i];
411 s |= nt->releaseBlockOfColumnValues(innerBlock);
421 template <
typename T>
422 services::Status releaseTFeature( BlockDescriptor<T>& block )
425 if (block.getRWFlag() & (int)writeOnly)
427 size_t feat_idx = block.getColumnsOffset();
428 size_t idx = block.getRowsOffset();
429 size_t nrows = block.getNumberOfRows();
430 T* buffer = block.getBlockPtr();
431 for (
size_t k = 0; k < _tables->size(); k++)
433 NumericTable* nt = (NumericTable*)(_tables->operator[](k).get());
434 size_t lcols = nt->getNumberOfColumns();
436 if (lcols > feat_idx)
438 BlockDescriptor<T> innerBlock;
439 s |= nt->getBlockOfColumnValues(feat_idx, idx, nrows, writeOnly, innerBlock);
440 T* location = innerBlock.getBlockPtr();
441 for (
size_t i = 0; i < nrows; i++)
443 location[i] = buffer[i];
445 s |= nt->releaseBlockOfColumnValues(innerBlock);
456 services::Status setNumberOfRowsImpl(
size_t nrow) DAAL_C11_OVERRIDE;
458 services::Status allocateDataMemoryImpl(daal::MemType type = daal::dram) DAAL_C11_OVERRIDE;
460 void freeDataMemoryImpl() DAAL_C11_OVERRIDE;
463 DataCollectionPtr _tables;
465 MergedNumericTable(services::Status &st);
467 MergedNumericTable(const NumericTablePtr &table, services::Status &st);
469 MergedNumericTable(const NumericTablePtr &first, const NumericTablePtr &second, services::Status &st);
471 typedef services::SharedPtr<MergedNumericTable> MergedNumericTablePtr;
474 using interface1::MergedNumericTable;
475 using interface1::MergedNumericTablePtr;
daal::data_management::interface1::MergedNumericTable::releaseBlockOfColumnValues
services::Status releaseBlockOfColumnValues(BlockDescriptor< int > &block) DAAL_C11_OVERRIDE
Definition: merged_numeric_table.h:220
daal::data_management::interface1::MergedNumericTable::releaseBlockOfRows
services::Status releaseBlockOfRows(BlockDescriptor< int > &block) DAAL_C11_OVERRIDE
Definition: merged_numeric_table.h:191
daal
Definition: algorithm_base_common.h:31
daal::services::ErrorMemoryAllocationFailed
Definition: error_indexes.h:147
daal::dram
Definition: daal_defines.h:147
daal::data_management::interface1::MergedNumericTable::getBlockOfRows
services::Status getBlockOfRows(size_t vector_idx, size_t vector_num, ReadWriteMode rwflag, BlockDescriptor< float > &block) DAAL_C11_OVERRIDE
Definition: merged_numeric_table.h:172
daal::data_management::interface1::MergedNumericTable::allocateBasicStatistics
services::Status allocateBasicStatistics() DAAL_C11_OVERRIDE
Definition: merged_numeric_table.h:225
daal::algorithms::multivariate_outlier_detection::location
Definition: outlier_detection_multivariate_types.h:72
daal::data_management::interface1::NumericTableIface::minimum
Definition: numeric_table.h:296
daal::data_management::interface1::NumericTable::allocateBasicStatistics
virtual services::Status allocateBasicStatistics() DAAL_C11_OVERRIDE
daal::data_management::interface1::MergedNumericTable::resize
services::Status resize(size_t nrow) DAAL_C11_OVERRIDE
Definition: merged_numeric_table.h:135
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::MergedNumericTable::releaseBlockOfColumnValues
services::Status releaseBlockOfColumnValues(BlockDescriptor< double > &block) DAAL_C11_OVERRIDE
Definition: merged_numeric_table.h:212
daal::data_management::interface1::NumericTable::resize
virtual services::Status resize(size_t nrows) DAAL_C11_OVERRIDE
Definition: numeric_table.h:637
daal::data_management::interface1::MergedNumericTable::getBlockOfRows
services::Status getBlockOfRows(size_t vector_idx, size_t vector_num, ReadWriteMode rwflag, BlockDescriptor< int > &block) DAAL_C11_OVERRIDE
Definition: merged_numeric_table.h:177
daal::data_management::interface1::MergedNumericTable::releaseBlockOfRows
services::Status releaseBlockOfRows(BlockDescriptor< float > &block) DAAL_C11_OVERRIDE
Definition: merged_numeric_table.h:187
daal::services::ErrorIncorrectTypeOfInputNumericTable
Definition: error_indexes.h:91
daal::data_management::interface1::NumericTableIface::maximum
Definition: numeric_table.h:297
daal::data_management::interface1::MergedNumericTable
Class that provides methods to access a collection of numeric tables as if they are joined by columns...
Definition: merged_numeric_table.h:46
daal::data_management::interface1::MergedNumericTable::releaseBlockOfColumnValues
services::Status releaseBlockOfColumnValues(BlockDescriptor< float > &block) DAAL_C11_OVERRIDE
Definition: merged_numeric_table.h:216
daal::data_management::interface1::MergedNumericTable::releaseBlockOfRows
services::Status releaseBlockOfRows(BlockDescriptor< double > &block) DAAL_C11_OVERRIDE
Definition: merged_numeric_table.h:183
daal::data_management::interface1::MergedNumericTable::getBlockOfRows
services::Status getBlockOfRows(size_t vector_idx, size_t vector_num, ReadWriteMode rwflag, BlockDescriptor< double > &block) DAAL_C11_OVERRIDE
Definition: merged_numeric_table.h:167
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::MergedNumericTable::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: merged_numeric_table.h:196
daal::data_management::interface1::NumericTableIface::sum
Definition: numeric_table.h:298
daal::algorithms::implicit_als::training::offset
Definition: implicit_als_training_types.h:148
daal::data_management::interface1::NumericTableIface::sumSquares
Definition: numeric_table.h:299
daal::data_management::interface1::MergedNumericTable::addNumericTable
services::Status addNumericTable(NumericTablePtr table)
Definition: merged_numeric_table.h:103
daal::data_management::interface1::MergedNumericTable::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: merged_numeric_table.h:206
daal::data_management::interface1::MergedNumericTable::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: merged_numeric_table.h:201
daal::data_management::interface1::MergedNumericTable::getDataMemoryStatus
MemoryStatus getDataMemoryStatus() const DAAL_C11_OVERRIDE
Definition: merged_numeric_table.h:148
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