#!/usr/bin/bash
#version 23100100
#todo 
#apt lock导致无法apt安装
#cudnn、TensorRT、AVX2、AVX_VNNI、FMA
#conda TensorFlow
#docker
#docker-nvidia
#CLI
#启动授权方式
#换成国内源
#检测用户IP，根据ip地址提供下载方式

trap 'TaskTerm; exit' SIGTERM
trap 'TaskInt; exit' SIGINT
#trap 'TaskUP; exit' SIGUP

function version_gt() { test "$(echo "$@" | tr " " "\n" | sort -V | head -n 1)" != "$1"; }
function version_le() { test "$(echo "$@" | tr " " "\n" | sort -V | head -n 1)" == "$1"; }
function version_lt() { test "$(echo "$@" | tr " " "\n" | sort -rV | head -n 1)" != "$1"; }
function version_ge() { test "$(echo "$@" | tr " " "\n" | sort -rV | head -n 1)" == "$1"; }


# cur_py="python3.12"
# py_ver="3.12"
# cur_pip="pipx"

cur_py="python3.11"
py_ver="3.11"
cur_pip="pip"

if version_lt $version 2.0
then
    echo "system version is less than 2.0"
	cur_py="python3.8"
	py_ver="3.8"
	cur_pip="pip"
fi


function TaskTerm()
{
 	echo "TaskTerm is done"
}
function TaskInt()
{
	echo "TaskInt is done"
}
function TaskUP()
{
 	echo "TaskUP is done"
}

sigProgStart="ProgFreeStart"
sigProgEnd="ProgFreeEnd"

pathAdd=()
ldPathAdd=()
stepIndex=1
stepNum=2
exitCode=0
isPreVersion=0

#解析命令参数
# getopts
while getopts ":h:u:f:v:p:c:d" opt
do
case $opt in
	h)
		home=$OPTARG
		# echo "Home Directory is $home"
		;;
	u)
		user=$OPTARG
		# echo "USER is $user"
		;;
	f)
		framework=$OPTARG
		# echo "framework is $framework"
		;;
	v)
		version=$OPTARG
		isPreVersion=1
		echo "version is $version"
		;;
	p)
		package=$OPTARG
		case $package in
		pip)  
			stepNum=$[stepNum+3]
			stepIndex=$[stepIndex+2]
		;;
		conda)  
			stepNum=$[stepNum+5]
			stepIndex=$[stepIndex+2]
		;;
		docker)  
			stepNum=$[stepNum+1]
		;;
		*)  
			:
		;;
		esac
		# echo "package is $package"
		;;
	c)
		cuda=$OPTARG
		# echo "computer platform is $cuda"
		if [ "$cuda" == "ANY" ]
		then
			cuda="11.8"
		fi
		if [[ "$cuda" != "CPU" ]]
		then
			stepIndex=$[stepIndex+5]
			stepNum=$[stepNum+5] #init:1 nvidia:1 cuda:2 cudnn:2 prepython:1 prepip:1 updatepip:1 conda:2 docker: install:1
		fi
		# echo "new computer platform is $cuda"
		;;
	d)
		debug=$OPTARG
		# echo "debug is set"
		;;
	?)
		# echo "get param error"
		exit 1;;
esac
done

homeCachePath=$home/.aiassistant

#更新环境变量
function updateEnv()
{
	#已经支持不覆盖以前，也不重复添加
	#不用重启有效，
	echo "update system environment variables..."
	# pathAdd[${#pathAdd[@]}]="/usr/local/cuda-11.8/bin"
	# ldPathAdd[${#ldPathAdd[@]}]="/usr/local/cuda-11.8/lib64"
	if [ ! -f $home/.bashrc ]
	then
		printf "" > $home/.bashrc
	fi
	for str in ${pathAdd[@]}
	do
		if [[ $PATH =~ $str ]]
		then
			:
		else
			export PATH=$str:$PATH
		fi
		if grep "export PATH=$str:" $home/.bashrc > /dev/null 
		then
			:
		else
			echo export PATH=$str:'$PATH' >> $home/.bashrc
		fi
	done
	for str in ${ldPathAdd[@]}
	do
		if [[ $PATH =~ $str ]]
		then
			:
		else
			export PATH=$str:$PATH
		fi
		if grep "export LD_LIBRARY_PATH=$str:" $home/.bashrc > /dev/null
		then
			:
		else
			echo export LD_LIBRARY_PATH=$str:'$LD_LIBRARY_PATH' >> $home/.bashrc
		fi
	done
}

#采用Docker安装TensorFlow
function dockerInstallTensorFlow()
{
	if [ $isPreVersion -eq 1 ]
	then
		$cur_py -m $cur_pip install tf-nightly #>& 2
	else
		docker pull tensorflow/tensorflow:latest-gpu-jupyter #>& 2
	fi
	echo "wait complete"
}


#采用Docker安装PaddlePaddle
function dockerInstallPaddlePaddle()
{
	cd $home
	case $cuda in
    12.0)  
		if [ $isPreVersion -eq 1 ]
		then
		echo "dockerInstallPaddlePaddle Error: $version"
		else
		# nvidia-docker pull registry.baidubce.com/paddlepaddle/paddle:2.5.2-gpu-cuda12.0-cudnn8.9-trt8.6 #>& 2
		# nvidia-docker run --name paddle -it -v $PWD:/paddle registry.baidubce.com/paddlepaddle/paddle:2.5.2-gpu-cuda12.0-cudnn8.9-trt8.6 /bin/bash
		nvidia-docker pull registry.baidubce.com/paddlepaddle/paddle:2.6.1-gpu-cuda12.0-cudnn8.9-trt8.6
		nvidia-docker run --name paddle -it -v $PWD:/paddle registry.baidubce.com/paddlepaddle/paddle:2.6.1-gpu-cuda12.0-cudnn8.9-trt8.6 /bin/bash
		fi
    ;;
	11.7)  
		if [ $isPreVersion -eq 1 ]	
		then
		echo "dockerInstallPaddlePaddle Error: $version"
		else
		nvidia-docker pull registry.baidubce.com/paddlepaddle/paddle:2.6.1-gpu-cuda11.7-cudnn8.4-trt8.4
		nvidia-docker run --name paddle -it -v $PWD:/paddle registry.baidubce.com/paddlepaddle/paddle:2.6.1-gpu-cuda11.7-cudnn8.4-trt8.4 /bin/bash #>& 2
		fi
    ;;
    CPU)  
		if [ $isPreVersion -eq 1 ]	
		then
		:
		# docker pull registry.baidubce.com/paddlepaddle/paddle:2.5.2-jupyter #>& 2
		# docker pull registry.baidubce.com/paddlepaddle/paddle:2.6.0-jupyter
		else
		# docker run --name paddle -it -v $PWD:/paddle registry.baidubce.com/paddlepaddle/paddle:2.5.2 /bin/bash #>& 2
		docker pull registry.baidubce.com/paddlepaddle/paddle:2.6.1
		docker run --name paddle -it -v $PWD:/paddle registry.baidubce.com/paddlepaddle/paddle:2.6.1 /bin/bash
		fi
    ;;
	*)  
		echo "dockInstallPaddlePaddle Error: $cuda"
    ;;
	esac
}

#准备Docker环境
function preDockerEnv()
{
	newgrp docker
}


#采用conda安装pytorch
function condaInstallPyTorch()
{
	case $cuda in
    12.1)  
		if [ $isPreVersion -eq 1 ]
		then
		conda install pytorch torchvision torchaudio pytorch-cuda=12.1 -c pytorch-nightly -c nvidia -y #>& 2
		else
		conda install pytorch torchvision torchaudio pytorch-cuda=12.1 -c pytorch -c nvidia -y #>& 2
		fi
    ;;
    11.8)  
		if [ $isPreVersion -eq 1 ]
		then
		conda install pytorch torchvision torchaudio pytorch-cuda=11.8 -c pytorch-nightly -c nvidia -y #>& 2
		else
		conda install pytorch torchvision torchaudio pytorch-cuda=11.8 -c pytorch -c nvidia -y #>& 2
		fi
    ;;
    CPU)  
		if [ $isPreVersion -eq 1 ]
		then
		conda install pytorch torchvision torchaudio cpuonly -c pytorch-nightly -y #>& 2
		else
		conda install pytorch torchvision torchaudio cpuonly -c pytorch -y #>& 2
		fi
    ;;
	*)  
		echo "CUDA Version Error: $cuda"
    ;;
	esac
}


