xref: /petsc/src/benchmarks/ssget (revision 80f6d96d0ce89eaa1a15cf9ca02d8013bede711a)
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