You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
171 lines
5.1 KiB
C++
171 lines
5.1 KiB
C++
/*=========================================================================
|
|
|
|
Program: Visualization Toolkit
|
|
Module: vtkReduceTable.h
|
|
|
|
Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
|
|
All rights reserved.
|
|
See Copyright.txt or http://www.kitware.com/Copyright.htm for details.
|
|
|
|
This software is distributed WITHOUT ANY WARRANTY; without even
|
|
the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
|
|
PURPOSE. See the above copyright notice for more information.
|
|
|
|
=========================================================================*/
|
|
/**
|
|
* @class vtkReduceTable
|
|
* @brief combine some of the rows of a table
|
|
*
|
|
*
|
|
* Collapses the rows of the input table so that one particular
|
|
* column (the IndexColumn) does not contain any duplicate values.
|
|
* Thus the output table will have the same columns as the input
|
|
* table, but potentially fewer rows. One example use of this
|
|
* class would be to generate a summary table from a table of
|
|
* observations.
|
|
* When two or more rows of the input table share a value in the
|
|
* IndexColumn, the values from these rows will be combined on a
|
|
* column-by-column basis. By default, such numerical values will be
|
|
* reduced to their mean, and non-numerical values will be reduced to
|
|
* their mode. This default behavior can be changed by calling
|
|
* SetNumericalReductionMethod() or SetNonNumericalReductionMethod().
|
|
* You can also specify the reduction method to use for a particular
|
|
* column by calling SetReductionMethodForColumn().
|
|
*/
|
|
|
|
#ifndef vtkReduceTable_h
|
|
#define vtkReduceTable_h
|
|
|
|
#include "vtkInfovisCoreModule.h" // For export macro
|
|
#include "vtkTableAlgorithm.h"
|
|
|
|
#include <map> // For ivar
|
|
#include <set> // For ivar
|
|
#include <vector> // For ivar
|
|
|
|
class vtkVariant;
|
|
|
|
class VTKINFOVISCORE_EXPORT vtkReduceTable : public vtkTableAlgorithm
|
|
{
|
|
public:
|
|
static vtkReduceTable* New();
|
|
vtkTypeMacro(vtkReduceTable, vtkTableAlgorithm);
|
|
void PrintSelf(ostream& os, vtkIndent indent) override;
|
|
|
|
//@{
|
|
/**
|
|
* Get/Set the column that will be used to reduce the input table.
|
|
* Any rows sharing a value in this column will be collapsed into
|
|
* a single row in the output table.
|
|
*/
|
|
vtkGetMacro(IndexColumn, vtkIdType);
|
|
vtkSetMacro(IndexColumn, vtkIdType);
|
|
//@}
|
|
|
|
//@{
|
|
/**
|
|
* Get/Set the method that should be used to combine numerical
|
|
* values.
|
|
*/
|
|
vtkGetMacro(NumericalReductionMethod, int);
|
|
vtkSetMacro(NumericalReductionMethod, int);
|
|
//@}
|
|
|
|
//@{
|
|
/**
|
|
* Get/Set the method that should be used to combine non-numerical
|
|
* values.
|
|
*/
|
|
vtkGetMacro(NonNumericalReductionMethod, int);
|
|
vtkSetMacro(NonNumericalReductionMethod, int);
|
|
//@}
|
|
|
|
/**
|
|
* Get the method that should be used to combine the values within
|
|
* the specified column. Returns -1 if no method has been set for
|
|
* this particular column.
|
|
*/
|
|
int GetReductionMethodForColumn(vtkIdType col);
|
|
|
|
/**
|
|
* Set the method that should be used to combine the values within
|
|
* the specified column.
|
|
*/
|
|
void SetReductionMethodForColumn(vtkIdType col, int method);
|
|
|
|
/**
|
|
* Enum for methods of reduction
|
|
*/
|
|
enum
|
|
{
|
|
MEAN,
|
|
MEDIAN,
|
|
MODE
|
|
};
|
|
|
|
protected:
|
|
vtkReduceTable();
|
|
~vtkReduceTable() override;
|
|
|
|
int RequestData(vtkInformation*, vtkInformationVector**, vtkInformationVector*) override;
|
|
|
|
/**
|
|
* Initialize the output table to have the same types of columns as
|
|
* the input table, but no rows.
|
|
*/
|
|
void InitializeOutputTable(vtkTable* input, vtkTable* output);
|
|
|
|
/**
|
|
* Find the distinct values in the input table's index column.
|
|
* This function also populates the mapping of new row IDs to old row IDs.
|
|
*/
|
|
void AccumulateIndexValues(vtkTable* input);
|
|
|
|
/**
|
|
* Populate the index column of the output table.
|
|
*/
|
|
void PopulateIndexColumn(vtkTable* output);
|
|
|
|
/**
|
|
* Populate a non-index column of the output table. This involves
|
|
* potentially combining multiple values from the input table into
|
|
* a single value for the output table.
|
|
*/
|
|
void PopulateDataColumn(vtkTable* input, vtkTable* output, vtkIdType col);
|
|
|
|
/**
|
|
* Find the mean of a series of values from the input table
|
|
* and store it in the output table.
|
|
*/
|
|
void ReduceValuesToMean(vtkTable* input, vtkTable* output, vtkIdType row, vtkIdType col,
|
|
std::vector<vtkIdType> oldRows);
|
|
|
|
/**
|
|
* Find the median of a series of values from the input table
|
|
* and store it in the output table.
|
|
*/
|
|
void ReduceValuesToMedian(vtkTable* input, vtkTable* output, vtkIdType row, vtkIdType col,
|
|
std::vector<vtkIdType> oldRows);
|
|
|
|
/**
|
|
* Find the mode of a series of values from the input table
|
|
* and store it in the output table.
|
|
*/
|
|
void ReduceValuesToMode(vtkTable* input, vtkTable* output, vtkIdType row, vtkIdType col,
|
|
std::vector<vtkIdType> oldRows);
|
|
|
|
vtkIdType IndexColumn;
|
|
std::set<vtkVariant> IndexValues;
|
|
std::map<vtkVariant, std::vector<vtkIdType> > NewRowToOldRowsMap;
|
|
std::map<vtkIdType, int> ColumnReductionMethods;
|
|
|
|
int NumericalReductionMethod;
|
|
int NonNumericalReductionMethod;
|
|
|
|
private:
|
|
vtkReduceTable(const vtkReduceTable&) = delete;
|
|
void operator=(const vtkReduceTable&) = delete;
|
|
};
|
|
|
|
#endif
|