#!/bin/bash

WGET_OPTIONS="--no-check-certificate"
MRO_VERSION="3.2.4"

# update debian repos & upgrade packages
apt-get update
DEBIAN_FRONTEND=noninteractive apt-get -y -o Dpkg::Options::="--force-confdef" -o Dpkg::Options::="--force-confnew" upgrade

# install new packages for R
apt-get -y install build-essential gfortran ed htop libxml2-dev ca-certificates curl libcurl4-openssl-dev gdebi-core sshpass

# hack with Microsoft R Open deps
wget ${WGET_OPTIONS} http://ftp.pl.debian.org/debian/pool/main/libj/libjpeg8/libjpeg8_8d1-2_amd64.deb
gdebi -n libjpeg8_8d1-2_amd64.deb
rm libjpeg8_8d1-2_amd64.deb

# install Microsoft R Open
wget ${WGET_OPTIONS} https://mran.microsoft.com/install/mro/${MRO_VERSION}/MRO-${MRO_VERSION}-Ubuntu-15.4.x86_64.deb
gdebi -n MRO-${MRO_VERSION}-Ubuntu-15.4.x86_64.deb
rm MRO-${MRO_VERSION}-Ubuntu-15.4.x86_64.deb

# make symbolic link to R libraries dir
ln -s /usr/lib64/MRO-${MRO_VERSION}/R-${MRO_VERSION}/lib/R/lib/ /opt/MRO-lib

# make directory for BLAS and LAPACK libraries
mkdir -p /opt/blap-lib/

# Generic BLAS & LAPACK install/uninstall in R:
#
# install:   mv /opt/MRO-lib/libRblas.so   /opt/MRO-lib/libRblas.so.orig
#            mv /opt/MRO-lib/libRlapack.so /opt/MRO-lib/libRlapack.so.orig
#            ln -s /opt/blap-lib/xxx/libblas.so   /opt/MRO-lib/libRblas.so
#            ln -s /opt/blap-lib/xxx/liblapack.so /opt/MRO-lib/libRlapack.so
#
# uninstall: rm /opt/MRO-lib/libRblas.so
#            rm /opt/MRO-lib/libRlapack.so
#            mv /opt/MRO-lib/libRblas.so.orig   /opt/MRO-lib/libRblas.so
#            mv /opt/MRO-lib/libRlapack.so.orig /opt/MRO-lib/libRlapack.so

##############################################################
##############################################################
##                          CPU                             ##
##############################################################
##############################################################

##############################################################
# netlib                                                     #
# - http://www.netlib.org/                                   #
# - BLAS + LAPACK                                            #
# - single-threaded (reference)                              #
##############################################################

mkdir /opt/blap-lib/netlib/

apt-get -y install libblas3 liblapack3

cp /usr/lib/libblas/libblas.so.3.0  /opt/blap-lib/netlib/
cp /usr/lib/lapack/liblapack.so.3.0 /opt/blap-lib/netlib/

apt-get -y purge libblas3 liblapack3

##############################################################
# ATLAS (st)                                                 #
# - http://math-atlas.sourceforge.net/                       #
# - BLAS + LAPACK                                            #
# - single-threaded                                          #
##############################################################

mkdir /opt/blap-lib/atlas-st/

apt-get -y install libatlas3-base

cp /usr/lib/atlas-base/atlas/libblas.so.3   /opt/blap-lib/atlas-st/
cp /usr/lib/atlas-base/atlas/liblapack.so.3 /opt/blap-lib/atlas-st/

apt-get -y purge libatlas3-base

##############################################################
# OpenBLAS                                                   #
# - http://www.openblas.net/                                 #
# - BLAS + LAPACK                                            #
# - multi-threaded                                           #
##############################################################

mkdir /opt/blap-lib/openblas/

apt-get -y install libopenblas-base

cp /usr/lib/openblas-base/libblas.so.3   /opt/blap-lib/openblas/
cp /usr/lib/openblas-base/liblapack.so.3 /opt/blap-lib/openblas/

apt-get -y purge libopenblas-base

##############################################################
# ATLAS (mt)                                                 #
# - http://math-atlas.sourceforge.net/                       #
# - BLAS + LAPACK                                            #
# - multi-threaded                                           #
##############################################################

# disable CPU throttling!

mkdir /opt/blap-lib/atlas-mt/

curl -L https://sourceforge.net/projects/math-atlas/files/Developer%20%28unstable%29/3.11.38/atlas3.11.38.tar.bz2/download > atlas3.11.38.tar.bz2
tar -xvf atlas3.11.38.tar.bz2
rm atlas3.11.38.tar.bz2

cd ATLAS
mkdir build
cd build

wget ${WGET_OPTIONS} http://www.netlib.org/lapack/lapack-3.6.0.tgz

../configure --shared --with-netlib-lapack-tarfile=`pwd`/lapack-3.6.0.tgz
make

cp lib/libtatlas.so /opt/blap-lib/atlas-mt/

cd ../../
rm -r ATLAS

##############################################################
# GotoBLAS2                                                  #
# - https://prs.ism.ac.jp/~nakama/SurviveGotoBLAS2/          #
# - BLAS + LAPACK                                            #
# - multi-threaded                                           #
##############################################################

mkdir /opt/blap-lib/gotoblas2/

wget ${WGET_OPTIONS} https://prs.ism.ac.jp/~nakama/SurviveGotoBLAS2/SurviveGotoBLAS2_3.141.tar.gz
tar -xvf SurviveGotoBLAS2_3.141.tar.gz
rm SurviveGotoBLAS2_3.141.tar.gz

cd survivegotoblas2-3.141
make -j `nproc`
cd ..

cp survivegotoblas2-3.141/exports/libgoto2_nehalemp-r3.141_blas.so   /opt/blap-lib/gotoblas2/
cp survivegotoblas2-3.141/exports/libgoto2_nehalemp-r3.141_lapack.so /opt/blap-lib/gotoblas2/

rm -r survivegotoblas2-3.141

##############################################################
# MKL                                                        #
# - https://mran.microsoft.com/documents/rro/multithread/    #
# - BLAS + LAPACK                                            #
# - multi-threaded                                           #
##############################################################

mkdir /opt/blap-lib/mkl/

wget ${WGET_OPTIONS} https://mran.microsoft.com/install/mro/${MRO_VERSION}/RevoMath-${MRO_VERSION}.tar.gz
tar -xvzf RevoMath-${MRO_VERSION}.tar.gz
rm RevoMath-${MRO_VERSION}.tar.gz
sed -i '16,18d' RevoMath/RevoMath.sh

mv RevoMath /opt/blap-lib/mkl/

# install:   cd /opt/blap-lib/mkl/RevoMath ; echo 1 | ./RevoMath.sh
# uninstall: cd /opt/blap-lib/mkl/RevoMath ; echo 2 | ./RevoMath.sh

##############################################################
# BLIS                                                       #
# - https://github.com/flame/blis                            #
# - BLAS                                                     #
# - multi-threaded                                           #
##############################################################

mkdir /opt/blap-lib/blis/

git clone https://github.com/flame/blis.git
cd blis

./configure --enable-shared auto
make -j `nproc`
cd ..

cp `find ./blis/ -name "libblis.so"` /opt/blap-lib/blis/

rm -r blis

##############################################################
##############################################################
##                          GPU                             ##
##############################################################
##############################################################

##############################################################
# clBLAS                                                     #
# - https://github.com/clMathLibraries/clBLAS                #
# - BLAS                                                     #
# - OpenCL                                                   #
##############################################################

git clone https://github.com/clMathLibraries/clBLAS.git

##############################################################
# cuBLAS (NVBLAS)                                            #
# - https://developer.nvidia.com/cublas                      #
# - BLAS                                                     #
# - CUDA                                                     #
##############################################################

wget ${WGET_OPTIONS} http://developer.download.nvidia.com/compute/cuda/7.5/Prod/local_installers/cuda-repo-ubuntu1504-7-5-local_7.5-18_amd64.deb
gdebi -n cuda-repo-ubuntu1504-7-5-local_7.5-18_amd64.deb
rm cuda-repo-ubuntu1504-7-5-local_7.5-18_amd64.deb

##############################################################
# MAGMA                                                      #
# - http://icl.cs.utk.edu/magma/software/                    #
# - LAPACK                                                   #
# - OpenCL, CUDA                                             #
##############################################################

##############################################################
# CULA                                                       #
# - http://www.culatools.com/                                #
# - LAPACK                                                   #
# - CUDA                                                     #
##############################################################