//  [python]
def prediction(self):
        # input dense feature and embedding of sparse features
        with tf.variable_scope('input_layer', reuse=tf.AUTO_REUSE):
            with tf.variable_scope('dense_input_layer',
                                   partitioner=self.input_layer_partitioner,
                                   reuse=tf.AUTO_REUSE):
                dense_inputs = tf.feature_column.input_layer(
                    self.feature, self.dense_column)
            with tf.variable_scope('sparse_input_layer', reuse=tf.AUTO_REUSE):
                column_tensors = {}
                sparse_inputs = tf.feature_column.input_layer(
                    self.feature,
                    self.sparse_column,
                    cols_to_output_tensors=column_tensors)

        # MLP behind dense inputs
        if self.bf16:
            dense_inputs = tf.cast(dense_inputs, dtype=tf.bfloat16)
            with tf.variable_scope('mlp_bot_layer',
                                   partitioner=self.dense_layer_partitioner,
                                   reuse=tf.AUTO_REUSE).keep_weights():
                for layer_id, num_hidden_units in enumerate(self.mlp_bot):
                    with tf.variable_scope(
                            "mlp_bot_hiddenlayer_%d" % layer_id,
                            reuse=tf.AUTO_REUSE) as mlp_bot_hidden_layer_scope:
                        dense_inputs = tf.layers.dense(
                            dense_inputs,
                            units=num_hidden_units,
                            activation=tf.nn.relu,
                            name=mlp_bot_hidden_layer_scope)
                        add_layer_summary(dense_inputs,
                                          mlp_bot_hidden_layer_scope.name)
            dense_inputs = tf.cast(dense_inputs, dtype=tf.float32)
        else:
            with tf.variable_scope('mlp_bot_layer',
                                   partitioner=self.dense_layer_partitioner,
                                   reuse=tf.AUTO_REUSE):
                for layer_id, num_hidden_units in enumerate(self.mlp_bot):
                    with tf.variable_scope(
                            "mlp_bot_hiddenlayer_%d" % layer_id,
                            reuse=tf.AUTO_REUSE) as mlp_bot_hidden_layer_scope:
                        dense_inputs = tf.layers.dense(
                            dense_inputs,
                            units=num_hidden_units,
                            activation=tf.nn.relu,
                            name=mlp_bot_hidden_layer_scope)
                        add_layer_summary(dense_inputs,
                                          mlp_bot_hidden_layer_scope.name)
        #interaction_op
        if self.interaction_op == 'dot':
            # dot op
            with tf.variable_scope('Op_dot_layer', reuse=tf.AUTO_REUSE):
                net = [dense_inputs]
                for cols in self.sparse_column:
                    net.append(column_tensors[cols])
                net = tf.stack(net, axis=1)
                net = self.dot_op(net)
                net = tf.concat([dense_inputs, net], 1)
        elif self.interaction_op == 'cat':
            net = tf.concat([dense_inputs, sparse_inputs], 1)

        # top MLP before output
        if self.bf16:
            net = tf.cast(net, dtype=tf.bfloat16)
            with tf.variable_scope('mlp_top_layer',
                                   partitioner=self.dense_layer_partitioner,
                                   reuse=tf.AUTO_REUSE).keep_weights():
                for layer_id, num_hidden_units in enumerate(self.mlp_top):
                    with tf.variable_scope(
                            "mlp_top_hiddenlayer_%d" % layer_id,
                            reuse=tf.AUTO_REUSE) as mlp_top_hidden_layer_scope:
                        net = tf.layers.dense(net,
                                              units=num_hidden_units,
                                              activation=tf.nn.relu,
                                              name=mlp_top_hidden_layer_scope)

                    add_layer_summary(net, mlp_top_hidden_layer_scope.name)

                with tf.variable_scope(
                        "mlp_top_hiddenlayer_last",
                        reuse=tf.AUTO_REUSE) as mlp_top_hidden_layer_scope:
                    net = tf.layers.dense(net,
                                          units=1,
                                          activation=None,
                                          name=mlp_top_hidden_layer_scope)

                    # net = tf.cast(net, dtype=tf.float32)
                    net = tf.math.sigmoid(net)

                    add_layer_summary(net, mlp_top_hidden_layer_scope.name)

            net = tf.cast(net, dtype=tf.float32)
        else:
            with tf.variable_scope('mlp_top_layer',
                                   partitioner=self.dense_layer_partitioner,
                                   reuse=tf.AUTO_REUSE):
                for layer_id, num_hidden_units in enumerate(self.mlp_top):
                    with tf.variable_scope(
                            "mlp_top_hiddenlayer_%d" % layer_id,
                            reuse=tf.AUTO_REUSE) as mlp_top_hidden_layer_scope:
                        net = tf.layers.dense(net,
                                              units=num_hidden_units,
                                              activation=tf.nn.relu,
                                              name=mlp_top_hidden_layer_scope)

                    add_layer_summary(net, mlp_top_hidden_layer_scope.name)

                with tf.variable_scope(
                        "mlp_top_hiddenlayer_last",
                        reuse=tf.AUTO_REUSE) as mlp_top_hidden_layer_scope:
                    net = tf.layers.dense(net,
                                          units=1,
                                          activation=None,
                                          name=mlp_top_hidden_layer_scope)
                    net = tf.math.sigmoid(net)

                    add_layer_summary(net, mlp_top_hidden_layer_scope.name)

        return net