def hybrid_forward(self, F, words1, words2, words3, weight):  
words123 = F.concat(words1, words2, words3, dim=<NUM_LIT:0>)<EOL>embeddings_words123 = F.Embedding(words123, weight,<EOL>input_dim=self._vocab_size,<EOL>output_dim=self._embed_size)<EOL>if self.normalize:<EOL><INDENT>similarities = F.FullyConnected(<EOL>embeddings_words123, weight, no_bias=True,<EOL>num_hidden=self._vocab_size, flatten=False)<EOL>sim_w1w4, sim_w2w4, sim_w3w4 = F.split(similarities, num_outputs=<NUM_LIT:3>,<EOL>axis=<NUM_LIT:0>)<EOL>pred = sim_w3w4 - sim_w1w4 + sim_w2w4<EOL><DEDENT>else:<EOL><INDENT>embeddings_word1, embeddings_word2, embeddings_word3 = F.split(<EOL>embeddings_words123, num_outputs=<NUM_LIT:3>, axis=<NUM_LIT:0>)<EOL>vector = (embeddings_word3 - embeddings_word1 + embeddings_word2)<EOL>pred = F.FullyConnected(<EOL>vector, weight, no_bias=True, num_hidden=self._vocab_size,<EOL>flatten=False)<EOL><DEDENT>if self._exclude_question_words:<EOL><INDENT>for words in [words1, words2, words3]:<EOL><INDENT>pred = pred * F.one_hot(words, self.weight.shape[<NUM_LIT:0>], <NUM_LIT:0>, <NUM_LIT:1>)<EOL><DEDENT><DEDENT>pred_idxs = F.topk(pred, k=self.k)<EOL>return pred_idxs<EOL>
Compute ThreeCosAdd for given question words.

        Parameters
        ----------
        words1 : Symbol or NDArray
            Question words at first position. Shape (batch_size, )
        words2 : Symbol or NDArray
            Question words at second position. Shape (batch_size, )
        words3 : Symbol or NDArray
            Question words at third position. Shape (batch_size, )

        Returns
        -------
        Symbol or NDArray
            Predicted answer words. Shape (batch_size, k).