def _get_feature(cls, user_ids: List, item_ids: List, with_user_embedding,
                     graph: GraphConvolutionalMatrixCompletionGraph,
                     dataset: GcmcGraphDataset, session: tf.Session,
                     feature: str) -> np.ndarray:
        if graph is None:
            RuntimeError('Please call fit first.')

        rating_adjacency_matrix = dataset.train_rating_adjacency_matrix()
        user_indices, item_indices = dataset.to_indices(user_ids, item_ids)
        if not with_user_embedding:
            user_indices = np.array(
                [0] * len(user_indices))  # TODO use default user index.

        user_feature_indices, item_feature_indices = dataset.to_feature_indices(
            user_ids, item_ids)
        input_data = dict(user=user_indices,
                          item=item_indices,
                          user_feature_indices=user_feature_indices,
                          item_feature_indices=item_feature_indices)
        feed_dict = cls._feed_dict(input_data,
                                   graph,
                                   dataset,
                                   rating_adjacency_matrix,
                                   is_train=False)
        encoder_map = dict(user=graph.user_encoder, item=graph.item_encoder)
        with session.as_default():
            feature = session.run(encoder_map[feature], feed_dict=feed_dict)
        return feature
    def _predict(cls, user_ids: List, item_ids: List, with_user_embedding,
                 graph: GraphConvolutionalMatrixCompletionGraph,
                 dataset: GcmcGraphDataset, session: tf.Session) -> np.ndarray:
        if graph is None:
            RuntimeError('Please call fit first.')

        rating_adjacency_matrix = dataset.train_rating_adjacency_matrix()
        user_indices, item_indices = dataset.to_indices(user_ids, item_ids)
        if not with_user_embedding:
            user_indices = np.array(
                [0] * len(user_indices))  # TODO use default user index.

        user_feature_indices, item_feature_indices = dataset.to_feature_indices(
            user_ids, item_ids)
        input_data = dict(user=user_indices,
                          item=item_indices,
                          user_feature_indices=user_feature_indices,
                          item_feature_indices=item_feature_indices)
        feed_dict = cls._feed_dict(input_data,
                                   graph,
                                   dataset,
                                   rating_adjacency_matrix,
                                   is_train=False)
        with session.as_default():
            predictions = session.run(graph.expectation, feed_dict=feed_dict)
        predictions = predictions.flatten()
        predictions = np.clip(predictions,
                              dataset.rating()[0],
                              dataset.rating()[-1])
        return predictions