5#include <vtkDoubleArray.h>
6#include <vtkInformation.h>
7#include <vtkInformationVector.h>
9#include <vtkObjectFactory.h>
17 SetNumberOfInputPorts(1);
18 SetNumberOfOutputPorts(1);
22 vtkInformation *info) {
24 info->Set(vtkAlgorithm::INPUT_REQUIRED_DATA_TYPE(),
"vtkTable");
31 vtkInformation *info) {
33 info->Set(vtkDataObject::DATA_TYPE_NAME(),
"vtkTable");
40 vtkInformationVector **inputVector,
41 vtkInformationVector *outputVector) {
44 auto *input = vtkTable::GetData(inputVector[0]);
45 auto *output = vtkTable::GetData(outputVector);
46 output->ShallowCopy(input);
48 if(SelectFieldsWithRegexp) {
51 const auto n = input->GetNumberOfColumns();
52 for(
int i = 0; i < n; ++i) {
53 const auto &name = input->GetColumnName(i);
54 if(std::regex_match(name, std::regex(RegexpString))) {
55 ScalarFields.emplace_back(name);
60 const auto numberOfRows = input->GetNumberOfRows();
61 const auto numberOfColumns = ScalarFields.size();
63 if(numberOfRows <= 0 || numberOfColumns <= 0) {
64 this->
printErr(
"Input matrix has invalid dimensions (rows: "
65 + std::to_string(numberOfRows)
66 +
", columns: " + std::to_string(numberOfColumns) +
")");
70 std::vector<vtkAbstractArray *> arrays{};
71 for(
const auto &s : ScalarFields) {
72 arrays.push_back(input->GetColumnByName(s.data()));
75 std::vector<std::vector<double>> inputMatrix(numberOfRows);
76#ifdef TTK_ENABLE_OPENMP
77#pragma omp parallel for num_threads(this->threadNumber_)
79 for(
int i = 0; i < numberOfRows; ++i) {
80 for(
size_t j = 0; j < numberOfColumns; ++j) {
81 inputMatrix[i].emplace_back(arrays[j]->GetVariantValue(i).ToDouble());
85 std::vector<const double *> inputPtrs(inputMatrix.size());
86 for(
size_t i = 0; i < inputMatrix.size(); ++i) {
87 const auto &vec{inputMatrix[i]};
88 inputPtrs[i] = vec.data();
91 std::vector<double *> distanceMatrix(inputMatrix.size());
95 = [](std::string &colName,
const size_t numberCols,
const size_t colIdx) {
96 std::string max{std::to_string(numberCols - 1)};
97 std::string cur{std::to_string(colIdx)};
98 std::string zer(max.size() - cur.size(),
'0');
99 colName.append(zer).append(cur);
103 for(
int i = 0; i < numberOfRows; ++i) {
104 std::string name{
"Distance"};
105 zeroPad(name, distanceMatrix.size(), i);
107 vtkNew<vtkDoubleArray> col{};
108 col->SetNumberOfTuples(numberOfRows);
109 col->SetName(name.c_str());
110 output->AddColumn(col);
112 = ttkUtils::GetPointer<double>(vtkDoubleArray::SafeDownCast(col));
115 this->
execute(distanceMatrix, inputPtrs, inputMatrix[0].size());
117 this->
printMsg(
"Complete (#dimensions: " + std::to_string(numberOfColumns)
118 +
", #points: " + std::to_string(numberOfRows) +
")",
119 1.0, tm.getElapsedTime(), this->threadNumber_);
Computes a distance matrix using LDistance from a vtkTable.
int FillOutputPortInformation(int port, vtkInformation *info) override
int FillInputPortInformation(int port, vtkInformation *info) override
int RequestData(vtkInformation *request, vtkInformationVector **inputVector, vtkInformationVector *outputVector) override
int printMsg(const std::string &msg, const debug::Priority &priority=debug::Priority::INFO, const debug::LineMode &lineMode=debug::LineMode::NEW, std::ostream &stream=std::cout) const
int printErr(const std::string &msg, const debug::LineMode &lineMode=debug::LineMode::NEW, std::ostream &stream=std::cerr) const
int execute(std::vector< TOut * > &output, const std::vector< const TIn * > &inputs, const size_t nPoints) const
vtkStandardNewMacro(ttkTableDistanceMatrix)