#采用conda安装PaddlePaddle
function condaInstallPaddlePaddle()
{
	case $cuda in
	11.7)  
		if [ $isPreVersion -eq 1 ]
		then
			echo "conda Install PaddlePaddle Error: $version"
		else
			# conda --no-plugins install paddlepaddle-gpu==2.6.0 cudatoolkit=11.7 -c https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/Paddle/ -c conda-forge -y && exitCode=0
			conda --no-plugins install paddlepaddle-gpu==2.6.1 cudatoolkit=11.7 -c https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/Paddle/ -c conda-forge y && exitCode=0
		fi
    ;;
    CPU)  
		if [ $isPreVersion -eq 1 ]
		then
			echo "conda Install PaddlePaddle Error: $version"
		else
			# conda install paddlepaddle==2.5.2 --channel https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/Paddle/ -y && exitCode=0
			# conda install paddlepaddle==2.6.0 --channel https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/Paddle/ -y && exitCode=0
			conda install paddlepaddle==2.6.1 --channel https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/Paddle/ -y && exitCode=0
		fi
    ;;
	*)  
		echo "condaInstallPaddlePaddle Error: $cuda"
    ;;
	esac
}

#检查conda是否已经安装
function checkConda()
{
	if [ -d $home/anaconda3/bin ]
	then
		return 0
	else
		return 1
	fi
}

#安装conda
function installConda()
{
	lastWD=$PWD
	mkdir -p $homeCachePath
	cd $homeCachePath
	stepIndex=$[stepIndex+1]
	echo "progIV: step$stepIndex/$stepNum downloading resources of $package..." >& 2
	echo "downloading resources of $package..."

	let sizeConda=1153404010
	md5Conda="911aaa9ad24f6a78d056846995322230"
	while true
	do
	if [ ! -f Anaconda3-2023.09-0-Linux-x86_64.sh ]
	then
		wget -c https://archive.openkylin.top/openkylin/dep-file/cuda4/Anaconda3-2023.09-0-Linux-x86_64.sh -O Anaconda3-2023.09-0-Linux-x86_64.sh >& 2 && echo "Successfully download Anaconda3-2023.09-0-Linux-x86_64.sh"
	else
		let fileSize=$(du -b Anaconda3-2023.09-0-Linux-x86_64.sh | grep -E -o [0-9]+ | head -n 1)
		if [ $fileSize -lt $sizeConda ]
		then
			wget -c https://archive.openkylin.top/openkylin/dep-file/cuda4/Anaconda3-2023.09-0-Linux-x86_64.sh -O Anaconda3-2023.09-0-Linux-x86_64.sh >& 2 && echo "Successfully download Anaconda3-2023.09-0-Linux-x86_64.sh"
		elif [ $fileSize -eq $sizeConda ]
		then
			echo "progIV:$sigProgStart" >& 2
			echo "progIV: step$stepIndex/$stepNum verify file integrity..." >& 2
			echo "verify file integrity..."	
			result=$(md5sum Anaconda3-2023.09-0-Linux-x86_64.sh)
			compare=$(echo $result | grep $md5Conda)
			if [[ "$compare" != "" ]]
			then
				echo "verify file integrity...yes"	
				break
			else
				echo "verify file integrity...failed"	
				rm Anaconda3-2023.09-0-Linux-x86_64.sh && echo "Remove corrupted file Anaconda3-2023.09-0-Linux-x86_64.sh"
			fi
			echo "progIV:$sigProgEnd" >& 2
		else
			rm Anaconda3-2023.09-0-Linux-x86_64.sh && echo "Remove corrupted file Anaconda3-2023.09-0-Linux-x86_64.sh"
		fi
	fi
	done
	echo "progIV:$sigProgStart" >& 2
	stepIndex=$[stepIndex+1]
	echo "progIV: step$stepIndex/$stepNum installing $package..." >& 2
	echo "installing $package..."
	
	
	sh Anaconda3-2023.09-0-Linux-x86_64.sh -b -t -p $home/anaconda3 > /dev/null && echo "Successfully install $package"
	
	echo "progIV:$sigProgEnd" >& 2
	cd $lastWD
}

