49 #ifndef __MERGED_NUMERIC_TABLE_H__
50 #define __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 MergedNumericTable :
public NumericTable
75 DECLARE_SERIALIZABLE_TAG();
76 DECLARE_SERIALIZABLE_IMPL();
89 MergedNumericTable(NumericTablePtr table);
97 MergedNumericTable(NumericTablePtr first, NumericTablePtr second);
103 static services::SharedPtr<MergedNumericTable> create(services::Status *stat = NULL);
111 static services::SharedPtr<MergedNumericTable> create(
const NumericTablePtr &nestedTable,
112 services::Status *stat = NULL);
121 static services::SharedPtr<MergedNumericTable> create(
const NumericTablePtr &first,
122 const NumericTablePtr &second,
123 services::Status *stat = NULL);
129 services::Status addNumericTable(NumericTablePtr table)
131 if (table->getDataLayout() & csrArray)
132 return services::Status(services::ErrorIncorrectTypeOfInputNumericTable);
134 _tables->push_back(table);
136 size_t ncols = getNumberOfColumns();
137 size_t cols = table->getNumberOfColumns();
140 DAAL_CHECK_STATUS(s, setNumberOfColumnsImpl(ncols + cols));
142 for (
size_t i = 0; i < cols; i++)
144 NumericTableFeature &f = table->getDictionarySharedPtr()->operator[](i);
145 _ddict->setFeature(f, ncols + i);
148 size_t obs = table->getNumberOfRows();
151 if (obs < _obsnum || _tables->size() == 1)
155 DAAL_CHECK_STATUS(s, setNumberOfRowsImpl(_obsnum));
161 services::Status resize(
size_t nrow) DAAL_C11_OVERRIDE
163 for (
size_t i = 0;i < _tables->size(); i++)
165 NumericTable* nt = (NumericTable*)(_tables->operator[](i).get());
166 services::Status s = nt->resize(nrow);
171 return services::Status();
174 MemoryStatus getDataMemoryStatus() const DAAL_C11_OVERRIDE
176 if (_tables->size() == 0)
181 for (
size_t i = 0;i < _tables->size(); i++)
183 NumericTable* nt = (NumericTable*)(_tables->operator[](i).get());
184 if (nt->getDataMemoryStatus() == notAllocated)
190 return internallyAllocated;
193 services::Status getBlockOfRows(
size_t vector_idx,
size_t vector_num,
194 ReadWriteMode rwflag, BlockDescriptor<double>& block) DAAL_C11_OVERRIDE
196 return getTBlock<double>(vector_idx, vector_num, rwflag, block);
198 services::Status getBlockOfRows(
size_t vector_idx,
size_t vector_num,
199 ReadWriteMode rwflag, BlockDescriptor<float>& block) DAAL_C11_OVERRIDE
201 return getTBlock<float>(vector_idx, vector_num, rwflag, block);
203 services::Status getBlockOfRows(
size_t vector_idx,
size_t vector_num,
204 ReadWriteMode rwflag, BlockDescriptor<int>& block) DAAL_C11_OVERRIDE
206 return getTBlock<int>(vector_idx, vector_num, rwflag, block);
209 services::Status releaseBlockOfRows(BlockDescriptor<double>& block) DAAL_C11_OVERRIDE
211 return releaseTBlock<double>(block);
213 services::Status releaseBlockOfRows(BlockDescriptor<float>& block) DAAL_C11_OVERRIDE
215 return releaseTBlock<float>(block);
217 services::Status releaseBlockOfRows(BlockDescriptor<int>& block) DAAL_C11_OVERRIDE
219 return releaseTBlock<int>(block);
222 services::Status getBlockOfColumnValues(
size_t feature_idx,
size_t vector_idx,
size_t value_num,
223 ReadWriteMode rwflag, BlockDescriptor<double>& block) DAAL_C11_OVERRIDE
225 return getTFeature<double>(feature_idx, vector_idx, value_num, rwflag, block);
227 services::Status getBlockOfColumnValues(
size_t feature_idx,
size_t vector_idx,
size_t value_num,
228 ReadWriteMode rwflag, BlockDescriptor<float>& block) DAAL_C11_OVERRIDE
230 return getTFeature<float>(feature_idx, vector_idx, value_num, rwflag, block);
232 services::Status getBlockOfColumnValues(
size_t feature_idx,
size_t vector_idx,
size_t value_num,
233 ReadWriteMode rwflag, BlockDescriptor<int>& block) DAAL_C11_OVERRIDE
235 return getTFeature<int>(feature_idx, vector_idx, value_num, rwflag, block);
238 services::Status releaseBlockOfColumnValues(BlockDescriptor<double>& block) DAAL_C11_OVERRIDE
240 return releaseTFeature<double>(block);
242 services::Status releaseBlockOfColumnValues(BlockDescriptor<float>& block) DAAL_C11_OVERRIDE
244 return releaseTFeature<float>(block);
246 services::Status releaseBlockOfColumnValues(BlockDescriptor<int>& block) DAAL_C11_OVERRIDE
248 return releaseTFeature<int>(block);
251 services::Status allocateBasicStatistics() DAAL_C11_OVERRIDE
253 size_t ncols = getNumberOfColumns();
254 size_t ntables = _tables->size();
255 services::SharedPtr<MergedNumericTable> minMergeNT (
new MergedNumericTable());
256 services::SharedPtr<MergedNumericTable> maxMergeNT (
new MergedNumericTable());
257 services::SharedPtr<MergedNumericTable> sumMergeNT (
new MergedNumericTable());
258 services::SharedPtr<MergedNumericTable> sumSqMergeNT (
new MergedNumericTable());
259 for (
size_t i = 0; i < ntables; i++) {
260 NumericTable* nt = (NumericTable*)(_tables->operator[](i).get());
261 nt->allocateBasicStatistics();
262 minMergeNT->addNumericTable(nt->basicStatistics.get(NumericTable::minimum));
263 maxMergeNT->addNumericTable(nt->basicStatistics.get(NumericTable::maximum));
264 sumMergeNT->addNumericTable(nt->basicStatistics.get(NumericTable::sum));
265 sumSqMergeNT->addNumericTable(nt->basicStatistics.get(NumericTable::sumSquares));
267 if (basicStatistics.get(NumericTable::minimum).get() == NULL ||
268 basicStatistics.get(NumericTable::minimum)->getNumberOfColumns() != ncols)
270 basicStatistics.set(NumericTable::minimum, minMergeNT);
272 if (basicStatistics.get(NumericTable::maximum).get() == NULL ||
273 basicStatistics.get(NumericTable::maximum)->getNumberOfColumns() != ncols)
275 basicStatistics.set(NumericTable::maximum, maxMergeNT);
277 if (basicStatistics.get(NumericTable::sum).get() == NULL ||
278 basicStatistics.get(NumericTable::sum)->getNumberOfColumns() != ncols)
280 basicStatistics.set(NumericTable::sum, sumMergeNT);
282 if (basicStatistics.get(NumericTable::sumSquares).get() == NULL ||
283 basicStatistics.get(NumericTable::sumSquares)->getNumberOfColumns() != ncols)
285 basicStatistics.set(NumericTable::sumSquares, sumSqMergeNT);
287 return services::Status();
291 template<
typename Archive,
bool onDeserialize>
292 services::Status serialImpl( Archive *arch )
294 NumericTable::serialImpl<Archive, onDeserialize>( arch );
296 arch->setSharedPtrObj(_tables);
298 return services::Status();
304 void internal_inner_repack(
size_t pos,
size_t cols,
size_t rows,
size_t ncols, T *src, T *dst )
308 for(i = 0; i < rows; i++)
310 for(j = 0; j < cols; j++)
312 dst[i * ncols + j + pos] = src[i * cols + j];
318 void internal_outer_repack(
size_t pos,
size_t cols,
size_t rows,
size_t ncols, T *src, T *dst )
322 for(i = 0; i < rows; i++)
324 for(j = 0; j < cols; j++)
326 dst[i * cols + j] = src[i * ncols + j + pos];
333 template <
typename T>
334 services::Status getTBlock(
size_t idx,
size_t nrows,
int rwFlag, BlockDescriptor<T>& block )
337 size_t ncols = getNumberOfColumns();
338 size_t nobs = getNumberOfRows();
339 block.setDetails( 0, idx, rwFlag );
343 block.resizeBuffer( ncols, 0 );
344 return services::Status();
347 nrows = ( idx + nrows < nobs ) ? nrows : nobs - idx;
349 if( !block.resizeBuffer( ncols, nrows ) )
350 return services::Status(services::ErrorMemoryAllocationFailed);
352 if( rwFlag & (
int)readOnly )
355 BlockDescriptor<T> innerBlock;
356 for (
size_t k = 0; k < _tables->size(); k++)
358 NumericTable* nt = (NumericTable*)(_tables->operator[](k).get());
359 size_t lcols = nt->getNumberOfColumns();
361 s |= nt->getBlockOfRows(idx, nrows, readOnly, innerBlock);
363 internal_inner_repack<T>( cols, lcols, nrows, ncols, innerBlock.getBlockPtr(), block.getBlockPtr());
365 s |= nt->releaseBlockOfRows(innerBlock);
373 template <
typename T>
374 services::Status releaseTBlock(BlockDescriptor<T>& block)
377 if(block.getRWFlag() & (int)writeOnly)
379 size_t ncols = getNumberOfColumns();
380 size_t nrows = block.getNumberOfRows();
381 size_t offset = block.getRowsOffset();
383 BlockDescriptor<T> innerBlock;
384 for (
size_t k = 0; k < _tables->size(); k++)
386 NumericTable* nt = (NumericTable*)(_tables->operator[](k).get());
387 size_t lcols = nt->getNumberOfColumns();
389 s |= nt->getBlockOfRows(offset, nrows, writeOnly, innerBlock);
391 internal_outer_repack<T>( cols, lcols, nrows, ncols, block.getBlockPtr(), innerBlock.getBlockPtr());
393 s |= nt->releaseBlockOfRows(innerBlock);
402 template <
typename T>
403 services::Status getTFeature(
size_t feat_idx,
size_t idx,
size_t nrows,
int rwFlag, BlockDescriptor<T>& block)
406 size_t ncols = getNumberOfColumns();
407 size_t nobs = getNumberOfRows();
408 block.setDetails( feat_idx, idx, rwFlag );
412 block.resizeBuffer( 1, 0 );
413 return services::Status();
416 nrows = ( idx + nrows < nobs ) ? nrows : nobs - idx;
417 if( !block.resizeBuffer( 1, nrows ) )
418 return services::Status(services::ErrorMemoryAllocationFailed);
420 if( rwFlag & (
int)readOnly )
422 T* buffer = block.getBlockPtr();
423 for (
size_t k = 0; k < _tables->size(); k++)
425 NumericTable* nt = (NumericTable*)(_tables->operator[](k).get());
426 size_t lcols = nt->getNumberOfColumns();
428 if (lcols > feat_idx)
430 BlockDescriptor<T> innerBlock;
431 s |= nt->getBlockOfColumnValues(feat_idx, idx, nrows, readOnly, innerBlock);
432 T* location = innerBlock.getBlockPtr();
433 for (
size_t i = 0; i < nrows; i++)
435 buffer[i] = location[i];
437 s |= nt->releaseBlockOfColumnValues(innerBlock);
447 template <
typename T>
448 services::Status releaseTFeature( BlockDescriptor<T>& block )
451 if (block.getRWFlag() & (int)writeOnly)
453 size_t feat_idx = block.getColumnsOffset();
454 size_t idx = block.getRowsOffset();
455 size_t nrows = block.getNumberOfRows();
456 T* buffer = block.getBlockPtr();
457 for (
size_t k = 0; k < _tables->size(); k++)
459 NumericTable* nt = (NumericTable*)(_tables->operator[](k).get());
460 size_t lcols = nt->getNumberOfColumns();
462 if (lcols > feat_idx)
464 BlockDescriptor<T> innerBlock;
465 s |= nt->getBlockOfColumnValues(feat_idx, idx, nrows, writeOnly, innerBlock);
466 T* location = innerBlock.getBlockPtr();
467 for (
size_t i = 0; i < nrows; i++)
469 location[i] = buffer[i];
471 s |= nt->releaseBlockOfColumnValues(innerBlock);
482 services::Status setNumberOfRowsImpl(
size_t nrow) DAAL_C11_OVERRIDE;
484 services::Status allocateDataMemoryImpl(daal::MemType type = daal::dram) DAAL_C11_OVERRIDE;
486 void freeDataMemoryImpl() DAAL_C11_OVERRIDE;
489 DataCollectionPtr _tables;
491 MergedNumericTable(services::Status &st);
493 MergedNumericTable(const NumericTablePtr &table, services::Status &st);
495 MergedNumericTable(const NumericTablePtr &first, const NumericTablePtr &second, services::Status &st);
497 typedef services::SharedPtr<MergedNumericTable> MergedNumericTablePtr;
500 using interface1::MergedNumericTable;
501 using interface1::MergedNumericTablePtr;
daal::data_management::interface1::MergedNumericTable::releaseBlockOfColumnValues
services::Status releaseBlockOfColumnValues(BlockDescriptor< int > &block) DAAL_C11_OVERRIDE
Definition: merged_numeric_table.h:246
daal::data_management::interface1::MergedNumericTable::releaseBlockOfRows
services::Status releaseBlockOfRows(BlockDescriptor< int > &block) DAAL_C11_OVERRIDE
Definition: merged_numeric_table.h:217
daal
Definition: algorithm_base_common.h:57
daal::services::ErrorMemoryAllocationFailed
Definition: error_indexes.h:170
daal::dram
Definition: daal_defines.h:158
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:198
daal::data_management::interface1::MergedNumericTable::allocateBasicStatistics
services::Status allocateBasicStatistics() DAAL_C11_OVERRIDE
Definition: merged_numeric_table.h:251
daal::algorithms::multivariate_outlier_detection::location
Definition: outlier_detection_multivariate_types.h:98
daal::data_management::interface1::NumericTableIface::minimum
Definition: numeric_table.h:322
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:161
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::MergedNumericTable::releaseBlockOfColumnValues
services::Status releaseBlockOfColumnValues(BlockDescriptor< double > &block) DAAL_C11_OVERRIDE
Definition: merged_numeric_table.h:238
daal::data_management::interface1::NumericTable::resize
virtual services::Status resize(size_t nrows) DAAL_C11_OVERRIDE
Definition: numeric_table.h:662
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:203
daal::data_management::interface1::MergedNumericTable::releaseBlockOfRows
services::Status releaseBlockOfRows(BlockDescriptor< float > &block) DAAL_C11_OVERRIDE
Definition: merged_numeric_table.h:213
daal::services::ErrorIncorrectTypeOfInputNumericTable
Definition: error_indexes.h:117
daal::data_management::interface1::NumericTableIface::maximum
Definition: numeric_table.h:323
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:72
daal::data_management::interface1::MergedNumericTable::releaseBlockOfColumnValues
services::Status releaseBlockOfColumnValues(BlockDescriptor< float > &block) DAAL_C11_OVERRIDE
Definition: merged_numeric_table.h:242
daal::data_management::interface1::MergedNumericTable::releaseBlockOfRows
services::Status releaseBlockOfRows(BlockDescriptor< double > &block) DAAL_C11_OVERRIDE
Definition: merged_numeric_table.h:209
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:193
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::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:222
daal::data_management::interface1::NumericTableIface::sum
Definition: numeric_table.h:324
daal::algorithms::implicit_als::training::offset
Definition: implicit_als_training_types.h:174
daal::data_management::interface1::NumericTableIface::sumSquares
Definition: numeric_table.h:325
daal::data_management::interface1::MergedNumericTable::addNumericTable
services::Status addNumericTable(NumericTablePtr table)
Definition: merged_numeric_table.h:129
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:232
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:227
daal::data_management::interface1::MergedNumericTable::getDataMemoryStatus
MemoryStatus getDataMemoryStatus() const DAAL_C11_OVERRIDE
Definition: merged_numeric_table.h:174
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