def METHOD_NAME(self):
    self.text_mask = tf.placeholder(
        dtype=tf.float32, shape=[None, self.n_vocab], name="mask_input"
    )
    self.text_input = tf.placeholder(
        dtype=tf.float32, shape=[None, self.n_vocab], name="text_input"
    )
    self.ratings = tf.placeholder(
        dtype=tf.float32, shape=[self.n_users, None], name="rating_input"
    )
    self.C = tf.placeholder(
        dtype=tf.float32, shape=[self.n_users, None], name="C_input"
    )
    with tf.variable_scope("CDL_Variable"):
        self.U = tf.get_variable(
            name="U", dtype=tf.float32, initializer=self.U_init
        )
        self.V = tf.get_variable(
            name="V", dtype=tf.float32, initializer=self.V_init
        )
    self.item_ids = tf.placeholder(dtype=tf.int32)
    real_batch_size = tf.cast(tf.shape(self.text_input)[0], tf.int32)
    V_batch = tf.reshape(
        tf.gather(self.V, self.item_ids), shape=[real_batch_size, self.k]
    )
    corrupted_text = tf.multiply(self.text_input, self.text_mask)
    sdae_value, encoded_value, loss_w = sdae(
        X_corrupted=corrupted_text,
        layers=self.layers,
        dropout_rate=self.dropout_rate,
        act_fn=self.act_fn,
        seed=self.seed,
        name="SDAE_Variable",
    )
    loss_1 = self.lambda_u * tf.nn.l2_loss(self.U) + self.lambda_w * loss_w
    loss_2 = self.lambda_v * tf.nn.l2_loss(V_batch - encoded_value)
    loss_3 = self.lambda_n * tf.nn.l2_loss(sdae_value - self.text_input)
    predictions = tf.matmul(self.U, V_batch, transpose_b=True)
    squared_error = tf.square(self.ratings - predictions)
    loss_4 = tf.reduce_sum(tf.multiply(self.C, squared_error))
    self.loss = loss_1 + loss_2 + loss_3 + loss_4
    # Generate optimizer
    optimizer1 = tf.train.AdamOptimizer(self.lr)
    optimizer2 = tf.train.AdamOptimizer(self.lr)
    train_var_list1, train_var_list2 = [], []
    for var in tf.trainable_variables():
        if "CDL_Variable" in var.name:
            train_var_list1.append(var)
        elif "SDAE_Variable" in var.name:
            train_var_list2.append(var)
    gvs = optimizer1.compute_gradients(self.loss, var_list=train_var_list1)
    capped_gvs = [(tf.clip_by_value(grad, -5.0, 5.0), var) for grad, var in gvs]
    self.opt1 = optimizer1.apply_gradients(capped_gvs)
    gvs = optimizer2.compute_gradients(self.loss, var_list=train_var_list2)
    capped_gvs = [(tf.clip_by_value(grad, -5.0, 5.0), var) for grad, var in gvs]
    self.opt2 = optimizer2.apply_gradients(capped_gvs)