Mesh Optimisers#

Creating a Loss Function#

To create a loss function, you can subclass the digeo.optim.MeshLossFunc class and implement the compute method. The compute method should take in the mesh and the points, and return a tuple containing the loss value and the gradient with respect to the points. The gradients should be in 3d space, and the loss value should be a scalar.

With the loss function defined, you can then use it in the optimisers provided in the digeo.optim module, such as mesh_gd and mesh_lbfgs.

Example#

Here is an example of a simple loss function that computes the distance from the points to a target point:

import torch
from digeo import Mesh, MeshPointBatch, load_mesh_from_file
from digeo.optim import MeshLossFunc, mesh_lbfgs
from digeo.ops import uniform_sampling

class DistanceToTarget(MeshLossFunc):
    def __init__(self, target: torch.Tensor):
        self.target = target

    def compute(self, mesh: Mesh, points: MeshPointBatch) -> Tuple[float, torch.Tensor]:
        # Compute the distance from the points to the target
        distances = torch.norm(points - self.target, dim=-1)
        loss = distances.mean()
        # Compute the gradient with respect to the points
        grad = (points - self.target) / (distances.unsqueeze(-1) + 1e-8)
        return loss.item(), grad

loss_func = DistanceToTarget(target=torch.tensor([0.0, 0.0, 0.0]))
mesh = load_mesh_from_file("path/to/mesh.obj")
x = uniform_sampling(mesh, num_points=100)

result, logs = mesh_lbfgs(mesh, x, loss_func, max_iter=100)