6#include <vtkInformation.h>
8#include <vtkDataArray.h>
10#include <vtkObjectFactory.h>
11#include <vtkPointData.h>
36 this->SetNumberOfInputPorts(2);
37 this->SetNumberOfOutputPorts(2);
51 int port, vtkInformation *info) {
53 info->Set(vtkAlgorithm::INPUT_REQUIRED_DATA_TYPE(),
"vtkMultiBlockDataSet");
54 }
else if(port == 1) {
55 info->Set(vtkAlgorithm::INPUT_REQUIRED_DATA_TYPE(),
"vtkTable");
77 int port, vtkInformation *info) {
78 if(port == 0 or port == 1) {
79 info->Set(vtkDataObject::DATA_TYPE_NAME(),
"vtkMultiBlockDataSet");
100 vtkInformationVector **inputVector,
101 vtkInformationVector *outputVector) {
105 printMsg(
"Get input object from input vector", debug::Priority::VERBOSE);
106 auto blocks = vtkMultiBlockDataSet::GetData(inputVector[0], 0);
107 auto table = vtkTable::GetData(inputVector[1], 0);
112 printMsg(
"Load Blocks", debug::Priority::VERBOSE);
113 std::vector<vtkSmartPointer<vtkMultiBlockDataSet>> inputTrees;
115 printMsg(
"Load Blocks done.", debug::Priority::VERBOSE);
116 auto assignmentSolverArray
117 = blocks->GetFieldData()->GetArray(
"AssignmentSolver");
118 if(assignmentSolverArray)
122 if(treesNodes.size() != 0 and inputTrees[0]->GetBlock(0) != treesNodes[0])
123 resetDataVisualization();
125 std::vector<std::tuple<double, int, int, int, int>> coefs;
126 int totalInputs = inputTrees.size() + table->GetNumberOfRows();
127 std::vector<bool> interpolatedTrees(totalInputs,
false);
128 for(
int i = 0; i < table->GetNumberOfRows(); ++i) {
129 double alpha = vtkDataArray::SafeDownCast(table->GetColumnByName(
"Alpha"))
131 int index1R = vtkDataArray::SafeDownCast(table->GetColumnByName(
"Index1_R"))
133 int index2R = vtkDataArray::SafeDownCast(table->GetColumnByName(
"Index2_R"))
135 int index1 = vtkDataArray::SafeDownCast(table->GetColumnByName(
"Index1"))
137 int index2 = vtkDataArray::SafeDownCast(table->GetColumnByName(
"Index2"))
140 coefs.emplace_back(alpha, index1R, index2R, index1, index2);
141 for(
int j = index1 + 1; j < index2; ++j)
142 interpolatedTrees[j] =
true;
145 return run<float>(outputVector, inputTrees, coefs, interpolatedTrees);
148template <
class dataType>
150 vtkInformationVector *outputVector,
152 std::vector<std::tuple<double, int, int, int, int>> &coefs,
153 std::vector<bool> &interpolatedTrees) {
154 if(not isDataVisualizationFilled())
155 runCompute<dataType>(inputTrees, coefs);
156 runOutput<dataType>(outputVector, inputTrees, coefs, interpolatedTrees);
160template <
class dataType>
163 std::vector<std::tuple<double, int, int, int, int>> &coefs) {
167 printMsg(
"Construct trees", debug::Priority::VERBOSE);
169 const int numInputs = inputTrees.size();
171 setDataVisualization(numInputs);
173 std::vector<MergeTree<dataType>> intermediateMTrees(numInputs);
174 constructTrees<dataType>(
175 inputTrees, intermediateMTrees, treesNodes, treesArcs, treesSegmentation);
180 printMsg(
"Call base", debug::Priority::VERBOSE);
182 std::vector<MergeTree<dataType>> allMT_T;
184 execute<dataType>(intermediateMTrees, coefs, allMT_T, allMatching);
187 for(
size_t i = 0; i < allMT_T.size(); ++i) {
189 mergeTreeTemplateToDouble<dataType>(allMT_T[i], tree);
190 intermediateSTrees.emplace_back(tree);
196template <
class dataType>
198 vtkInformationVector *outputVector,
200 std::vector<std::tuple<double, int, int, int, int>> &coefs,
201 std::vector<bool> &interpolatedTrees) {
202 bool OutputSegmentation =
false;
206 auto output_sequence = vtkMultiBlockDataSet::GetData(outputVector, 0);
207 auto output_matchings = vtkMultiBlockDataSet::GetData(outputVector, 1);
212 std::vector<vtkUnstructuredGrid *> treesNodesT;
213 std::vector<vtkUnstructuredGrid *> treesArcsT;
214 std::vector<vtkDataSet *> treesSegmentationT;
215 std::vector<std::vector<int>> treesNodeCorrMeshT;
216 std::vector<vtkSmartPointer<vtkMultiBlockDataSet>> inputTreesT;
219 while(cpt < coefs.size()) {
220 while(cpt < coefs.size() and std::get<2>(coefs[cpt]) <= index) {
221 treesNodesT.emplace_back(
nullptr);
222 treesArcsT.emplace_back(
nullptr);
223 treesSegmentationT.emplace_back(
nullptr);
224 treesNodeCorrMeshT.emplace_back();
225 inputTreesT.emplace_back(
nullptr);
228 treesNodesT.emplace_back(treesNodes[index]);
229 treesArcsT.emplace_back(treesArcs[index]);
230 treesSegmentationT.emplace_back(treesSegmentation[index]);
231 treesNodeCorrMeshT.emplace_back(treesNodeCorrMesh[index]);
232 inputTreesT.emplace_back(inputTrees[index]);
235 treesNodes.swap(treesNodesT);
236 treesArcs.swap(treesArcsT);
237 treesSegmentation.swap(treesSegmentationT);
238 treesNodeCorrMesh.swap(treesNodeCorrMeshT);
239 inputTrees.swap(inputTreesT);
241 std::vector<MergeTree<dataType>> intermediateMTrees;
242 mergeTreesDoubleToTemplate<dataType>(intermediateSTrees, intermediateMTrees);
243 std::vector<FTMTree_MT *> trees;
244 mergeTreeToFTMTree<dataType>(intermediateMTrees, trees);
246 output_sequence->SetNumberOfBlocks((OutputSegmentation ? 3 : 2));
249 vtkBlockNodes->SetNumberOfBlocks(intermediateMTrees.size());
250 output_sequence->SetBlock(0, vtkBlockNodes);
253 vtkBlockArcs->SetNumberOfBlocks(intermediateMTrees.size());
254 output_sequence->SetBlock(1, vtkBlockArcs);
255 if(OutputSegmentation) {
258 vtkBlockSegs->SetNumberOfBlocks(intermediateMTrees.size());
259 output_sequence->SetBlock(2, vtkBlockSegs);
263 std::vector<std::vector<SimplexId>> nodeCorr(intermediateMTrees.size());
264 int cptInterpolatedTree = 0;
265 for(
size_t i = 0; i < intermediateMTrees.size(); ++i) {
276 BranchDecompositionPlanarLayout);
295 visuMaker.
copyPointData(treesNodes[i], treesNodeCorrMesh[i]);
309 vtkOutputNode1->GetFieldData()->ShallowCopy(
310 treesNodes[i]->GetFieldData());
312 vtkOutputArc1->GetFieldData()->ShallowCopy(treesArcs[i]->GetFieldData());
313 if(treesSegmentation[i] and OutputSegmentation)
314 vtkOutputSegmentation1->GetFieldData()->ShallowCopy(
315 treesSegmentation[i]->GetFieldData());
318 if(interpolatedTrees[i]) {
320 vtkNew<vtkDoubleArray> vtkDistancePreviousKey{};
321 vtkDistancePreviousKey->SetName(
"DistancePreviousKeyFrame");
322 vtkDistancePreviousKey->SetNumberOfTuples(1);
323 vtkDistancePreviousKey->SetTuple1(
325 vtkOutputNode1->GetFieldData()->AddArray(vtkDistancePreviousKey);
327 vtkNew<vtkDoubleArray> vtkDistanceNextKey{};
328 vtkDistanceNextKey->SetName(
"DistanceNextKeyFrame");
329 vtkDistanceNextKey->SetNumberOfTuples(1);
330 vtkDistanceNextKey->SetTuple1(
332 vtkOutputNode1->GetFieldData()->AddArray(vtkDistanceNextKey);
334 vtkNew<vtkIntArray> vtkIndexPreviousKey{};
335 vtkIndexPreviousKey->SetName(
"IndexPreviousKeyFrame");
336 vtkIndexPreviousKey->SetNumberOfTuples(1);
337 vtkIndexPreviousKey->SetTuple1(
338 0, std::get<3>(coefs[cptInterpolatedTree]));
339 vtkOutputNode1->GetFieldData()->AddArray(vtkIndexPreviousKey);
341 vtkNew<vtkIntArray> vtkIndexNextKey{};
342 vtkIndexNextKey->SetName(
"IndexNextKeyFrame");
343 vtkIndexNextKey->SetNumberOfTuples(1);
344 vtkIndexNextKey->SetTuple1(0, std::get<4>(coefs[cptInterpolatedTree]));
345 vtkOutputNode1->GetFieldData()->AddArray(vtkIndexNextKey);
347 ++cptInterpolatedTree;
351 vtkMultiBlockDataSet::SafeDownCast(output_sequence->GetBlock(0))
352 ->SetBlock(i, vtkOutputNode1);
353 vtkMultiBlockDataSet::SafeDownCast(output_sequence->GetBlock(1))
354 ->SetBlock(i, vtkOutputArc1);
355 if(OutputSegmentation)
356 vtkMultiBlockDataSet::SafeDownCast(output_sequence->GetBlock(2))
357 ->SetBlock(i, vtkOutputSegmentation1);
363 output_matchings->SetNumberOfBlocks(intermediateMTrees.size() - 1);
364 for(
size_t i = 0; i < intermediateMTrees.size() - 1; ++i) {
369 = vtkUnstructuredGrid::SafeDownCast(
370 vtkMultiBlockDataSet::SafeDownCast(output_sequence->GetBlock(0))
373 = vtkUnstructuredGrid::SafeDownCast(
374 vtkMultiBlockDataSet::SafeDownCast(output_sequence->GetBlock(0))
376 std::vector<std::vector<SimplexId>> nodeCorrTemp;
377 nodeCorrTemp.emplace_back(nodeCorr[i]);
378 nodeCorrTemp.emplace_back(nodeCorr[i + 1]);
392 vtkNew<vtkDoubleArray> vtkDistance{};
393 vtkDistance->SetName(
"Distance");
394 vtkDistance->SetNumberOfTuples(1);
396 vtkOutputMatching->GetFieldData()->AddArray(vtkDistance);
399 output_matchings->SetBlock(i, vtkOutputMatching);
403 treesNodes.swap(treesNodesT);
404 treesArcs.swap(treesArcsT);
405 treesSegmentation.swap(treesSegmentationT);
406 treesNodeCorrMesh.swap(treesNodeCorrMeshT);
407 inputTrees.swap(inputTreesT);
#define ttkNotUsed(x)
Mark function/method parameters that are not used in the function body at all.
TTK VTK-filter that wraps the ttk::MergeTreeTemporalReductionDecoding module.
int runOutput(vtkInformationVector *outputVector, std::vector< vtkSmartPointer< vtkMultiBlockDataSet > > &inputTrees, std::vector< std::tuple< double, int, int, int, int > > &coefs, std::vector< bool > &interpolatedTrees)
ttkMergeTreeTemporalReductionDecoding()
int runCompute(std::vector< vtkSmartPointer< vtkMultiBlockDataSet > > &inputTrees, std::vector< std::tuple< double, int, int, int, int > > &coefs)
int RequestData(vtkInformation *request, vtkInformationVector **inputVector, vtkInformationVector *outputVector) override
~ttkMergeTreeTemporalReductionDecoding() override
int FillInputPortInformation(int port, vtkInformation *info) override
int FillOutputPortInformation(int port, vtkInformation *info) override
int run(vtkInformationVector *outputVector, std::vector< vtkSmartPointer< vtkMultiBlockDataSet > > &inputTrees, std::vector< std::tuple< double, int, int, int, int > > &coefs, std::vector< bool > &interpolatedTrees)
void setTreesSegmentation(std::vector< vtkDataSet * > &segmentation)
void setInterpolatedTrees(std::vector< bool > &isInterpolatedTrees)
void setMinimumImportantPairs(int minPairs)
void setMaximumImportantPairs(int maxPairs)
void copyPointData(vtkUnstructuredGrid *treeNodes, std::vector< int > &nodeCorrT)
void setVtkOutputNode1(vtkUnstructuredGrid *vtkNode1)
void setNodeCorr1(std::vector< std::vector< SimplexId > > &nodeCorrT)
void setVtkOutputSegmentation(vtkDataSet *vtkSegmentation)
void setTreesNodeCorrMesh(std::vector< std::vector< int > > &nodeCorrMesh)
void setOutputSegmentation(bool b)
void setPrintTreeId(int id)
void setVtkOutputMatching(vtkUnstructuredGrid *vtkMatching)
void setPlanarLayout(bool b)
void setPrintClusterId(int id)
void setPrevXMaxOffset(double offset)
std::vector< std::vector< SimplexId > > getNodeCorr()
void makeTreesOutput(FTMTree_MT *tree1)
void setShiftMode(int mode)
void setDimensionToShift(int i)
void setDimensionSpacing(double d)
void setVtkOutputNode2(vtkUnstructuredGrid *vtkNode2)
void makeMatchingOutput(FTMTree_MT *tree1, FTMTree_MT *tree2)
void setVtkOutputArc(vtkUnstructuredGrid *vtkArc)
void setVtkOutputNode(vtkUnstructuredGrid *vtkNode)
void setOutputMatching(std::vector< std::tuple< idNode, idNode, double > > &matching)
void setTreesNodes(std::vector< vtkUnstructuredGrid * > &nodes)
virtual int setDebugLevel(const int &debugLevel)
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
std::vector< std::vector< int > > getTreesNodeCorr()
std::vector< double > distancesToKeyFrames_
std::vector< double > finalDistances_
void setNonImportantPairsSpacing(double d)
void setNonImportantPairsProximity(double d)
void setExcludeImportantPairsLower(std::string &d)
void setImportantPairsSpacing(double d)
void setRescaleTreesIndividually(bool b)
void setImportantPairs(double d)
void setExcludeImportantPairsHigher(std::string &d)
void setBranchDecompositionPlanarLayout(bool b)
void loadBlocks(std::vector< vtkSmartPointer< vtkMultiBlockDataSet > > &inputTrees, vtkMultiBlockDataSet *blocks)
vtkStandardNewMacro(ttkMergeTreeTemporalReductionDecoding)