docstr: A callable for `edge_convolution_template` that computes curvature.
code: def _edge_curvature_2d(self, vertex_features, neighbor_features):
      """A callable for `edge_convolution_template` that computes curvature."""
      x_position, x_normal = tf.split(
          value=vertex_features, num_or_size_splits=2, axis=-1
      )
      y_position, y_normal = tf.split(
          value=neighbor_features, num_or_size_splits=2, axis=-1
      )
      yx_diff = x_position - y_position
      curvature_unscaled = tf.abs(
          tf.reduce_sum(
              input_tensor=(y_normal - x_normal) * yx_diff,
              axis=-1,
              keepdims=True,
          )
      )
      edge_length_squared = tf.reduce_sum(
          input_tensor=yx_diff * yx_diff, axis=-1, keepdims=True
      )
      return tf.where(
          tf.less(edge_length_squared, 1e-7),
          tf.zeros_like(edge_length_squared),
          curvature_unscaled / edge_length_squared,
      )
  
imports: from __future__ import absolute_import
  from __future__ import division
  from __future__ import print_function
  import itertools
  from absl.testing import parameterized
  import numpy
  from six.moves import range
  import tensorflow
  import tensorflow_graphics.geometry.convolution.graph_convolution
  from tensorflow_graphics.util import test_case
label_desc: Use image node_id 4 for calling the EdgeConvolutionTemplateTests obj's underlying member method code with example usage: obj._edge_curvature_2d(vertex_features, neighbor_features) and returns: tf