Skip to content

Commit 98e6984

Browse files
Merge pull request #1097 from thom-dani/stochastic-discrete-gradient
Stochastic discrete gradient
2 parents cefed24 + eec8dc3 commit 98e6984

File tree

12 files changed

+2462
-36
lines changed

12 files changed

+2462
-36
lines changed

ChangeLog.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
- Distributed computation of persistent homology! (IEEE TPDS 2025)
66
- Discrete vector field topology! (IEEE VIS 2024)
77
- New backend for TrackingFromFields (critical point based)
8+
- Stochastic discrete gradient (IEEE VIS 2012)
89
- Fast planar Rips filtration persistence computation
910
- Migration to ParaView 6
1011
- CI updates

core/base/discreteGradient/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,4 +6,5 @@ ttk_add_base_library(discreteGradient
66
DiscreteGradient_Template.h
77
DEPENDS
88
triangulation
9+
ftmTree
910
)

core/base/discreteGradient/DiscreteGradient.cpp

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -249,6 +249,58 @@ int DiscreteGradient::setManifoldSize(
249249
return 0;
250250
}
251251

252+
void DiscreteGradient::computeDerivatives(
253+
const SimplexId &x,
254+
const std::vector<SimplexId> &stencilIds,
255+
const std::array<float, 3> &xCoords,
256+
const std::vector<std::array<float, 3>> &stencilCoords,
257+
double (&grad)[3]) {
258+
259+
const double *scalars
260+
= static_cast<double const *>(this->inputScalarField_.first);
261+
if(stencilIds[0] != -1 && stencilIds[1] != -1)
262+
grad[0] = -(scalars[stencilIds[0]] - scalars[stencilIds[1]])
263+
/ std::abs(stencilCoords[0][0] - stencilCoords[1][0]);
264+
else if(stencilIds[0] != -1 && stencilIds[1] == -1)
265+
grad[0] = -(scalars[stencilIds[0]] - scalars[x])
266+
/ std::abs(stencilCoords[0][0] - xCoords[0]);
267+
else if(stencilIds[1] != -1 && stencilIds[0] == -1)
268+
grad[0] = -(scalars[x] - scalars[stencilIds[1]])
269+
/ std::abs(stencilCoords[1][0] - xCoords[0]);
270+
if(stencilIds[2] != -1 && stencilIds[3] != -1)
271+
grad[1] = -(scalars[stencilIds[2]] - scalars[stencilIds[3]])
272+
/ std::abs(stencilCoords[2][1] - stencilCoords[3][1]);
273+
else if(stencilIds[2] != -1 && stencilIds[3] == -1)
274+
grad[1] = -(scalars[stencilIds[2]] - scalars[x])
275+
/ std::abs(stencilCoords[2][1] - xCoords[1]);
276+
else if(stencilIds[3] != -1 && stencilIds[2] == -1)
277+
grad[1] = -(scalars[x] - scalars[stencilIds[3]])
278+
/ std::abs(stencilCoords[3][1] - xCoords[1]);
279+
if(stencilIds[4] != -1 && stencilIds[5] != -1)
280+
grad[2] = -(scalars[stencilIds[4]] - scalars[stencilIds[5]])
281+
/ std::abs(stencilCoords[4][2] - stencilCoords[5][2]);
282+
else if(stencilIds[4] != -1 && stencilIds[5] == -1)
283+
grad[2] = -(scalars[stencilIds[4]] - scalars[x])
284+
/ std::abs(stencilCoords[4][2] - xCoords[2]);
285+
else if(stencilIds[5] != -1 && stencilIds[4] == -1)
286+
grad[2] = -(scalars[x] - scalars[stencilIds[5]])
287+
/ std::abs(stencilCoords[5][2] - xCoords[2]);
288+
}
289+
290+
int DiscreteGradient::getCriticalPointMap(
291+
const vector<pair<SimplexId, char>> &criticalPoints, vector<char> &isPL) {
292+
isPL.resize(numberOfVertices_);
293+
std::fill(isPL.begin(), isPL.end(), 0);
294+
for(pair<SimplexId, char> criticalPoint : criticalPoints) {
295+
const SimplexId criticalPointId = criticalPoint.first;
296+
const char criticalPointType = criticalPoint.second;
297+
298+
isPL[criticalPointId] = criticalPointType;
299+
}
300+
301+
return 0;
302+
}
303+
252304
#ifdef TTK_ENABLE_MPI
253305
void DiscreteGradient::setCellToGhost(const int cellDim,
254306
const SimplexId cellId) {

0 commit comments

Comments
 (0)