Source code for geomfum.wrap.robust

"""robust_laplacian wrapper."""

import geomstats.backend as gs
import robust_laplacian

import geomfum.backend as xgs
from geomfum.laplacian import BaseLaplacianFinder


[docs] class RobustMeshLaplacianFinder(BaseLaplacianFinder): """Algorithm to find the Laplacian of a mesh. Parameters ---------- mollify_factor : float Amount of intrinsic mollification to perform. """ def __init__(self, mollify_factor=1e-5): self.mollify_factor = mollify_factor def __call__(self, shape): """Apply algorithm. Parameters ---------- shape : TriangleMesh Mesh. Returns ------- stiffness_matrix : sparse.csc_matrix, shape=[n_vertices, n_vertices] Stiffness matrix. mass_matrix : sparse.csc_matrix, shape=[n_vertices, n_vertices] Diagonal lumped mass matrix. """ stiffness_matrix, mass_matrix = robust_laplacian.mesh_laplacian( gs.to_numpy(xgs.to_device(shape.vertices, "cpu")), gs.to_numpy(xgs.to_device(shape.faces, "cpu")), mollify_factor=self.mollify_factor, ) return xgs.sparse.from_scipy_csc(stiffness_matrix), xgs.sparse.from_scipy_csc( mass_matrix )
[docs] class RobustPointCloudLaplacianFinder(BaseLaplacianFinder): """Algorithm to find the Laplacian of a point cloud. Parameters ---------- mollify_factor : float Amount of intrinsic mollification to perform. n_neighbors : float Number of nearest neighbors to use when constructing local triangulations. """ def __init__(self, mollify_factor=1e-5, n_neighbors=30): self.mollify_factor = mollify_factor self.n_neighbors = n_neighbors def __call__(self, shape): """Apply algorithm. Parameters ---------- shape : PointCloud Point cloud. Returns ------- stiffness_matrix : scipy.sparse.csc_matrix, shape=[n_vertices, n_vertices] "Weak" Laplace matrix. mass_matrix : scipy.sparse.csc_matrix, shape=[n_vertices, n_vertices] Diagonal lumped mass matrix. """ return robust_laplacian.point_cloud_laplacian( shape.vertices, mollify_factor=self.mollify_factor, n_neighbors=self.n_neighbors, )