55 vtkInformationVector **inputVector,
56 vtkInformationVector *outputVector) {
60 auto blocks = vtkMultiBlockDataSet::GetData(inputVector[0], 0);
61 auto atomBlocks = vtkMultiBlockDataSet::GetData(inputVector[1], 0);
64 std::vector<vtkUnstructuredGrid *> inputDiagrams;
66 std::vector<vtkUnstructuredGrid *> inputAtoms;
68 int numInputAtoms = 0;
69 if(atomBlocks !=
nullptr) {
70 numInputAtoms = atomBlocks->GetNumberOfBlocks();
71 inputAtoms.resize(numInputAtoms);
72 for(
int i = 0; i < numInputAtoms; ++i) {
74 = vtkUnstructuredGrid::SafeDownCast(atomBlocks->GetBlock(i));
78 AtomNumber_ = numInputAtoms;
80 if(blocks !=
nullptr) {
81 int numInputs = blocks->GetNumberOfBlocks();
82 inputDiagrams.resize(numInputs);
83 for(
int i = 0; i < numInputs; ++i) {
84 inputDiagrams[i] = vtkUnstructuredGrid::SafeDownCast(blocks->GetBlock(i));
94 const int nDiags = inputDiagrams.size();
97 for(
const auto vtu : inputDiagrams) {
99 this->
printErr(
"Input diagrams are not all vtkUnstructuredGrid");
105 auto outputDgm = vtkMultiBlockDataSet::GetData(outputVector, 0);
106 auto outputWeights = vtkTable::GetData(outputVector, 1);
108 outputDgm->SetNumberOfBlocks(numAtom);
111 for(
int i = 0; i < numAtom; ++i) {
112 vtkNew<vtkUnstructuredGrid> vtu;
113 vtu->DeepCopy(inputAtoms[i]);
114 outputDgm->SetBlock(i, vtu);
117 for(
int i = 0; i < numAtom; ++i) {
118 vtkNew<vtkUnstructuredGrid> vtu;
119 vtu->DeepCopy(inputDiagrams[i]);
120 outputDgm->SetBlock(i, vtu);
124 std::vector<ttk::DiagramType> intermediateDiagrams(nDiags);
125 std::vector<ttk::DiagramType> intermediateAtoms(numInputAtoms);
127 double max_dimension_total = 0.0;
128 for(
int i = 0; i < nDiags; ++i) {
131 =
VTUToDiagram(intermediateDiagrams[i], inputDiagrams[i], *
this);
133 double maxPers = this->
getMaxPers(intermediateDiagrams[i]);
134 double percentage = this->Percent_;
136 intermediateDiagrams[i].erase(
137 std::remove_if(intermediateDiagrams[i].
begin(),
138 intermediateDiagrams[i].
end(),
141 < (percentage / 100.) * maxPers;
143 intermediateDiagrams[i].end());
146 this->
printErr(
"Could not read Persistence Diagram");
149 if(max_dimension_total < maxPers) {
150 max_dimension_total = maxPers;
153 for(
int i = 0; i < numInputAtoms; ++i) {
154 const auto ret =
VTUToDiagram(intermediateAtoms[i], inputAtoms[i], *
this);
156 this->
printErr(
"Could not read Persistence Diagram");
161 std::vector<ttk::DiagramType> dictDiagrams;
164 std::vector<std::vector<double>> vectorWeights(nDiags);
165 for(
size_t i = 0; i < vectorWeights.size(); ++i) {
166 std::vector<double> weights(numAtom, 1. / (numAtom * 1.));
167 vectorWeights[i] = std::move(weights);
170 std::vector<double> lossTab;
171 std::vector<std::vector<double>> allLosses(nDiags);
172 this->
execute(intermediateDiagrams, intermediateAtoms, dictDiagrams,
173 vectorWeights, seed, numAtom, lossTab, allLosses,
176 outputWeights->SetNumberOfRows(nDiags);
179 = [](std::string &colName,
const size_t numberCols,
const size_t colIdx) {
180 std::string max{std::to_string(numberCols - 1)};
181 std::string cur{std::to_string(colIdx)};
182 std::string zer(max.size() - cur.size(),
'0');
183 colName.append(zer).append(cur);
185 for(
int i = 0; i < numAtom; ++i) {
186 std::string name{
"Atom"};
187 zeroPad(name, numAtom, i);
189 vtkNew<vtkDoubleArray> col{};
190 col->SetNumberOfValues(nDiags);
191 col->SetName(name.c_str());
192 for(
int j = 0; j < nDiags; ++j) {
193 col->SetValue(j, vectorWeights[j][i]);
196 outputWeights->AddColumn(col);
199 vtkNew<vtkFieldData> fd{};
200 fd->CopyStructure(inputDiagrams[0]->GetFieldData());
201 fd->SetNumberOfTuples(nDiags);
202 for(
int i = 0; i < nDiags; ++i) {
203 fd->SetTuple(i, 0, inputDiagrams[i]->GetFieldData());
206 for(
int i = 0; i < fd->GetNumberOfArrays(); ++i) {
207 outputWeights->AddColumn(fd->GetAbstractArray(i));
210 vtkNew<vtkFloatArray> dummy{};
212 for(
int i = 0; i < numAtom; ++i) {
213 vtkNew<vtkUnstructuredGrid> vtu;
216 outputDgm->SetBlock(i, vtu);