code: def _build_graph(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)
  
imports: import tensorflow.compat.v1
  from ...utils import get_rng
  from ...utils.init_utils import xavier_uniform
label_desc: Use image node_id 2 for calling the Model obj's underlying member method code with example usage: obj._build_graph() without return types