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.
175 lines
5.4 KiB
C++
175 lines
5.4 KiB
C++
/*=========================================================================
|
|
|
|
Program: Visualization Toolkit
|
|
Module: vtkDotProductSimilarity.h
|
|
|
|
-------------------------------------------------------------------------
|
|
Copyright 2008 Sandia Corporation.
|
|
Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation,
|
|
the U.S. Government retains certain rights in this software.
|
|
-------------------------------------------------------------------------
|
|
|
|
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 vtkDotProductSimilarity
|
|
* @brief compute dot-product similarity metrics.
|
|
*
|
|
*
|
|
* Treats matrices as collections of vectors and computes dot-product similarity
|
|
* metrics between vectors.
|
|
*
|
|
* The results are returned as an edge-table that lists the index of each vector
|
|
* and their computed similarity. The output edge-table is typically used with
|
|
* vtkTableToGraph to create a similarity graph.
|
|
*
|
|
* This filter can be used with one or two input matrices. If you provide a single
|
|
* matrix as input, every vector in the matrix is compared with every other vector. If
|
|
* you provide two matrices, every vector in the first matrix is compared with every
|
|
* vector in the second matrix.
|
|
*
|
|
* Note that this filter *only* computes the dot-product between each pair of vectors;
|
|
* if you want to compute the cosine of the angles between vectors, you will need to
|
|
* normalize the inputs yourself.
|
|
*
|
|
* Inputs:
|
|
* Input port 0: (required) A vtkDenseArray<double> with two dimensions (a matrix).
|
|
* Input port 1: (optional) A vtkDenseArray<double> with two dimensions (a matrix).
|
|
*
|
|
* Outputs:
|
|
* Output port 0: A vtkTable containing "source", "target", and "similarity" columns.
|
|
*
|
|
* @warning
|
|
* Note that the complexity of this filter is quadratic! It also requires dense arrays
|
|
* as input, in the future it should be generalized to accept sparse arrays.
|
|
*
|
|
* @par Thanks:
|
|
* Developed by Timothy M. Shead (tshead@sandia.gov) at Sandia National Laboratories.
|
|
*/
|
|
|
|
#ifndef vtkDotProductSimilarity_h
|
|
#define vtkDotProductSimilarity_h
|
|
|
|
#include "vtkInfovisCoreModule.h" // For export macro
|
|
#include "vtkTableAlgorithm.h"
|
|
|
|
class VTKINFOVISCORE_EXPORT vtkDotProductSimilarity : public vtkTableAlgorithm
|
|
{
|
|
public:
|
|
static vtkDotProductSimilarity* New();
|
|
vtkTypeMacro(vtkDotProductSimilarity, vtkTableAlgorithm);
|
|
void PrintSelf(ostream& os, vtkIndent indent) override;
|
|
|
|
//@{
|
|
/**
|
|
* Controls whether to compute similarities for row-vectors or column-vectors.
|
|
* 0 = rows, 1 = columns.
|
|
*/
|
|
vtkGetMacro(VectorDimension, vtkIdType);
|
|
vtkSetMacro(VectorDimension, vtkIdType);
|
|
//@}
|
|
|
|
//@{
|
|
/**
|
|
* When computing similarities for a single input matrix, controls whether the
|
|
* results will include the upper diagonal of the similarity matrix. Default: true.
|
|
*/
|
|
vtkGetMacro(UpperDiagonal, int);
|
|
vtkSetMacro(UpperDiagonal, int);
|
|
//@}
|
|
|
|
//@{
|
|
/**
|
|
* When computing similarities for a single input matrix, controls whether the
|
|
* results will include the diagonal of the similarity matrix. Default: false.
|
|
*/
|
|
vtkGetMacro(Diagonal, int);
|
|
vtkSetMacro(Diagonal, int);
|
|
//@}
|
|
|
|
//@{
|
|
/**
|
|
* When computing similarities for a single input matrix, controls whether the
|
|
* results will include the lower diagonal of the similarity matrix. Default: false.
|
|
*/
|
|
vtkGetMacro(LowerDiagonal, int);
|
|
vtkSetMacro(LowerDiagonal, int);
|
|
//@}
|
|
|
|
//@{
|
|
/**
|
|
* When computing similarities for two input matrices, controls whether the results
|
|
* will include comparisons from the first matrix to the second matrix.
|
|
*/
|
|
vtkGetMacro(FirstSecond, int);
|
|
vtkSetMacro(FirstSecond, int);
|
|
//@}
|
|
|
|
//@{
|
|
/**
|
|
* When computing similarities for two input matrices, controls whether the results
|
|
* will include comparisons from the second matrix to the first matrix.
|
|
*/
|
|
vtkGetMacro(SecondFirst, int);
|
|
vtkSetMacro(SecondFirst, int);
|
|
//@}
|
|
|
|
//@{
|
|
/**
|
|
* Specifies a minimum threshold that a similarity must exceed to be included in
|
|
* the output.
|
|
*/
|
|
vtkGetMacro(MinimumThreshold, double);
|
|
vtkSetMacro(MinimumThreshold, double);
|
|
//@}
|
|
|
|
//@{
|
|
/**
|
|
* Specifies a minimum number of edges to include for each vector.
|
|
*/
|
|
vtkGetMacro(MinimumCount, vtkIdType);
|
|
vtkSetMacro(MinimumCount, vtkIdType);
|
|
//@}
|
|
|
|
//@{
|
|
/**
|
|
* Specifies a maximum number of edges to include for each vector.
|
|
*/
|
|
vtkGetMacro(MaximumCount, vtkIdType);
|
|
vtkSetMacro(MaximumCount, vtkIdType);
|
|
//@}
|
|
|
|
protected:
|
|
vtkDotProductSimilarity();
|
|
~vtkDotProductSimilarity() override;
|
|
|
|
int FillInputPortInformation(int, vtkInformation*) override;
|
|
|
|
int RequestData(vtkInformation*, vtkInformationVector**, vtkInformationVector*) override;
|
|
|
|
private:
|
|
vtkDotProductSimilarity(const vtkDotProductSimilarity&) = delete;
|
|
void operator=(const vtkDotProductSimilarity&) = delete;
|
|
|
|
vtkIdType VectorDimension;
|
|
double MinimumThreshold;
|
|
vtkIdType MinimumCount;
|
|
vtkIdType MaximumCount;
|
|
|
|
int UpperDiagonal;
|
|
int Diagonal;
|
|
int LowerDiagonal;
|
|
int FirstSecond;
|
|
int SecondFirst;
|
|
};
|
|
|
|
#endif
|