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.

152 lines
5.1 KiB
C++

/*=========================================================================
Program: Visualization Toolkit
Module: vtkHighestDensityRegionsStatistics.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 vtkHighestDensityRegionsStatistics
* @brief Compute a random vector of
* density f from input observations points. f is computed using a smooth
* kernel method.
*
*
* Given a selection of pairs of columns of interest, this class provides the
* following functionalities, depending on the chosen execution options:
* * Learn: calculates density estimator f of a random vector using a smooth
* gaussian kernel. The output metadata on port OUTPUT_MODEL is a multiblock
* dataset containing at one vtkTable holding three columns which are for the
* first columns the input columns of interest and for the last columns the
* density estimators of each input pair of columns of interest.
* * Derive: calculate normalized (as a percentage) quantiles coming from
* Learn output. The second block of the multibloc dataset contains a
* vtkTable holding some pairs of columns which are for the second one the
* quantiles ordered from the stronger to the lower and for the first one
* the correspondand quantile index.
* * Assess: not implemented.
* * Test: not implemented.
*/
#ifndef vtkHighestDensityRegionsStatistics_h
#define vtkHighestDensityRegionsStatistics_h
#include "vtkFiltersStatisticsModule.h" // For export macro
#include "vtkStatisticsAlgorithm.h"
class vtkMultiBlockDataSet;
class vtkVariant;
class VTKFILTERSSTATISTICS_EXPORT vtkHighestDensityRegionsStatistics : public vtkStatisticsAlgorithm
{
public:
vtkTypeMacro(vtkHighestDensityRegionsStatistics, vtkStatisticsAlgorithm);
void PrintSelf(ostream& os, vtkIndent indent) override;
static vtkHighestDensityRegionsStatistics* New();
/**
* Given a collection of models, calculate aggregate model
*/
void Aggregate(vtkDataObjectCollection*, vtkMultiBlockDataSet*) override { return; }
/**
* Set the width of the gaussian kernel.
*/
void SetSigma(double sigma);
/**
* Set the gaussian kernel matrix.
*/
void SetSigmaMatrix(double s11, double s12, double s21, double s22);
/**
* Fill outDensity with density vector that is computed from
* inObservations values. This method uses a Gaussian kernel.
* For n observations and with X an observation point:
* f(X) = (1 / n) * Sum(KH(X -Xi)) for (i = 1 to n).
* Look ComputeSmoothGaussianKernel for KH kernel definition.
*/
double ComputeHDR(vtkDataArray* inObservations, vtkDataArray* outDensity);
/**
* Fill outDensity with density vector defined by inPOI and computed from
* the inObs values. This method uses a Gaussian kernel.
* For n observations and with X an observation point:
* f(X) = (1 / n) * Sum(KH(X -Xi)) for (i = 1 to n).
* Look ComputeSmoothGaussianKernel for KH kernel definition.
*/
double ComputeHDR(vtkDataArray* inObs, vtkDataArray* inPOI, vtkDataArray* outDensity);
protected:
vtkHighestDensityRegionsStatistics();
~vtkHighestDensityRegionsStatistics() override;
/**
* Execute the calculations required by the Learn option.
*/
void Learn(vtkTable*, vtkTable*, vtkMultiBlockDataSet*) override;
/**
* Execute the calculations required by the Derive option.
*/
void Derive(vtkMultiBlockDataSet*) override;
/**
* Execute the calculations required by the Assess option.
*/
void Assess(vtkTable*, vtkMultiBlockDataSet*, vtkTable*) override { return; }
/**
* Execute the calculations required by the Test option.
*/
void Test(vtkTable*, vtkMultiBlockDataSet*, vtkTable*) override { return; }
/**
* Provide the appropriate assessment functor.
*/
void SelectAssessFunctor(vtkTable*, vtkDataObject*, vtkStringArray*, AssessFunctor*&) override
{
return;
}
//@{
/**
* Store the smooth matrix parameter H. Specify a smooth direction
* for the Gaussian kernel.
*/
double SmoothHC1[2];
double SmoothHC2[2];
double InvSigmaC1[2];
double InvSigmaC2[2];
double Determinant;
//@}
/**
* Store the number of requested columns pair computed by learn method.
*/
vtkIdType NumberOfRequestedColumnsPair;
private:
/**
* Helper that returns a smooth gaussian kernel of a vector of dimension two,
* using its coordinates. For X = [khx, khy] and H a positive matrix of dim 2,
* KH(X) = sqrt(det(H)) * K((1 / sqrt(H)) * X).
* Look ComputeStandardGaussianKernel for the K kernel definition.
*/
double ComputeSmoothGaussianKernel(int dimension, double khx, double khy);
private:
vtkHighestDensityRegionsStatistics(const vtkHighestDensityRegionsStatistics&) = delete;
void operator=(const vtkHighestDensityRegionsStatistics&) = delete;
};
#endif