# Path: utils/network_utils/params.py
# class LossTypes(Enum):
#     mse = "mse"
#     cross_entropy = "cross-entropy"


import tensorflow as tf
from activation import leaky_relu, relu
from loss import mse, cross_entropy
from parameters import bias_variable, weight_variable
from regularization import batch_norm_layer, dropout_layer
from utils.network_utils.params import LossTypes
        :return: None
        """
        layer_id = self._get_layer_id(layer_name)
        assert self._layer_verifier(layer_id), 'Invalid: This layer is already present.'
        if activation_type == 'relu':
            self.layers[layer_id] = relu(self.layers[input_layer_id])
        elif activation_type == 'leaky-relu':
            self.layers[layer_id] = leaky_relu(self.layers[input_layer_id])
        else:
            raise ValueError('The type of activation can only be one of ["relu", "leaky-relu"]')

        return layer_id

    def add_loss_layer(self, layer_name, prediction_layer_id, ground_truth_layer_id, loss_type):
        """
        Adds a layer corresponding to the loss function

        :param layer_name: The name of the layer. Type=string
        :param prediction_layer_id: The identifier for the prediction layer
        :param ground_truth_layer_id: The identifier for the ground truth layer
        :param loss_type: The loss function to use. Available options defined by LossTypes.
        :return: None
        """
        layer_id = self._get_layer_id(layer_name)
        assert self._layer_verifier(layer_id), 'Invalid: This layer is already present.'
        assert not self._layer_verifier(prediction_layer_id), 'Invalid: Output layer id is invalid.'
        assert not self._layer_verifier(ground_truth_layer_id), 'Invalid: Ground truth layer id is invalid.'

        output = self.layers[prediction_layer_id]
        ground_truth = self.layers[ground_truth_layer_id]

# Path: utils/network_utils/params.py
# class LossTypes(Enum):
#     mse = "mse"
#     cross_entropy = "cross-entropy"


# Path: dnn/layers.py
import tensorflow as tf
from activation import leaky_relu, relu
from loss import mse, cross_entropy
from parameters import bias_variable, weight_variable
from regularization import batch_norm_layer, dropout_layer
from utils.network_utils.params import LossTypes

        :return: None
        """
        layer_id = self._get_layer_id(layer_name)
        assert self._layer_verifier(layer_id), 'Invalid: This layer is already present.'
        if activation_type == 'relu':
            self.layers[layer_id] = relu(self.layers[input_layer_id])
        elif activation_type == 'leaky-relu':
            self.layers[layer_id] = leaky_relu(self.layers[input_layer_id])
        else:
            raise ValueError('The type of activation can only be one of ["relu", "leaky-relu"]')

        return layer_id

    def add_loss_layer(self, layer_name, prediction_layer_id, ground_truth_layer_id, loss_type):
        """
        Adds a layer corresponding to the loss function

        :param layer_name: The name of the layer. Type=string
        :param prediction_layer_id: The identifier for the prediction layer
        :param ground_truth_layer_id: The identifier for the ground truth layer
        :param loss_type: The loss function to use. Available options defined by LossTypes.
        :return: None
        """
        layer_id = self._get_layer_id(layer_name)
        assert self._layer_verifier(layer_id), 'Invalid: This layer is already present.'
        assert not self._layer_verifier(prediction_layer_id), 'Invalid: Output layer id is invalid.'
        assert not self._layer_verifier(ground_truth_layer_id), 'Invalid: Ground truth layer id is invalid.'

        output = self.layers[prediction_layer_id]
        ground_truth = self.layers[ground_truth_layer_id]

        if loss_type == LossTypes.mse: