code: def testVariableHyperParams(self):
      parameters = [tf.Variable([1.0, 2.0]), tf.Variable([3.0, 4.0])]
      updates = [tf.constant([5.0, 5.0]), tf.constant([3.0, 3.0])]
      learning_rate = tf.Variable(0.1)
      momentum_coeff = tf.Variable(0.9)
      optimizer = self.make_optimizer(
          learning_rate=learning_rate, momentum=momentum_coeff
      )
      if optimizer_tests.is_tf_optimizer(optimizer):
          self.skipTest(
              "TF SGD optimizer doesn't support variable learning rate."
          )
  
      optimizer.apply(updates, parameters)
      self.assertAllClose(
          [[0.5, 1.5], [2.7, 3.7]], [x.numpy() for x in parameters]
      )
      learning_rate.assign(0.01)
      momentum_coeff.assign(0.09)
      self.assertAlmostEqual(0.01, optimizer.learning_rate.numpy())
      self.assertAlmostEqual(0.09, optimizer.momentum.numpy())
      optimizer.apply(updates, parameters)
      self.assertAllClose(
          [[0.4455, 1.4455], [2.6673, 3.6673]],
          [x.numpy() for x in parameters],
      )
  
imports: from sonnet.src import test_utils
  from sonnet.src.optimizers import momentum
  from sonnet.src.optimizers import optimizer_tests
  import tensorflow
label_desc: Use image node_id 6 for calling the MomentumTest obj's underlying member method code with example usage: obj.testVariableHyperParams() without return types