## Copyright (c) 2019, Alliance for Open Media. All rights reserved
##
## This source code is subject to the terms of the BSD 2 Clause License and
## the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License
## was not distributed with this source code in the LICENSE file, you can
## obtain it at www.aomedia.org/license/software. If the Alliance for Open
## Media Patent License 1.0 was not distributed with this source code in the
## PATENTS file, you can obtain it at www.aomedia.org/license/patent.
##

import tensorflow as tf
import numpy as np

def resblock(temp_tensor, convId, weights):
	out_tensor = None
	skip_tensor = None
	conv_secondID = 0

	skip_tensor = temp_tensor

	# Conv, 1x1, filters=192 ,+ ReLU
	conv_w = tf.get_variable("conv_%02d_%02d_w" % (convId, conv_secondID), [1, 1, 32, 192],
							 initializer=tf.contrib.layers.xavier_initializer())
	conv_b = tf.get_variable("conv_%02d_%02d_b" % (convId, conv_secondID), [192], initializer=tf.constant_initializer(0))
	weights.append(conv_w)
	weights.append(conv_b)
	out_tensor = tf.nn.relu(tf.nn.bias_add(tf.nn.conv2d(temp_tensor, conv_w, strides=[1, 1, 1, 1], padding='SAME'), conv_b))
	conv_secondID += 1

	# Conv, 1x1, filters=25
	conv_w = tf.get_variable("conv_%02d_%02d_w" % (convId, conv_secondID), [1, 1, 192, 25],
							 initializer=tf.contrib.layers.xavier_initializer())
	conv_b = tf.get_variable("conv_%02d_%02d_b" % (convId, conv_secondID), [25], initializer=tf.constant_initializer(0))
	weights.append(conv_w)
	weights.append(conv_b)
	out_tensor = tf.nn.bias_add(tf.nn.conv2d(out_tensor, conv_w, strides=[1, 1, 1, 1], padding='SAME'), conv_b)
	conv_secondID += 1

	# Conv, 3x3, filters=32
	conv_w = tf.get_variable("conv_%02d_%02d_w" % (convId, conv_secondID), [3, 3, 25, 32],
							 initializer=tf.contrib.layers.xavier_initializer())
	conv_b = tf.get_variable("conv_%02d_%02d_b" % (convId, conv_secondID), [32], initializer=tf.constant_initializer(0))
	weights.append(conv_w)
	weights.append(conv_b)
	out_tensor = tf.nn.bias_add(tf.nn.conv2d(out_tensor, conv_w, strides=[1, 1, 1, 1], padding='SAME'), conv_b)
	conv_secondID += 1

	#skip + out_tensor
	out_tensor = tf.add(skip_tensor, out_tensor)

	return out_tensor

def model16(input_tensor):
	weights = []
	tensor = None
	convId = 0

	'''conv_00_w = tf.get_variable("conv_%02d_w" % (convId), [3, 3, 1, 32],
								initializer=tf.random_normal_initializer(stddev=np.sqrt(2.0 / 9)))'''
	'''conv_00_w = tf.get_variable("conv_%02d_w" % (convId), [3, 3, 1, 32],
								initializer=tf.random_uniform_initializer(minval=-1 * np.sqrt(6.0 / 9), maxval = np.sqrt(6.0 / 9)))'''
	conv_00_w = tf.get_variable("conv_%02d_w" % (convId), [3, 3, 1, 32],
								initializer=tf.contrib.layers.xavier_initializer())
	conv_00_b = tf.get_variable("conv_%02d_b" % (convId), [32], initializer=tf.constant_initializer(0))
	weights.append(conv_00_w)
	weights.append(conv_00_b)
	tensor = tf.nn.bias_add(tf.nn.conv2d(input_tensor, conv_00_w, strides=[1, 1, 1, 1], padding='SAME'), conv_00_b)
	convId += 1

	#Residual Block x 16
	for i in range(16):
		tensor = resblock(tensor, convId, weights)
		convId += 1

	conv_w = tf.get_variable("conv_%02d_w" % (convId), [3, 3, 32, 1],
								initializer=tf.contrib.layers.xavier_initializer())
	conv_b = tf.get_variable("conv_%02d_b" % (convId), [1], initializer=tf.constant_initializer(0))
	weights.append(conv_w)
	weights.append(conv_b)
	tensor = tf.nn.bias_add(tf.nn.conv2d(tensor, conv_w, strides=[1, 1, 1, 1], padding='SAME'), conv_b)

	tensor = tf.add(tensor, input_tensor)

	return tensor, weights
