#-------------------------------------------------------------
#
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements.  See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership.  The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License.  You may obtain a copy of the License at
#
#   http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied.  See the License for the
# specific language governing permissions and limitations
# under the License.
#
#-------------------------------------------------------------

# Trains a 2-layer autoencoder with minibatch SGD, momentum and step-size decay.
# If invoked with H1 > H2 then it becomes a 'bowtie' structured autoencoder
# Weights are initialized using Glorot & Bengio (2010) AISTATS initialization.
# The script standardizes the input before training (can be turned off).
# Also, it randomly reshuffles rows before training.
# Currently, tanh is set to be the activation function.
# By re-implementing 'func' DML-bodied function, one can change the activation.

# INPUT PARAMETERS:
# ---------------------------------------------------------------------------------------------
# NAME      TYPE     DEFAULT  MEANING
# ---------------------------------------------------------------------------------------------
# X         String   ---      Filename where the input is stored
# H1        Int      ---      Number of neurons in the 1st hidden layer
# H2        Int      ---      Number of neurons in the 2nd hidden layer
# EPOCH     Int      ---      Number of epochs to train for
# fmt       String   'text'   Output format ("text", "csv", "binary" etc.)
# OBJ       Boolean  FALSE    If TRUE, Computes objective function value (squared-loss)
#                             at the end of each epoch. Note that, computing the full
#                             objective can take a lot of time.
# BATCH     Int      256      Mini-batch size (training parameter)
# STEP      Double   1e-5     Initial step size (training parameter)
# DECAY     Double   0.95     Decays step size after each epoch (training parameter)
# MOMENTUM  Double   0.9      Momentum parameter (training parameter)
# ---------------------------------------------------------------------------------------------
#
# OUTPUT PARAMETERS (all filenames):
# ---------------------------------------------------------------------------------------------
# NAME     TYPE   DEFAULT  MEANING
# ---------------------------------------------------------------------------------------------
# W1_out   String   ---   File to store weights between input layer and 1st hidden layer
# b1_out   String   ---   File to store bias between input layer and 1st hidden layer
# W2_out   String   ---   File to store weights between 1st hidden layer and 2nd hidden layer
# b2_out   String   ---   File to store bias between 1st hidden layer and 2nd hidden layer
# W3_out   String   ---   File to store weights between 2nd hidden layer and 3rd hidden layer
# b3_out   String   ---   File to store bias between 2nd hidden layer and 3rd hidden layer
# W4_out   String   ---   File to store weights between 3rd hidden layer and output layer
# b4_out   String   ---   File to store bias between 3rd hidden layer and output layer
# HIDDEN   String   " "   File to store the hidden (2nd) layer representation if needed
# ---------------------------------------------------------------------------------------------
#
# INVOCATION:
# -f autoencoder_2layer.dml --nvargs X=<input file> H1=500 H2=2 EPOCH=1 fmt="csv"
#      W1_out=<weights from input to 1st hidden layer> b1_out=<bias from input to 1st hidden layer>
#      W2_out=<weights from 1st hidden layer to 2nd hidden layer> b2_out=<bias from 1st hidden layer to 2nd hidden layer>
#      W3_out=<weights from 2nd hidden layer to 3rd hidden layer> b3_out=<bias from 2nd hidden layer to 3rd hidden layer>
#      W4_out=<weights from 3rd hidden layer to output> b4_out=<bias from 3rd hidden layer to output>
#

# NOTE: This is a copy of the `scripts/staging/autoencoder-2layer.dml` with rand()
# replaced with random matrices generated in the corresponding test class.

#implements tanh
#to use another activation fn, implement a DML-bodied function with
#function name 'func' and comment out this one
func = function(Matrix[Double] X) return(Matrix[Double] Y, Matrix[Double] Y_prime){
  Y = tanh(X)
  Y_prime = 1 - Y^2
}

feedForward = function(Matrix[Double] X, Matrix[Double] W1, Matrix[Double] b1,
    Matrix[Double] W2, Matrix[Double] b2, Matrix[Double] W3, Matrix[Double] b3,
    Matrix[Double] W4, Matrix[Double] b4, Matrix[Double] Y)
  return(Matrix[Double] H1, Matrix[Double] H1_prime, Matrix[Double] H2, 
    Matrix[Double] H2_prime, Matrix[Double] H3, Matrix[Double] H3_prime,
    Matrix[Double] Yhat, Matrix[Double] Yhat_prime, Matrix[Double] E)
{
  H1_in = t(W1 %*% t(X) + b1)
  [H1, H1_prime] = func(H1_in)

  H2_in = t(W2 %*% t(H1) + b2)
  [H2, H2_prime] = func(H2_in)

  H3_in = t(W3 %*% t(H2) + b3)
  [H3, H3_prime] = func(H3_in)

  Yhat_in = t(W4 %*% t(H3) + b4)
  [Yhat, Yhat_prime] = func(Yhat_in)
  E = Yhat - Y
}

grad = function(Matrix[Double] X, Matrix[Double] H1, Matrix[Double] H1_prime,
    Matrix[Double] H2, Matrix[Double] H2_prime, Matrix[Double] H3,
    Matrix[Double] H3_prime, Matrix[Double] Yhat_prime, Matrix[Double] E,
    Matrix[Double] W1, Matrix[Double] W2, Matrix[Double] W3, Matrix[Double] W4)
  return(Matrix[Double] W1_grad, Matrix[Double] b1_grad, Matrix[Double] W2_grad,
    Matrix[Double] b2_grad, Matrix[Double] W3_grad, Matrix[Double] b3_grad,
    Matrix[Double] W4_grad, Matrix[Double] b4_grad)
{
  #backprop
  delta4 = E * Yhat_prime
  delta3 = H3_prime * (delta4 %*% W4)
  delta2 = H2_prime * (delta3 %*% W3)
  delta1 = H1_prime * (delta2 %*% W2)

  #compute gradients
  b4_grad = t(colSums(delta4))
  b3_grad = t(colSums(delta3))
  b2_grad = t(colSums(delta2))
  b1_grad = t(colSums(delta1))

  W4_grad = t(delta4) %*% H3
  W3_grad = t(delta3) %*% H2
  W2_grad = t(delta2) %*% H1
  W1_grad = t(delta1) %*% X
}

obj = function(Matrix[Double] E) return(Double val){
  val = 0.5 * sum(E^2)
}

batch_size = ifdef($BATCH, 256)
mu = ifdef($MOMENTUM, 0.9)
step = ifdef($STEP, 1e-5)
decay = ifdef($DECAY, 0.95)
hfile = ifdef($HIDDEN, " ")
fmt = ifdef($fmt, "text")
full_obj = ifdef($OBJ, FALSE)

X = read($X)
num_hidden1 = $H1
num_hidden2 = $H2
max_epochs = $EPOCH
W1_rand = read($W1_rand)
W2_rand = read($W2_rand)
W3_rand = read($W3_rand)
W4_rand = read($W4_rand)
order_rand = read($order_rand)

n = nrow(X)
m = ncol(X)

#randomly reordering rows
#permut = table(seq(1,n,1), order(target=Rand(rows=n, cols=1, min=0, max=1, pdf="uniform"), by=1, index.return=TRUE), n, n)
permut = table(seq(1,n,1), order(target=order_rand, by=1, index.return=TRUE), n, n)
X = permut %*% X

#z-transform, whitening operator is better
means = colSums(X)/n
stds = sqrt((colSums(X^2)/n - means*means)*n/(n-1)) + 1e-17
X = (X - means)/stds

W1 = sqrt(6)/sqrt(m + num_hidden1) * W1_rand #Rand(rows=num_hidden1, cols=m, min=-1, max=1, pdf="uniform")
b1 = matrix(0, rows=num_hidden1, cols=1)
W2 = sqrt(6)/sqrt(num_hidden1 + num_hidden2) * W2_rand #Rand(rows=num_hidden2, cols=num_hidden1, min=-1, max=1, pdf="uniform")
b2 = matrix(0, rows=num_hidden2, cols=1)
W3 = sqrt(6)/sqrt(num_hidden2 + num_hidden1) * W3_rand #Rand(rows=num_hidden1, cols=num_hidden2, min=-1, max=1, pdf="uniform")
b3 = matrix(0, rows=num_hidden1, cols=1)
W4 = sqrt(6)/sqrt(num_hidden2 + m) * W4_rand #Rand(rows=m, cols=num_hidden1, min=-1, max=1, pdf="uniform")
b4 = matrix(0, rows=m, cols=1)

upd_W1 = matrix(0, rows=nrow(W1), cols=ncol(W1))
upd_b1 = matrix(0, rows=nrow(b1), cols=ncol(b1))
upd_W2 = matrix(0, rows=nrow(W2), cols=ncol(W2))
upd_b2 = matrix(0, rows=nrow(b2), cols=ncol(b2))
upd_W3 = matrix(0, rows=nrow(W3), cols=ncol(W3))
upd_b3 = matrix(0, rows=nrow(b3), cols=ncol(b3))
upd_W4 = matrix(0, rows=nrow(W4), cols=ncol(W4))
upd_b4 = matrix(0, rows=nrow(b4), cols=ncol(b4))

if( full_obj ){
  [full_H1, full_H1_prime, full_H2, full_H2_prime, full_H3, full_H3_prime, 
    full_Yhat, full_Yhat_prime, full_E] = feedForward(X, W1, b1, W2, b2, W3, b3, W4, b4, X)
  full_o = obj(full_E)
  print("EPOCHS=" + 0 + " OBJ (FULL DATA): " + full_o)
}

iter = 0
num_iters_per_epoch = ceil(n / batch_size)
max_iterations = max_epochs * num_iters_per_epoch
#print("num_iters_per_epoch=" + num_iters_per_epoch + " max_iterations=" + max_iterations)
beg = 1
while( iter < max_iterations ) {
  end = beg + batch_size - 1
  if(end > n) end = n
  X_batch = X[beg:end,]

  [H1, H1_prime, H2, H2_prime, H3, H3_prime, Yhat, Yhat_prime, E] = feedForward(X_batch, W1, b1, W2, b2, W3, b3, W4, b4, X_batch)
  [W1_grad, b1_grad, W2_grad, b2_grad, W3_grad, b3_grad, W4_grad, b4_grad] = grad(X_batch, H1, H1_prime, H2, H2_prime, H3, H3_prime, Yhat_prime, E, W1, W2, W3, W4)

  o = obj(E)
  print("epochs=%5.4f BATCH beg=%d end=%d obj=%f", (iter / num_iters_per_epoch), beg, end, o)

  #update
  local_step = step / nrow(X_batch)
  upd_W1 = mu * upd_W1 - local_step * W1_grad
  upd_b1 = mu * upd_b1 - local_step * b1
  upd_W2 = mu * upd_W2 - local_step * W2_grad
  upd_b2 = mu * upd_b2 - local_step * b2
  upd_W3 = mu * upd_W3 - local_step * W3_grad
  upd_b3 = mu * upd_b3 - local_step * b3
  upd_W4 = mu * upd_W4 - local_step * W4_grad
  upd_b4 = mu * upd_b4 - local_step * b4
  W1 = W1 + upd_W1
  b1 = b1 + upd_b1
  W2 = W2 + upd_W2
  b2 = b2 + upd_b2
  W3 = W3 + upd_W3
  b3 = b3 + upd_b3
  W4 = W4 + upd_W4
  b4 = b4 + upd_b4

  iter = iter + 1
  if(end == n) beg = 1
  else beg = end + 1

  if( iter %% num_iters_per_epoch == 0 ) step = step * decay

  if( full_obj & iter %% num_iters_per_epoch == 0 ){
    [full_H1, full_H1_prime, full_H2, full_H2_prime, full_H3, full_H3_prime, full_Yhat, full_Yhat_prime, full_E] = feedForward(X, W1, b1, W2, b2, W3, b3, W4, b4, X)
    full_o = obj(full_E)
    epochs = iter %/% num_iters_per_epoch
    print("EPOCHS=" + epochs + " iter=" + iter + " OBJ (FULL DATA)=" + full_o)
  }
}

write(W1, $W1_out, format=fmt)
write(b1, $b1_out, format=fmt)
write(W2, $W2_out, format=fmt)
write(b2, $b2_out, format=fmt)
write(W3, $W3_out, format=fmt)
write(b3, $b3_out, format=fmt)
write(W4, $W4_out, format=fmt)
write(b4, $b4_out, format=fmt)

if( hfile != " " ){
  [full_H1, full_H1_prime, full_H2, full_H2_prime, full_H3, full_H3_prime, full_Yhat, full_Yhat_prime, full_E] = feedForward(X, W1, b1, W2, b2, W3, b3, W4, b4, X)
  reordered_H = t(permut) %*% full_H2
  write(reordered_H, hfile, format=fmt)
}
