def METHOD_NAME(self, motion):
    '''
    @param: motion contains distance info and motion info of keypoints
    @return: return predicted motion for each grid vertex
    '''
    distance_info = motion[:, 0:2, :]
    motion_info = motion[0:1, 2:4, :]
    embedding_distance = self.embedding(distance_info)
    embedding_distance = self.leakyRelu(self.conv1(embedding_distance))
    embedding_distance = self.leakyRelu(self.conv2(embedding_distance))
    distance_weighted = self.weighted(self.conv3(embedding_distance))
    embedding_motion = self.embedding_motion(motion_info)
    embedding_motion = self.leakyRelu(self.m_conv1(embedding_motion))
    embedding_motion = self.leakyRelu(self.m_conv2(embedding_motion))
    embedding_motion = self.leakyRelu(self.m_conv3(embedding_motion))
    embedding_motion = embedding_motion.repeat(distance_info.shape[0], 1,
                                               1)
    embedding_motion = torch.cat([embedding_motion, embedding_distance], 1)
    embedding_motion = self.leakyRelu(self.fuse_conv1(embedding_motion))
    embedding_motion = self.leakyRelu(self.fuse_conv2(embedding_motion))
    embedding_motion = torch.sum(embedding_motion * distance_weighted, 2)
    out_motion = self.decoder(embedding_motion)
    return out_motion