code: def quasi_newton_uniform_blocks(points, cells, *args, **kwargs):
      
  
      def get_new_points(mesh):
          # TODO need copy?
          x = mesh.node_coords.copy()
          x += update(mesh)
          # update ghosts
          x[ghosted_mesh.is_ghost_point] = ghosted_mesh.reflect_ghost(
              x[ghosted_mesh.mirrors]
          )
          return x
  
      ghosted_mesh = GhostedMesh(points, cells)
  
      runner(
          get_new_points,
          ghosted_mesh,
          *args,
          **kwargs,
          update_topology=lambda mesh: ghosted_mesh.update_topology(),
          # get_stats_mesh=lambda mesh: ghosted_mesh.get_unghosted_mesh(),
      )
  
      mesh = ghosted_mesh.get_unghosted_mesh()
      return mesh.node_coords, mesh.cells["nodes"]
docs: Lloyd's algorithm can be though of a diagonal-only Hessian; this method
      incorporates the diagonal blocks, too.