Implements the Feature Steered graph convolution.
tfg.geometry.convolution.graph_convolution.feature_steered_convolution(
    data: type_alias.TensorLike,
    neighbors: tf.sparse.SparseTensor,
    sizes: type_alias.TensorLike,
    var_u: type_alias.TensorLike,
    var_v: type_alias.TensorLike,
    var_c: type_alias.TensorLike,
    var_w: type_alias.TensorLike,
    var_b: type_alias.TensorLike,
    name='graph_convolution_feature_steered_convolution'
) -> tf.Tensor
FeaStNet: Feature-Steered Graph Convolutions for 3D Shape Analysis
Nitika Verma, Edmond Boyer, Jakob Verbeek
CVPR 2018
https://arxiv.org/abs/1706.05206
The shorthands used below are
  V: The number of vertices.
  C: The number of channels in the input data.
  D: The number of channels in the output after convolution.
  W: The number of weight matrices used in the convolution.
  The input variables (var_u, var_v, var_c, var_w, var_b) correspond
  to the variables with the same names in the paper cited above.
Note | 
| 
In the following, A1 to An are optional batch dimensions.
 | 
Args | 
data
 | 
A float tensor with shape [A1, ..., An, V, C].
 | 
neighbors
 | 
A SparseTensor with the same type as data and with shape
[A1, ..., An, V, V] representing vertex neighborhoods. The neighborhood
of a vertex defines the support region for convolution. For a mesh, a
common choice for the neighborhood of vertex i would be the vertices in
the K-ring of i (including i itself). Each vertex must have at least one
neighbor. For a faithful implementation of the FeaStNet convolution,
neighbors should be a row-normalized weight matrix corresponding to the
graph adjacency matrix with self-edges: neighbors[A1, ..., An, i, j] > 0
if vertex j is a neighbor of i, and neighbors[A1, ..., An, i, i] > 0 for
all i, and sum(neighbors, axis=-1)[A1, ..., An, i] == 1.0 for all i.
These requirements are relaxed in this implementation.
 | 
sizes
 | 
An int tensor of shape [A1, ..., An] indicating the true input
sizes in case of padding (sizes=None indicates no padding).Note that
sizes[A1, ..., An] <= V. If data and neighbors are 2-D, sizes will
be ignored. An example usage of sizes: consider an input consisting of
three graphs G0, G1, and G2 with V0, V1, and V2 vertices respectively. The
padded input would have the following shapes: data.shape = [3, V, C] and
neighbors.shape = [3, V, V], where V = max([V0, V1, V2]). The true
sizes of each graph will be specified by sizes=[V0, V1, V2],
data[i, :Vi, :] and neighbors[i, :Vi, :Vi] will be the vertex and
neighborhood data of graph Gi. The SparseTensor neighbors should have
no nonzero entries in the padded regions.
 | 
var_u
 | 
A 2-D tensor with shape [C, W].
 | 
var_v
 | 
A 2-D tensor with shape [C, W].
 | 
var_c
 | 
A 1-D tensor with shape [W].
 | 
var_w
 | 
A 3-D tensor with shape [W, C, D].
 | 
var_b
 | 
A 1-D tensor with shape [D].
 | 
name
 | 
A name for this op. Defaults to
graph_convolution_feature_steered_convolution.
 | 
Returns | 
Tensor with shape [A1, ..., An, V, D].
 | 
Raises | 
TypeError
 | 
if the input types are invalid.
 | 
ValueError
 | 
if the input dimensions are invalid.
 |