#更新conda相关环境变量
function updateCondaEnv()
{
	echo "update system environment variables for conda..."
	if [ ! -f $home/.bashrc ]
	then
		printf "" > $home/.bashrc
	fi

	
	if grep ". $home/anaconda3/etc/profile.d/conda.sh" $home/.bashrc > /dev/null 
	then
		:
	else
		echo ". $home/anaconda3/etc/profile.d/conda.sh" >> $home/.bashrc
	fi
	source $home/anaconda3/etc/profile.d/conda.sh
	# source $home/.bashrc
}

#stepIndex+2
#准备conda环境
function preCondaEnv()
{
	if checkConda
	then
		stepIndex=$[stepIndex+2]
		echo "check $package installed... yes"
	else
		echo "check $package... no"
		installConda
	fi

	# pathAdd[${#pathAdd[@]}]="$home/anaconda3/bin"
	# updateEnv
	updateCondaEnv
	
	#创建虚拟环境
	#安装环境
	#进入虚拟环境
	case $framework in
    PaddlePaddle)  
		case $cuda in
		11.7)  
			if [ $isPreVersion -eq 1 ]
			then
				echo "conda Install PaddlePaddle Error: $version"
			else
				echo "progIV: step$stepIndex/$stepNum $package create $package env paddle_cuda117_env..." >& 2
				echo "$package create env paddle_cuda117_env.."
				conda create -n paddle_cuda117_env python=$py_ver -y
				conda activate paddle_cuda117_env
			fi
    	;;
    	CPU)  
			if [ $isPreVersion -eq 1 ]
			then
				echo "conda Install PaddlePaddle Error: $version"
			else
				echo "progIV: step$stepIndex/$stepNum $package create $package env paddle_env..." >& 2
				echo "$package create env paddle_env.."
				conda create -n paddle_env python=$py_ver -y
				conda activate paddle_env
			fi
    	;;
		*)  
			echo "conda Install PaddlePaddle Error: $cuda"
    	;;
		esac
	

		conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/
		conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/
		conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/r
  		conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/msys2
		conda config --set custom_channels.conda-forge https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/
		conda config --set show_channel_urls yes
		# conda config --set report_errors false
    ;;
	PyTorch)  
		case $cuda in
		12.1)  
			if [ $isPreVersion -eq 1 ]
			then
			echo "progIV: step$stepIndex/$stepNum create $package env torch_cuda121_nightly_env..." >& 2
			echo "create $package env torch_cuda121_nightly_env.."
			conda create -n torch_cuda121_nightly_env python=$py_ver -y
			conda activate torch_cuda121_nightly_env
			else
			echo "progIV: step$stepIndex/$stepNum create $package env torch_cuda121_env..." >& 2
			echo "create $package env torch_cuda121_env.."
			conda create -n torch_cuda121_env python=$py_ver -y
			conda activate torch_cuda121_env
			fi
		;;
		11.8)  
			if [ $isPreVersion -eq 1 ]
			then
			echo "progIV: step$stepIndex/$stepNum create $package env torch_cuda118_nightly_env..." >& 2
			echo "create $package env torch_cuda118_nightly_env.."
			conda create -n torch_cuda118_nightly_env python=$py_ver -y
			conda activate torch_cuda118_nightly_env
			else
			echo "progIV: step$stepIndex/$stepNum create $package env torch_cuda118_env..." >& 2
			echo "create $package env torch_cuda118_env.."
			conda create -n torch_cuda118_env python=$py_ver -y
			conda activate torch_cuda118_env
			fi
		;;
		CPU)  
			if [ $isPreVersion -eq 1 ]
			then
			echo "progIV: step$stepIndex/$stepNum create $package env torch_nightly_env..." >& 2
			echo "create $package env torch_nightly_env.."
			conda create -n torch_nightly_env python=$py_ver -y
			conda activate torch_nightly_env
			else
			echo "progIV: step$stepIndex/$stepNum create $package env torch_env..." >& 2
			echo "create $package env torch_env.."
			conda create -n torch_env python=$py_ver -y
			conda activate torch_env
			fi
		;;
		*)  
			echo "CUDA Version Error: $cuda"
		;;
		esac
		
		#添加安装源
		conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/pytorch
		conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/
		conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/
		conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/r
  		conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/msys2
		conda config --set custom_channels.pytorch https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/
		conda config --set show_channel_urls yes
		# conda config --set report_errors false
    ;;
	*)  
		:
    ;;
	esac

	#更新
	echo "progIV: step$stepIndex/$stepNum updating conda..." >& 2
	echo "updating conda..."
	local time=1
	while true
	do
		echo "progIV:$sigProgStart" >& 2
		conda install conda=23.11.0 -y && echo "Successfully update conda" && break
		if [ $time -gt 2 ]
		then
			echo "tried update conda $[time-1] times, quit now"
			break
		fi
		echo "progIV: step$stepIndex/$stepNum retry updating conda...$time" >& 2
		echo "retry updating conda...$time"
		echo "progIV:$sigProgEnd" >& 2

		time=$[time+1]
		sleep 1
	done
	echo "progIV:$sigProgEnd" >& 2
	echo "conda updated"
}

