code: def optimize_linear(grad, eps, norm=np.inf):
      """
      Solves for the optimal input to a linear function under a norm constraint.
  
      Optimal_perturbation = argmax_{eta, ||eta||_{norm} < eps} dot(eta, grad)
  
      :param grad: tf tensor containing a batch of gradients
      :param eps: float scalar specifying size of constraint region
      :param norm: int specifying order of norm
      :returns:
        tf tensor containing optimal perturbation
      """
  
      # Convert the iterator returned by `range` into a list.
      axis = list(range(1, len(grad.get_shape())))
      avoid_zero_div = 1e-12
      if norm == np.inf:
          # Take sign of gradient
          optimal_perturbation = tf.sign(grad)
          # The following line should not change the numerical results. It applies only because
          # `optimal_perturbation` is the output of a `sign` op, which has zero derivative anyway.
          # It should not be applied for the other norms, where the perturbation has a non-zero derivative.
          optimal_perturbation = tf.stop_gradient(optimal_perturbation)
      elif norm == 1:
          abs_grad = tf.abs(grad)
          sign = tf.sign(grad)
          max_abs_grad = tf.reduce_max(abs_grad, axis, keepdims=True)
          tied_for_max = tf.dtypes.cast(
              tf.equal(abs_grad, max_abs_grad), dtype=tf.float32
          )
          num_ties = tf.reduce_sum(tied_for_max, axis, keepdims=True)
          optimal_perturbation = sign * tied_for_max / num_ties
      elif norm == 2:
          square = tf.maximum(
              avoid_zero_div,
              tf.reduce_sum(tf.square(grad), axis, keepdims=True),
          )
          optimal_perturbation = grad / tf.sqrt(square)
      else:
          raise NotImplementedError(
              "Only L-inf, L1 and L2 norms are currently implemented."
          )
  
      # Scale perturbation to be the solution for the norm=eps rather than norm=1 problem
      scaled_perturbation = tf.multiply(eps, optimal_perturbation)
      return scaled_perturbation
  
file_path: cleverhans/cleverhans/tf2/utils.py
imports: import numpy
  import tensorflow
label_desc: Use image node_id 8 for calling a global function with example usage: optimize_linear(grad, eps, norm) and returns: scaled_perturbation