189928cc5SHong Zhang#!/usr/bin/env bash 289928cc5SHong Zhang 389928cc5SHong Zhang# Copyright 2017-2018 489928cc5SHong Zhang# 589928cc5SHong Zhang# Karlsruhe Institute of Technology 689928cc5SHong Zhang# Universitat Jaume I 789928cc5SHong Zhang# University of Tennessee 889928cc5SHong Zhang# 989928cc5SHong Zhang# Redistribution and use in source and binary forms, with or without 1089928cc5SHong Zhang# modification, are permitted provided that the following conditions are met: 1189928cc5SHong Zhang# 1289928cc5SHong Zhang# 1. Redistributions of source code must retain the above copyright notice, 1389928cc5SHong Zhang# this list of conditions and the following disclaimer. 1489928cc5SHong Zhang# 1589928cc5SHong Zhang# 2. Redistributions in binary form must reproduce the above copyright notice, 1689928cc5SHong Zhang# this list of conditions and the following disclaimer in the documentation 1789928cc5SHong Zhang# and/or other materials provided with the distribution. 1889928cc5SHong Zhang# 1989928cc5SHong Zhang# 3. Neither the name of the copyright holder nor the names of its contributors 2089928cc5SHong Zhang# may be used to endorse or promote products derived from this software 2189928cc5SHong Zhang# without specific prior written permission. 2289928cc5SHong Zhang# 2389928cc5SHong Zhang# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 2489928cc5SHong Zhang# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 2589928cc5SHong Zhang# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 2689928cc5SHong Zhang# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE 2789928cc5SHong Zhang# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 2889928cc5SHong Zhang# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 2989928cc5SHong Zhang# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 3089928cc5SHong Zhang# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 3189928cc5SHong Zhang# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 3289928cc5SHong Zhang# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 3389928cc5SHong Zhang# POSSIBILITY OF SUCH DAMAGE. 3489928cc5SHong Zhang 3589928cc5SHong Zhangset -e 3689928cc5SHong Zhang 3789928cc5SHong ZhangARCHIVE_LOCATION=${ARCHIVE_LOCATION:="./ssget_archive"} 3889928cc5SHong ZhangTHIS_DIR=$( cd "$( dirname "${BASH_SOURCE[0]}" )" &>/dev/null && pwd ) 3989928cc5SHong ZhangSS_URL="https://sparse.tamu.edu" 4089928cc5SHong Zhang 4189928cc5SHong Zhangmkdir -p "${ARCHIVE_LOCATION}" 4289928cc5SHong Zhang 4389928cc5SHong ZhangCOMMAND=get_database_version 4489928cc5SHong ZhangMATRIX_TYPE="MM" 4589928cc5SHong ZhangMATRIX_ID=1 4689928cc5SHong ZhangPROP_NAMES=( 4789928cc5SHong Zhang "group" 4889928cc5SHong Zhang "name" 4989928cc5SHong Zhang "rows" 5089928cc5SHong Zhang "cols" 5189928cc5SHong Zhang "nonzeros" 5289928cc5SHong Zhang "real" 5389928cc5SHong Zhang "binary" 5489928cc5SHong Zhang "2d3d" 5589928cc5SHong Zhang "posdef" 5689928cc5SHong Zhang "psym" 5789928cc5SHong Zhang "nsym" 5889928cc5SHong Zhang "kind") 5989928cc5SHong Zhang 6089928cc5SHong Zhang 6189928cc5SHong Zhangredownload_info() { 6289928cc5SHong Zhang curl -Lo "${ARCHIVE_LOCATION}/ssstats.csv" "${SS_URL}/files/ssstats.csv" 6389928cc5SHong Zhang} 6489928cc5SHong Zhang 6589928cc5SHong Zhang 6689928cc5SHong Zhangdownload_info() { 6789928cc5SHong Zhang if [ ! -f "${ARCHIVE_LOCATION}/ssstats.csv" ]; then 6889928cc5SHong Zhang redownload_info 6989928cc5SHong Zhang fi 7089928cc5SHong Zhang} 7189928cc5SHong Zhang 7289928cc5SHong Zhang 7389928cc5SHong ZhangPROPS="" 7489928cc5SHong Zhangget_properties() { 7589928cc5SHong Zhang download_info 7689928cc5SHong Zhang if [ "${PROPS}" == "" ]; then 7789928cc5SHong Zhang PROPS=$(head -$((${MATRIX_ID} + 2)) "${ARCHIVE_LOCATION}/ssstats.csv" \ 7889928cc5SHong Zhang | tail -1) 7989928cc5SHong Zhang fi 8089928cc5SHong Zhang echo "${PROPS}" 8189928cc5SHong Zhang} 8289928cc5SHong Zhang 8389928cc5SHong Zhang 8489928cc5SHong Zhangget_property() { 8589928cc5SHong Zhang IFS="," read -ra PROPS <<< "$(get_properties)" 8689928cc5SHong Zhang NPARAM=${#PROP_NAMES[@]} 8789928cc5SHong Zhang for (( i=0; i < ${NPARAM}; ++i)); do 8889928cc5SHong Zhang if [ "$1" = "${PROP_NAMES[$i]}" ]; then 8989928cc5SHong Zhang echo ${PROPS[$i]} 9089928cc5SHong Zhang return 9189928cc5SHong Zhang fi 9289928cc5SHong Zhang done 9389928cc5SHong Zhang} 9489928cc5SHong Zhang 9589928cc5SHong Zhang 9689928cc5SHong Zhangget_as_json() { 9789928cc5SHong Zhang BOOL_MAP=("false" "true") 9889928cc5SHong Zhang IFS="," read -ra PROPS <<< "$(get_properties)" 9989928cc5SHong Zhang cat << JSON 10089928cc5SHong Zhang{ 10189928cc5SHong Zhang "id": ${MATRIX_ID}, 10289928cc5SHong Zhang "group": "${PROPS[0]}", 10389928cc5SHong Zhang "name": "${PROPS[1]}", 10489928cc5SHong Zhang "rows": ${PROPS[2]}, 10589928cc5SHong Zhang "cols": ${PROPS[3]}, 10689928cc5SHong Zhang "nonzeros": ${PROPS[4]}, 10789928cc5SHong Zhang "real": ${BOOL_MAP[${PROPS[5]}]}, 10889928cc5SHong Zhang "binary": ${BOOL_MAP[${PROPS[6]}]}, 10989928cc5SHong Zhang "2d3d": ${BOOL_MAP[${PROPS[7]}]}, 11089928cc5SHong Zhang "posdef": ${BOOL_MAP[${PROPS[8]}]}, 11189928cc5SHong Zhang "psym": ${PROPS[9]}, 11289928cc5SHong Zhang "nsym": ${PROPS[10]}, 11389928cc5SHong Zhang "kind": "${PROPS[11]}" 11489928cc5SHong Zhang} 11589928cc5SHong ZhangJSON 11689928cc5SHong Zhang} 11789928cc5SHong Zhang 11889928cc5SHong Zhang 11989928cc5SHong Zhangget_path_info() { 12089928cc5SHong Zhang GROUP=$(get_property group) 12189928cc5SHong Zhang NAME=$(get_property name) 12289928cc5SHong Zhang if [ "${MATRIX_TYPE}" = "mat" ]; then 12389928cc5SHong Zhang EXT="mat" 12489928cc5SHong Zhang else 12589928cc5SHong Zhang EXT="tar.gz" 12689928cc5SHong Zhang fi 12789928cc5SHong Zhang MATRIX_URI="${MATRIX_TYPE}/${GROUP}/${NAME}" 12889928cc5SHong Zhang UPSTREAM_URL="${SS_URL}/${MATRIX_URI}.${EXT}" 12989928cc5SHong Zhang DOWNLOAD_PATH="${ARCHIVE_LOCATION}/${MATRIX_URI}.${EXT}" 13089928cc5SHong Zhang EXTRACT_PATH="${ARCHIVE_LOCATION}/${MATRIX_URI}" 13189928cc5SHong Zhang cat <<- EOT 13289928cc5SHong Zhang ${GROUP} 13389928cc5SHong Zhang ${NAME} 13489928cc5SHong Zhang ${MATRIX_URI} 13589928cc5SHong Zhang ${UPSTREAM_URL} 13689928cc5SHong Zhang ${DOWNLOAD_PATH} 13789928cc5SHong Zhang ${EXTRACT_PATH} 13889928cc5SHong ZhangEOT 13989928cc5SHong Zhang} 14089928cc5SHong Zhang 14189928cc5SHong Zhang 14289928cc5SHong Zhangdownload_archive() { 14389928cc5SHong Zhang PATH_INFO=($(get_path_info)) 14489928cc5SHong Zhang if [ ! -f ${PATH_INFO[4]} ]; then 14589928cc5SHong Zhang mkdir -p $(dirname ${PATH_INFO[4]}) 14689928cc5SHong Zhang curl -Lo ${PATH_INFO[4]} ${PATH_INFO[3]} 14789928cc5SHong Zhang fi 14889928cc5SHong Zhang echo ${PATH_INFO[4]} 14989928cc5SHong Zhang} 15089928cc5SHong Zhang 15189928cc5SHong Zhang 15289928cc5SHong Zhangextract_archive() { 15389928cc5SHong Zhang PATH_INFO=($(get_path_info)) 15489928cc5SHong Zhang download_archive >/dev/null 15589928cc5SHong Zhang if [ "${MATRIX_TYPE}" = "mat" ]; then 15689928cc5SHong Zhang echo ${PATH_INFO[4]} 15789928cc5SHong Zhang return 15889928cc5SHong Zhang fi 15989928cc5SHong Zhang mkdir -p ${PATH_INFO[5]} 16089928cc5SHong Zhang tar -xzf ${PATH_INFO[4]} -C ${PATH_INFO[5]} --strip-components=1 16189928cc5SHong Zhang if [ "${MATRIX_TYPE}" = "RB" ]; then 16289928cc5SHong Zhang EXT="rb" 16389928cc5SHong Zhang else 16489928cc5SHong Zhang EXT="mtx" 16589928cc5SHong Zhang fi 16689928cc5SHong Zhang echo "${PATH_INFO[5]}/${PATH_INFO[1]}.${EXT}" 16789928cc5SHong Zhang} 16889928cc5SHong Zhang 16989928cc5SHong Zhang 17089928cc5SHong Zhangclean_extracted() { 17189928cc5SHong Zhang PATH_INFO=($(get_path_info)) 17289928cc5SHong Zhang if [ ! -e ${PATH_INFO[5]} ]; then 17389928cc5SHong Zhang echo 0 17489928cc5SHong Zhang return 17589928cc5SHong Zhang fi 17689928cc5SHong Zhang 17789928cc5SHong Zhang SIZE=($(du -b ${PATH_INFO[5]})) 17889928cc5SHong Zhang rm -rf ${PATH_INFO[5]} 17989928cc5SHong Zhang echo ${SIZE[0]} 18089928cc5SHong Zhang} 18189928cc5SHong Zhang 18289928cc5SHong Zhang 18389928cc5SHong Zhangremove_archive() { 18489928cc5SHong Zhang PATH_INFO=($(get_path_info)) 18589928cc5SHong Zhang SIZE=($(du -b ${PATH_INFO[4]})) 18689928cc5SHong Zhang rm -rf ${PATH_INFO[4]} 18789928cc5SHong Zhang echo ${SIZE[0]} 18889928cc5SHong Zhang} 18989928cc5SHong Zhang 19089928cc5SHong Zhang 19189928cc5SHong Zhangget_collection_size() { 19289928cc5SHong Zhang download_info 19389928cc5SHong Zhang head -1 "${ARCHIVE_LOCATION}/ssstats.csv" 19489928cc5SHong Zhang} 19589928cc5SHong Zhang 19689928cc5SHong Zhang 19789928cc5SHong Zhangget_database_version() { 19889928cc5SHong Zhang download_info 19989928cc5SHong Zhang echo -n "${ARCHIVE_LOCATION}/ssstats.csv " 20089928cc5SHong Zhang echo "$(head -2 "${ARCHIVE_LOCATION}/ssstats.csv" | tail -1)" 20189928cc5SHong Zhang} 20289928cc5SHong Zhang 20389928cc5SHong Zhang 20489928cc5SHong ZhangCONDITION="" 20589928cc5SHong ZhangTEMP_PROPS="" 20689928cc5SHong Zhangreplace_placeholder() { 20789928cc5SHong Zhang BOOL_MAP=("false" "true") 20889928cc5SHong Zhang EVAL_COND=${CONDITION} 20989928cc5SHong Zhang # s/@kind/${TEMP_PROPS[11]}/g is failed because s/@kind/2D/3D Problem/g has 21089928cc5SHong Zhang # too many slashes 21189928cc5SHong Zhang REPLACE="s/@group/${TEMP_PROPS[0]}/g;" 21289928cc5SHong Zhang REPLACE="${REPLACE}s/@name/${TEMP_PROPS[1]}/g;" 21389928cc5SHong Zhang REPLACE="${REPLACE}s/@rows/${TEMP_PROPS[2]}/g;" 21489928cc5SHong Zhang REPLACE="${REPLACE}s/@cols/${TEMP_PROPS[3]}/g;" 21589928cc5SHong Zhang REPLACE="${REPLACE}s/@nonzeros/${TEMP_PROPS[4]}/g;" 21689928cc5SHong Zhang REPLACE="${REPLACE}s/@real/${BOOL_MAP[${TEMP_PROPS[5]}]}/g;" 21789928cc5SHong Zhang REPLACE="${REPLACE}s/@binary/${BOOL_MAP[${TEMP_PROPS[6]}]}/g;" 21889928cc5SHong Zhang REPLACE="${REPLACE}s/@2d3d/${BOOL_MAP[${TEMP_PROPS[7]}]}/g;" 21989928cc5SHong Zhang REPLACE="${REPLACE}s/@posdef/${BOOL_MAP[${TEMP_PROPS[8]}]}/g;" 22089928cc5SHong Zhang REPLACE="${REPLACE}s/@psym/${TEMP_PROPS[9]}/g;" 22189928cc5SHong Zhang REPLACE="${REPLACE}s/@nsym/${TEMP_PROPS[10]}/g;" 22289928cc5SHong Zhang REPLACE="${REPLACE}s~@kind~${TEMP_PROPS[11]}~g" 22389928cc5SHong Zhang EVAL_COND=$(echo $EVAL_COND | sed -e "$REPLACE") 22489928cc5SHong Zhang} 22589928cc5SHong Zhang 22689928cc5SHong Zhang 22789928cc5SHong Zhangsearch_database() { 22889928cc5SHong Zhang download_info 22989928cc5SHong Zhang INDEX=-2; 23089928cc5SHong Zhang while IFS='' read -r LINE || [[ -n "$LINE" ]]; do 23189928cc5SHong Zhang INDEX=$(( $INDEX + 1 )) 23289928cc5SHong Zhang if [[ $INDEX -gt 0 ]]; then 23389928cc5SHong Zhang IFS="," read -ra TEMP_PROPS <<< "$LINE" 23489928cc5SHong Zhang EVAL_COND="" 23589928cc5SHong Zhang replace_placeholder 23689928cc5SHong Zhang if eval $EVAL_COND ; then 23789928cc5SHong Zhang echo $INDEX 23889928cc5SHong Zhang fi 23989928cc5SHong Zhang fi 24089928cc5SHong Zhang done < "${ARCHIVE_LOCATION}/ssstats.csv" 24189928cc5SHong Zhang} 24289928cc5SHong Zhang 24389928cc5SHong Zhang 24489928cc5SHong Zhangprint_usage_and_exit() { 24589928cc5SHong Zhang cat 1>&2 << EOT 24689928cc5SHong ZhangUsage: $0 [options] 24789928cc5SHong Zhang 24889928cc5SHong ZhangAvailable options: 24989928cc5SHong Zhang -c clean files extracted from archive 25089928cc5SHong Zhang -d (re)download matrix info file 25189928cc5SHong Zhang -e download matrix and extract archive 25289928cc5SHong Zhang -f download matrix and get path to archive 25389928cc5SHong Zhang -h show this help 25489928cc5SHong Zhang -i ID matrix id 25589928cc5SHong Zhang -j print information about the matrix in JSON format 25689928cc5SHong Zhang -n get number of matrices in collection 257*aaa8cc7dSPierre Jolivet -p PROPERTY print information about the matrix, PROPERTY is the property to 25889928cc5SHong Zhang print, one of group, name, rows, cols, nonzeros, real, binary, 25989928cc5SHong Zhang 2d3d, posdef, psym, nsym, kind 26089928cc5SHong Zhang -r remove archive 26189928cc5SHong Zhang -t TYPE matrix type, TYPE is one of: MM (matrix market, '.mtx'), RB 26289928cc5SHong Zhang (Rutherford Boeing, '.rb'), mat (MATLAB, '.mat') 26389928cc5SHong Zhang -v get database version 26489928cc5SHong Zhang -s search database with conditions. It uses @PROPERTY as the 26589928cc5SHong Zhang placeholder 26689928cc5SHong Zhang 26789928cc5SHong ZhangCalling $0 without arguments is equivalent to: $0 -i 0 -t MM -v 26889928cc5SHong ZhangEOT 26989928cc5SHong Zhang exit $1 27089928cc5SHong Zhang} 27189928cc5SHong Zhang 27289928cc5SHong Zhang 27389928cc5SHong Zhangwhile getopts ":cdefhi:jnp:rt:vs:" opt; do 27489928cc5SHong Zhang case ${opt} in 27589928cc5SHong Zhang :) 27689928cc5SHong Zhang echo 1>&2 "Option -${OPTARG} provided without an argument" 27789928cc5SHong Zhang print_usage_and_exit 2 27889928cc5SHong Zhang ;; 27989928cc5SHong Zhang \?) 28089928cc5SHong Zhang echo 1>&2 "Unknown option: -${OPTARG}" 28189928cc5SHong Zhang print_usage_and_exit 1 28289928cc5SHong Zhang ;; 28389928cc5SHong Zhang c) 28489928cc5SHong Zhang COMMAND=clean_extracted 28589928cc5SHong Zhang ;; 28689928cc5SHong Zhang d) 28789928cc5SHong Zhang COMMAND=redownload_info 28889928cc5SHong Zhang ;; 28989928cc5SHong Zhang e) 29089928cc5SHong Zhang COMMAND=extract_archive 29189928cc5SHong Zhang ;; 29289928cc5SHong Zhang f) 29389928cc5SHong Zhang COMMAND=download_archive 29489928cc5SHong Zhang ;; 29589928cc5SHong Zhang h) 29689928cc5SHong Zhang print_usage_and_exit 0 29789928cc5SHong Zhang ;; 29889928cc5SHong Zhang i) 29989928cc5SHong Zhang if [[ ! "${OPTARG}" =~ ^([0-9]+)$ ]]; then 30089928cc5SHong Zhang echo 1>&2 "Matrix ID has to be a number, got: ${OPTARG}" 30189928cc5SHong Zhang print_usage_and_exit 4 30289928cc5SHong Zhang fi 30389928cc5SHong Zhang MATRIX_ID=${OPTARG} 30489928cc5SHong Zhang ;; 30589928cc5SHong Zhang j) 30689928cc5SHong Zhang COMMAND=get_as_json 30789928cc5SHong Zhang ;; 30889928cc5SHong Zhang n) 30989928cc5SHong Zhang COMMAND=get_collection_size 31089928cc5SHong Zhang ;; 31189928cc5SHong Zhang p) 31289928cc5SHong Zhang PROP_LIST="group|name|rows|cols|nonzeros" 31389928cc5SHong Zhang PROP_LIST="${PROP_LIST}|real|binary|2d3d|posdef|psym|nsym|kind" 31489928cc5SHong Zhang if [[ ! "${OPTARG}" =~ ^(${PROP_LIST})$ ]]; then 31589928cc5SHong Zhang echo 1>&2 "Unknown property: ${OPTARG}" 31689928cc5SHong Zhang print_usage_and_exit 5 31789928cc5SHong Zhang fi 31889928cc5SHong Zhang COMMAND="get_property ${OPTARG}" 31989928cc5SHong Zhang ;; 32089928cc5SHong Zhang r) 32189928cc5SHong Zhang COMMAND=remove_archive 32289928cc5SHong Zhang ;; 32389928cc5SHong Zhang t) 32489928cc5SHong Zhang if [[ ! "${OPTARG}" =~ ^(MM|RB|mat)$ ]]; then 32589928cc5SHong Zhang echo 1>&2 "Wrong matrix type: ${OPTARG}" 32689928cc5SHong Zhang print_usage_and_exit 3 32789928cc5SHong Zhang fi 32889928cc5SHong Zhang MATRIX_TYPE=${OPTARG} 32989928cc5SHong Zhang ;; 33089928cc5SHong Zhang v) 33189928cc5SHong Zhang COMMAND=get_database_version 33289928cc5SHong Zhang ;; 33389928cc5SHong Zhang s) 33489928cc5SHong Zhang COMMAND=search_database 33589928cc5SHong Zhang CONDITION=${OPTARG} 33689928cc5SHong Zhang ;; 33789928cc5SHong Zhang esac 33889928cc5SHong Zhangdone 33989928cc5SHong Zhang 34089928cc5SHong Zhang 34189928cc5SHong Zhang${COMMAND} 342