#采用pip方式安装TensorFlow
function pipInstallTensorFlow()
{
	if [ $isPreVersion -eq 1 ]
	then
		echo "no available source, skip..." #$cur_py -m $cur_pip install tf-nightly -i https://pypi.tuna.tsinghua.edu.cn/simple #>& 2
	else
		$cur_py -m $cur_pip install tensorflow -i https://pypi.tuna.tsinghua.edu.cn/simple #>& 2
	fi
}

#采用pip方式安装PyTorch
function pipInstallPyTorch()
{
	#https://mirror.sjtu.edu.cn/pytorch-wheels
	#pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple
	#1
	#$cur_py -m $cur_pip install torch torchvision torchaudio --extra-index-url https://mirror.sjtu.edu.cn/pytorch-wheels/cu121 -i https://pypi.tuna.tsinghua.edu.cn/simple

	#2
	#pip3 install torch torchvision torchaudio --extra-index-url https://download.pytorch.org/whl/cu116 -i https://pypi.tuna.tsinghua.edu.cn/simple
	#直接将 PyTorch 安装指引 中的https://download.pytorch.org/whl 替换为https://mirrors.aliyun.com/pytorch-wheels即可。
	#可以这样：$cur_pip install torch torchvision torchaudio --index-url https://mirrors.aliyun.com/pytorch-wheels/cpu
	#SJTU
	#SJTU也提供的有，可以用：https://mirror.sjtu.edu.cn/pytorch-wheels/cu118
	case $cuda in
    12.1)  
		if [ $isPreVersion -eq 1 ]
		then
		# $cur_py -m $cur_pip install --pre torch torchvision torchaudio --index-url https://download.pytorch.org/whl/nightly/cu121 #>& 2
		$cur_py -m $cur_pip install --pre torch torchvision torchaudio --index-url https://mirror.sjtu.edu.cn/pytorch-wheels/nightly/cu121
		else
		# $cur_py -m $cur_pip install torch torchvision torchaudio #>& 2
		$cur_py -m $cur_pip install torch torchvision torchaudio --index-url https://mirror.sjtu.edu.cn/pytorch-wheels/cu121
		fi
    ;;
    11.8)  
		if [ $isPreVersion -eq 1 ]
		then
		# $cur_py -m $cur_pip install --pre torch torchvision torchaudio --index-url https://download.pytorch.org/whl/nightly/cu118 #>& 2
		$cur_py -m $cur_pip install --pre torch torchvision torchaudio --index-url https://mirror.sjtu.edu.cn/pytorch-wheels/nightly/cu118
		else
		# $cur_py -m $cur_pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118 #>& 2
		$cur_py -m $cur_pip install torch torchvision torchaudio --index-url https://mirror.sjtu.edu.cn/pytorch-wheels/cu118
		fi
    ;;
    CPU)  
		if [ $isPreVersion -eq 1 ]
		then
		# $cur_py -m $cur_pip install --pre torch torchvision torchaudio --index-url https://download.pytorch.org/whl/nightly/cpu #>& 2
		$cur_py -m $cur_pip install --pre torch torchvision torchaudio --index-url https://mirror.sjtu.edu.cn/pytorch-wheels/nightly/cpu
		else
		# $cur_py -m $cur_pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cpu #>& 2
		$cur_py -m $cur_pip install torch torchvision torchaudio --index-url https://mirror.sjtu.edu.cn/pytorch-wheels/cpu
		fi
    ;;
	*)  
		echo 'CUDA Version Error'
    ;;
	esac
}

#采用pip方式安装PaddlePaddle
function pipInstallPaddlePaddle()
{
	case $cuda in
	12.0)  
		if [ $isPreVersion -eq 1 ]
		then
		$cur_py -m $cur_pip install paddlepaddle-gpu==0.0.0.post120 -f https://www.paddlepaddle.org.cn/whl/linux/gpu/develop.html #>& 2
		else
		$cur_py -m $cur_pip install paddlepaddle-gpu==2.6.1.post120 -f https://www.paddlepaddle.org.cn/whl/linux/mkl/avx/stable.html
		fi
	;;
	11.8)  
		if [ $isPreVersion -eq 1 ]
		then
		$cur_py -m $cur_pip install paddlepaddle-gpu==0.0.0.post118 -f https://www.paddlepaddle.org.cn/whl/linux/gpu/develop.html #>& 2
		else
		$cur_py -m $cur_pip install paddlepaddle-gpu==2.6.1 -i https://pypi.tuna.tsinghua.edu.cn/simple
		fi
	;;
	11.7)  
		if [ $isPreVersion -eq 1 ]	
		then
		$cur_py -m $cur_pip install paddlepaddle-gpu==0.0.0.post117 -f https://www.paddlepaddle.org.cn/whl/linux/gpu/develop.html #>& 2
		else
		$cur_py -m $cur_pip install paddlepaddle-gpu==2.6.1.post117 -f https://www.paddlepaddle.org.cn/whl/linux/mkl/avx/stable.html
		fi
	;;
	CPU)  
		if [ $isPreVersion -eq 1 ]	
		then
		$cur_py -m $cur_pip install paddlepaddle==0.0.0 -f https://www.paddlepaddle.org.cn/whl/linux/cpu-mkl/develop.html #>& 2
		else
		$cur_py -m $cur_pip install paddlepaddle==2.6.1 -i https://pypi.tuna.tsinghua.edu.cn/simple
		fi
	;;
	*)  
		echo "pipInstallPaddlePaddle Error: $cuda" 
	;;
	esac
	return $?
}

#stepIndex+1
#准备pip环境
function prePipEnv()
{
	local time=1	
	echo "progIV: step$stepIndex/$stepNum updating pip..." >& 2
	echo "updating pip..."
	# while true
	# do
	# 	echo "progIV:$sigProgStart" >& 2
	# 	##$cur_py -m $cur_pip install --upgrade pip && echo "Successfully update pip" && break
	# 	$cur_py -m $cur_pip install -i https://pypi.tuna.tsinghua.edu.cn/simple --upgrade pip && echo "Successfully update pip" && break
	# 	echo "Failed update pip" && break
	# 	if [ $time -gt 6 ]
	# 	then
	# 		echo "tried update pip $[time-1] times, quit now"
	# 		break
	# 	fi
	# 	echo "progIV: step$stepIndex/$stepNum retry updating pip...$time" >& 2
	# 	echo "retry updating pip...$time"
	# 	echo "progIV:$sigProgEnd" >& 2
	# 	time=$[time+1]
	# 	sleep 1
	# done
	echo "progIV:$sigProgEnd" >& 2
}

#根据安装方式安装TensorFlow
function installTensorFlow()
{
	case $package in
    pip)
		pipInstallTensorFlow
    ;;
    docker)  
		dockerInstallTensorFlow
    ;;
	*)
		echo "installTensorFlow Error: $package"
    ;;
	esac
}

#根据安装方式安装PyTorch
function installPyTorch()
{
	case $package in
    pip)
		pipInstallPyTorch
    ;;
    conda)  
		condaInstallPyTorch
    ;;
	*)
		echo "installPyTorch Error: $package"
    ;;
	esac
}


#根据安装方式安装PaddlePaddle
function installPaddlePaddle()
{
	case $package in
    pip)
		pipInstallPaddlePaddle
    ;;
    conda)  
		condaInstallPaddlePaddle
    ;;
    docker)  
		dockerInstallPaddlePaddle
    ;;
	*)  
		echo "installPaddlePaddle Error: $package"
    ;;
	esac
}

#根据安装选项安装AI框架
function installFrameWork()
{
	cd $home
	# 清华：https://pypi.tuna.tsinghua.edu.cn/simple 用在Paddle、TensorFlow
	# 中国科技大学 https://pypi.mirrors.ustc.edu.cn/simple/
	# 华中理工大学：http://pypi.hustunique.com/
	# 山东理工大学：http://pypi.sdutlinux.org/
	# 豆瓣：http://pypi.douban.com/simple/
	# 上交大：https://mirror.sjtu.edu.cn/ 用在PyTorch
	# 阿里云：http://mirrors.aliyun.com/pypi/simple/
	# 华中科技大学镜像源：http://pypi.hustunique.com/simple/
	# 上海交通大学镜像源：https://mirror.sjtu.edu.cn/pypi/web/simple/
	# 山东理工大学：http://pypi.sdutlinux.org/
	# 百度镜像源：https://mirror.baidu.com/pypi/simple
	# 网易：http://mirrors.163.com
	# 豆瓣：http://pypi.douban.com/simple/

	case $package in
	pip)  
		prePipEnv  #step+1
    ;;
    conda)  
		prePipEnv #step+1
		preCondaEnv #step+2
    ;;
    docker)  
		preDockerEnv
    ;;
	*)  
		:
    ;;
	esac

	local time=1
	stepIndex=$[stepIndex+1]
	
	echo "progIV: step$stepIndex/$stepNum installing $framework through $package..." >& 2
	echo "installing $framework through $package..."
	while true
	do
	echo "progIV:$sigProgStart" >& 2
	case $framework in
    PaddlePaddle)  
		installPaddlePaddle && break
    ;;
    PyTorch)  
		installPyTorch && break
    ;;
	TensorFlow)  
		installTensorFlow && break
    ;;
	*)  
		echo "installFrameWork: Framework Error: $framework"
    ;;
	esac
	if [ $time -gt 11 ]
	then
		echo "tried install $framework through $package $[time-1] times, quit now"
		echo "Failed install $framework through $package"
		exitCode=1
		break
	fi
	echo "progIV: step$stepIndex/$stepNum retry installing $framework through $package...$time" >& 2
	echo "retry installing $framework through $package...$time"
	echo "progIV:$sigProgEnd" >& 2
	
	time=$[time+1]
	sleep 1
	done
	echo "progIV:$sigProgEnd" >& 2
	if [ $exitCode -ne 1 ]
	then
		echo "Succesfully install $framework through $package"
	fi

	return $exitCode
}

#安装AI框架，本脚主入口
installFrameWork
