# Path: deep_verify/src/specifications/target_objective_standard.py
# class StandardTargetObjective(target_objective_base.TargetObjective):
#   def __init__(self, num_classes):
#   def target_objective(self, final_w, final_b, labels):
#   def filter_correct_class(self, dual_obj, labels, margin=0.):
#   def neq(self, labels):
#   def num_targets(self):


import abc
import six
import tensorflow as tf
from absl import logging
from deep_verify.src.specifications import target_objective_standard
      labels: 1D integer tensor of shape (batch_size) of labels for each
        input example.
      dual_var_getter: Function(name, shape, dtype) returning a dual variable.
      margin: Dual objective values for correct class will be forced to
        `-margin`, thus disregarding large negative bounds when maximising.
      target_strategy: target_objective_strategy object defining the objective
        to optimize for the Lagrangian, default set to None, in which case we
        will use the standard verification objective.
      objective_computation_config: Additional params to dual obj calculation.

    Returns:
      dual_objective: 2D tensor of shape (num_classes, batch_size) containing
        dual objective values for each (class, example).
      dual_var_lists: Nested list of 3D tensors of shape
        (num_classes, batch_size, layer_size) and 5D tensors of shape
        (num_classes, batch_size, height, width, channels)
        containing Lagrange multipliers for the layers' calculations.
        This has the same length as `verifiable_layers`, and typically each
        entry is a singleton list with the dual variable for that layer.
        ResNet blocks' entries have instead the structure
        [[left-sub-duals], [right-sub-duals], overall-dual].
      init_duals_op: TensorFlow operation to initialise all dual variables.
      project_duals_op: TensorFlow operation to project all dual variables
        to their bounds.
      supporting_ops: Dictionary of additional ops (e.g. 'init') for
        manipulating the dual variables.
        The set of keys is implementation-dependent, according to what the
        particular formulation supports.
    """
    target_strategy = target_strategy or (

# Path: deep_verify/src/specifications/target_objective_standard.py
# class StandardTargetObjective(target_objective_base.TargetObjective):
#   def __init__(self, num_classes):
#   def target_objective(self, final_w, final_b, labels):
#   def filter_correct_class(self, dual_obj, labels, margin=0.):
#   def neq(self, labels):
#   def num_targets(self):


# Path: deep_verify/src/formulations/verify_dual_base.py
import abc
import six
import tensorflow as tf
from absl import logging
from deep_verify.src.specifications import target_objective_standard

      labels: 1D integer tensor of shape (batch_size) of labels for each
        input example.
      dual_var_getter: Function(name, shape, dtype) returning a dual variable.
      margin: Dual objective values for correct class will be forced to
        `-margin`, thus disregarding large negative bounds when maximising.
      target_strategy: target_objective_strategy object defining the objective
        to optimize for the Lagrangian, default set to None, in which case we
        will use the standard verification objective.
      objective_computation_config: Additional params to dual obj calculation.

    Returns:
      dual_objective: 2D tensor of shape (num_classes, batch_size) containing
        dual objective values for each (class, example).
      dual_var_lists: Nested list of 3D tensors of shape
        (num_classes, batch_size, layer_size) and 5D tensors of shape
        (num_classes, batch_size, height, width, channels)
        containing Lagrange multipliers for the layers' calculations.
        This has the same length as `verifiable_layers`, and typically each
        entry is a singleton list with the dual variable for that layer.
        ResNet blocks' entries have instead the structure
        [[left-sub-duals], [right-sub-duals], overall-dual].
      init_duals_op: TensorFlow operation to initialise all dual variables.
      project_duals_op: TensorFlow operation to project all dual variables
        to their bounds.
      supporting_ops: Dictionary of additional ops (e.g. 'init') for
        manipulating the dual variables.
        The set of keys is implementation-dependent, according to what the
        particular formulation supports.
    """
    target_strategy = target_strategy or (

        target_objective_standard.StandardTargetObjective(