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.
344 lines
12 KiB
C
344 lines
12 KiB
C
3 weeks ago
|
/*=========================================================================
|
||
|
|
||
|
Program: Visualization Toolkit
|
||
|
Module: vtkStatisticsAlgorithm.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.
|
||
|
|
||
|
=========================================================================*/
|
||
|
/*-------------------------------------------------------------------------
|
||
|
Copyright 2011 Sandia Corporation.
|
||
|
Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation,
|
||
|
the U.S. Government retains certain rights in this software.
|
||
|
-------------------------------------------------------------------------*/
|
||
|
/**
|
||
|
* @class vtkStatisticsAlgorithm
|
||
|
* @brief Base class for statistics algorithms
|
||
|
*
|
||
|
*
|
||
|
* All statistics algorithms can conceptually be operated with several operations:
|
||
|
* * Learn: given an input data set, calculate a minimal statistical model (e.g.,
|
||
|
* sums, raw moments, joint probabilities).
|
||
|
* * Derive: given an input minimal statistical model, derive the full model
|
||
|
* (e.g., descriptive statistics, quantiles, correlations, conditional
|
||
|
* probabilities).
|
||
|
* NB: It may be, or not be, a problem that a full model was not derived. For
|
||
|
* instance, when doing parallel calculations, one only wants to derive the full
|
||
|
* model after all partial calculations have completed. On the other hand, one
|
||
|
* can also directly provide a full model, that was previously calculated or
|
||
|
* guessed, and not derive a new one.
|
||
|
* * Assess: given an input data set, input statistics, and some form of
|
||
|
* threshold, assess a subset of the data set.
|
||
|
* * Test: perform at least one statistical test.
|
||
|
* Therefore, a vtkStatisticsAlgorithm has the following ports
|
||
|
* * 3 optional input ports:
|
||
|
* * Data (vtkTable)
|
||
|
* * Parameters to the learn operation (vtkTable)
|
||
|
* * Input model (vtkMultiBlockDataSet)
|
||
|
* * 3 output ports:
|
||
|
* * Data (input annotated with assessments when the Assess operation is ON).
|
||
|
* * Output model (identical to the input model when Learn operation is OFF).
|
||
|
* * Output of statistical tests. Some engines do not offer such tests yet, in
|
||
|
* which case this output will always be empty even when the Test operation is ON.
|
||
|
*
|
||
|
* @par Thanks:
|
||
|
* Thanks to Philippe Pebay and David Thompson from Sandia National Laboratories
|
||
|
* for implementing this class.
|
||
|
* Updated by Philippe Pebay, Kitware SAS 2012
|
||
|
*/
|
||
|
|
||
|
#ifndef vtkStatisticsAlgorithm_h
|
||
|
#define vtkStatisticsAlgorithm_h
|
||
|
|
||
|
#include "vtkFiltersStatisticsModule.h" // For export macro
|
||
|
#include "vtkTableAlgorithm.h"
|
||
|
|
||
|
class vtkDataObjectCollection;
|
||
|
class vtkMultiBlockDataSet;
|
||
|
class vtkStdString;
|
||
|
class vtkStringArray;
|
||
|
class vtkVariant;
|
||
|
class vtkVariantArray;
|
||
|
class vtkDoubleArray;
|
||
|
class vtkStatisticsAlgorithmPrivate;
|
||
|
|
||
|
class VTKFILTERSSTATISTICS_EXPORT vtkStatisticsAlgorithm : public vtkTableAlgorithm
|
||
|
{
|
||
|
public:
|
||
|
vtkTypeMacro(vtkStatisticsAlgorithm, vtkTableAlgorithm);
|
||
|
void PrintSelf(ostream& os, vtkIndent indent) override;
|
||
|
|
||
|
/**
|
||
|
* enumeration values to specify input port types
|
||
|
*/
|
||
|
enum InputPorts
|
||
|
{
|
||
|
INPUT_DATA = 0, //!< Port 0 is for learn data
|
||
|
LEARN_PARAMETERS = 1, //!< Port 1 is for learn parameters (initial guesses, etc.)
|
||
|
INPUT_MODEL = 2 //!< Port 2 is for a priori models
|
||
|
};
|
||
|
|
||
|
/**
|
||
|
* enumeration values to specify output port types
|
||
|
*/
|
||
|
enum OutputIndices
|
||
|
{
|
||
|
OUTPUT_DATA = 0, //!< Output 0 mirrors the input data, plus optional assessment columns
|
||
|
OUTPUT_MODEL = 1, //!< Output 1 contains any generated model
|
||
|
OUTPUT_TEST = 2 //!< Output 2 contains result of statistical test(s)
|
||
|
};
|
||
|
|
||
|
/**
|
||
|
* A convenience method for setting learn input parameters (if one is expected or allowed).
|
||
|
* It is equivalent to calling SetInputConnection( 1, params );
|
||
|
*/
|
||
|
virtual void SetLearnOptionParameterConnection(vtkAlgorithmOutput* params)
|
||
|
{
|
||
|
this->SetInputConnection(vtkStatisticsAlgorithm::LEARN_PARAMETERS, params);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* A convenience method for setting learn input parameters (if one is expected or allowed).
|
||
|
* It is equivalent to calling SetInputData( 1, params );
|
||
|
*/
|
||
|
virtual void SetLearnOptionParameters(vtkDataObject* params)
|
||
|
{
|
||
|
this->SetInputData(vtkStatisticsAlgorithm::LEARN_PARAMETERS, params);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* A convenience method for setting the input model connection (if one is expected or allowed).
|
||
|
* It is equivalent to calling SetInputConnection( 2, model );
|
||
|
*/
|
||
|
virtual void SetInputModelConnection(vtkAlgorithmOutput* model)
|
||
|
{
|
||
|
this->SetInputConnection(vtkStatisticsAlgorithm::INPUT_MODEL, model);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* A convenience method for setting the input model (if one is expected or allowed).
|
||
|
* It is equivalent to calling SetInputData( 2, model );
|
||
|
*/
|
||
|
virtual void SetInputModel(vtkDataObject* model)
|
||
|
{
|
||
|
this->SetInputData(vtkStatisticsAlgorithm::INPUT_MODEL, model);
|
||
|
}
|
||
|
|
||
|
//@{
|
||
|
/**
|
||
|
* Set/Get the Learn operation.
|
||
|
*/
|
||
|
vtkSetMacro(LearnOption, bool);
|
||
|
vtkGetMacro(LearnOption, bool);
|
||
|
//@}
|
||
|
|
||
|
//@{
|
||
|
/**
|
||
|
* Set/Get the Derive operation.
|
||
|
*/
|
||
|
vtkSetMacro(DeriveOption, bool);
|
||
|
vtkGetMacro(DeriveOption, bool);
|
||
|
//@}
|
||
|
|
||
|
//@{
|
||
|
/**
|
||
|
* Set/Get the Assess operation.
|
||
|
*/
|
||
|
vtkSetMacro(AssessOption, bool);
|
||
|
vtkGetMacro(AssessOption, bool);
|
||
|
//@}
|
||
|
|
||
|
//@{
|
||
|
/**
|
||
|
* Set/Get the Test operation.
|
||
|
*/
|
||
|
vtkSetMacro(TestOption, bool);
|
||
|
vtkGetMacro(TestOption, bool);
|
||
|
//@}
|
||
|
|
||
|
//@{
|
||
|
/**
|
||
|
* Set/Get the number of tables in the primary model.
|
||
|
*/
|
||
|
vtkSetMacro(NumberOfPrimaryTables, vtkIdType);
|
||
|
vtkGetMacro(NumberOfPrimaryTables, vtkIdType);
|
||
|
//@}
|
||
|
|
||
|
//@{
|
||
|
/**
|
||
|
* Set/get assessment names.
|
||
|
*/
|
||
|
virtual void SetAssessNames(vtkStringArray*);
|
||
|
vtkGetObjectMacro(AssessNames, vtkStringArray);
|
||
|
//@}
|
||
|
|
||
|
//@{
|
||
|
/**
|
||
|
* A base class for a functor that assesses data.
|
||
|
*/
|
||
|
class AssessFunctor
|
||
|
{
|
||
|
public:
|
||
|
virtual void operator()(vtkDoubleArray*, vtkIdType) = 0;
|
||
|
virtual ~AssessFunctor() {}
|
||
|
};
|
||
|
//@}
|
||
|
|
||
|
/**
|
||
|
* Add or remove a column from the current analysis request.
|
||
|
* Once all the column status values are set, call RequestSelectedColumns()
|
||
|
* before selecting another set of columns for a different analysis request.
|
||
|
* The way that columns selections are used varies from algorithm to algorithm.
|
||
|
|
||
|
* Note: the set of selected columns is maintained in vtkStatisticsAlgorithmPrivate::Buffer
|
||
|
* until RequestSelectedColumns() is called, at which point the set is appended
|
||
|
* to vtkStatisticsAlgorithmPrivate::Requests.
|
||
|
* If there are any columns in vtkStatisticsAlgorithmPrivate::Buffer at the time
|
||
|
* RequestData() is called, RequestSelectedColumns() will be called and the
|
||
|
* selection added to the list of requests.
|
||
|
*/
|
||
|
virtual void SetColumnStatus(const char* namCol, int status);
|
||
|
|
||
|
/**
|
||
|
* Set the status of each and every column in the current request to OFF (0).
|
||
|
*/
|
||
|
virtual void ResetAllColumnStates();
|
||
|
|
||
|
/**
|
||
|
* Use the current column status values to produce a new request for statistics
|
||
|
* to be produced when RequestData() is called. See SetColumnStatus() for more information.
|
||
|
*/
|
||
|
virtual int RequestSelectedColumns();
|
||
|
|
||
|
/**
|
||
|
* Empty the list of current requests.
|
||
|
*/
|
||
|
virtual void ResetRequests();
|
||
|
|
||
|
/**
|
||
|
* Return the number of requests.
|
||
|
* This does not include any request that is in the column-status buffer
|
||
|
* but for which RequestSelectedColumns() has not yet been called (even though
|
||
|
* it is possible this request will be honored when the filter is run -- see SetColumnStatus()
|
||
|
* for more information).
|
||
|
*/
|
||
|
virtual vtkIdType GetNumberOfRequests();
|
||
|
|
||
|
/**
|
||
|
* Return the number of columns for a given request.
|
||
|
*/
|
||
|
virtual vtkIdType GetNumberOfColumnsForRequest(vtkIdType request);
|
||
|
|
||
|
/**
|
||
|
* Provide the name of the \a c-th column for the \a r-th request.
|
||
|
|
||
|
* For the version of this routine that returns an integer,
|
||
|
* if the request or column does not exist because \a r or \a c is out of bounds,
|
||
|
* this routine returns 0 and the value of \a columnName is unspecified.
|
||
|
* Otherwise, it returns 1 and the value of \a columnName is set.
|
||
|
|
||
|
* For the version of this routine that returns const char*,
|
||
|
* if the request or column does not exist because \a r or \a c is out of bounds,
|
||
|
* the routine returns nullptr. Otherwise it returns the column name.
|
||
|
* This version is not thread-safe.
|
||
|
*/
|
||
|
virtual const char* GetColumnForRequest(vtkIdType r, vtkIdType c);
|
||
|
|
||
|
virtual int GetColumnForRequest(vtkIdType r, vtkIdType c, vtkStdString& columnName);
|
||
|
|
||
|
/**
|
||
|
* Convenience method to create a request with a single column name \p namCol in a single
|
||
|
* call; this is the preferred method to select columns, ensuring selection consistency
|
||
|
* (a single column per request).
|
||
|
* Warning: no name checking is performed on \p namCol; it is the user's
|
||
|
* responsibility to use valid column names.
|
||
|
*/
|
||
|
void AddColumn(const char* namCol);
|
||
|
|
||
|
/**
|
||
|
* Convenience method to create a request with a single column name pair
|
||
|
* (\p namColX, \p namColY) in a single call; this is the preferred method to select
|
||
|
* columns pairs, ensuring selection consistency (a pair of columns per request).
|
||
|
|
||
|
* Unlike SetColumnStatus(), you need not call RequestSelectedColumns() after AddColumnPair().
|
||
|
|
||
|
* Warning: \p namColX and \p namColY are only checked for their validity as strings;
|
||
|
* no check is made that either are valid column names.
|
||
|
*/
|
||
|
void AddColumnPair(const char* namColX, const char* namColY);
|
||
|
|
||
|
/**
|
||
|
* A convenience method (in particular for access from other applications) to
|
||
|
* set parameter values of Learn mode.
|
||
|
* Return true if setting of requested parameter name was executed, false otherwise.
|
||
|
* NB: default method (which is sufficient for most statistics algorithms) does not
|
||
|
* have any Learn parameters to set and always returns false.
|
||
|
*/
|
||
|
virtual bool SetParameter(const char* parameter, int index, vtkVariant value);
|
||
|
|
||
|
/**
|
||
|
* Given a collection of models, calculate aggregate model
|
||
|
*/
|
||
|
virtual void Aggregate(vtkDataObjectCollection*, vtkMultiBlockDataSet*) = 0;
|
||
|
|
||
|
protected:
|
||
|
vtkStatisticsAlgorithm();
|
||
|
~vtkStatisticsAlgorithm() override;
|
||
|
|
||
|
int FillInputPortInformation(int port, vtkInformation* info) override;
|
||
|
int FillOutputPortInformation(int port, vtkInformation* info) override;
|
||
|
|
||
|
int RequestData(vtkInformation*, vtkInformationVector**, vtkInformationVector*) override;
|
||
|
|
||
|
/**
|
||
|
* Execute the calculations required by the Learn option, given some input Data
|
||
|
*/
|
||
|
virtual void Learn(vtkTable*, vtkTable*, vtkMultiBlockDataSet*) = 0;
|
||
|
|
||
|
/**
|
||
|
* Execute the calculations required by the Derive option.
|
||
|
*/
|
||
|
virtual void Derive(vtkMultiBlockDataSet*) = 0;
|
||
|
|
||
|
/**
|
||
|
* Execute the calculations required by the Assess option.
|
||
|
*/
|
||
|
virtual void Assess(vtkTable*, vtkMultiBlockDataSet*, vtkTable*) = 0;
|
||
|
|
||
|
/**
|
||
|
* A convenience implementation for generic assessment with variable number of variables.
|
||
|
*/
|
||
|
void Assess(vtkTable*, vtkMultiBlockDataSet*, vtkTable*, int);
|
||
|
|
||
|
/**
|
||
|
* Execute the calculations required by the Test option.
|
||
|
*/
|
||
|
virtual void Test(vtkTable*, vtkMultiBlockDataSet*, vtkTable*) = 0;
|
||
|
|
||
|
/**
|
||
|
* A pure virtual method to select the appropriate assessment functor.
|
||
|
*/
|
||
|
virtual void SelectAssessFunctor(
|
||
|
vtkTable* outData, vtkDataObject* inMeta, vtkStringArray* rowNames, AssessFunctor*& dfunc) = 0;
|
||
|
|
||
|
vtkIdType NumberOfPrimaryTables;
|
||
|
bool LearnOption;
|
||
|
bool DeriveOption;
|
||
|
bool AssessOption;
|
||
|
bool TestOption;
|
||
|
vtkStringArray* AssessNames;
|
||
|
vtkStatisticsAlgorithmPrivate* Internals;
|
||
|
|
||
|
private:
|
||
|
vtkStatisticsAlgorithm(const vtkStatisticsAlgorithm&) = delete;
|
||
|
void operator=(const vtkStatisticsAlgorithm&) = delete;
|
||
|
};
|
||
|
|
||
|
#endif
|