#!/bin/bash


# DEFAULT VALUES
TESTS=()
MIN_TIME=0.0
MIN_ITER=0
BATCH_MODE=0
GRAPH_LINE=0
GRAPH_ZERO=0
VARIABLES=


# DEFINES
TEST_NAMES=(
  LEVELS_VEC3_RELAXED            LEVELS_VEC4_RELAXED           LEVELS_VEC3_FULL              LEVELS_VEC4_FULL       BLUR_RADIUS_25              # 00-04
  INTRINSIC_BLUR_RADIUS_25       GREYSCALE                     GRAIN                         FISHEYE_FULL           FISHEYE_RELAXED             # 05-09
  FISHEYE_APPROXIMATE_FULL       FISHEYE_APPROXIMATE_RELAXED   VIGNETTE_FULL                 VIGNETTE_RELAXED       VIGNETTE_APPROXIMATE_FULL   # 10-14
  VIGNETTE_APPROXIMATE_RELAXED   GROUP_TEST_EMULATED           GROUP_TEST_NATIVE             CONVOLVE_3X3           INTRINSICS_CONVOLVE_3X3     # 15-19
  COLOR_MATRIX                   INTRINSICS_COLOR_MATRIX       INTRINSICS_COLOR_MATRIX_GREY  COPY                   CROSS_PROCESS_USING_LUT     # 20-24
  CONVOLVE_5X5                   INTRINSICS_CONVOLVE_5X5       MANDELBROT_FLOAT              INTRINSICS_BLEND       INTRINSICS_BLUR_25G         # 25-29
  VIBRANCE                       BW_FILTER                     SHADOWS                       CONTRAST               EXPOSURE                    # 30-34
  WHITE_BALANCE                  COLOR_CUBE                    COLOR_CUBE_3D_INTRINSIC       ARTISTIC1              RESIZE_BI_SCRIPT            # 35-39
  RESIZE_BI_INTRINSIC            POSTERIZE_INVOKE              POSTERIZE_SET                 HISTOGRAM_INTRINSIC    HISTOGRAM_SCRIPT            # 40-44
  MANDELBROT_DOUBLE              BLUR_RADIUS_25_HALF                                                                                            # 45-46
)

FUNCTION_NAMES=(
  testLevelsVec3Relaxed          testLevelsVec4Relaxed         testLevelsVec3Full            testLevelsVec4Full     testBlurRadius25            # 00-04
  testIntrinsicBlurRadius25      testGreyscale                 testGrain                     testFisheyeFull        testFishEyeRelaxed          # 05-09
  testFisheyeApproximateFull     testFisheyeApproximateRelaxed testVignetteFull              testVignetteRelaxed    testVignetteApproximateFull # 10-14
  testVignetteApproximateRelaxed testGroupTestEmulated         testGroupTestNative           testConvolve3x3        testIntrinsicsConvolve3x3   # 15-19
  testColorMatrix                testIntrinsicsColorMatrix     testIntrinsicsColorMatrixGrey testCopy               testCrossProcessUsingLUT    # 20-24
  testConvolve5x5                testIntrinsicsConvolve5x5     testMandelbrot                testIntrinsicsBlend    testIntrinsicsBlur25G       # 25-29
  testVibrance                   testBWFilter                  testShadows                   testContrast           testExposure                # 30-34
  testWhiteBalance               testColorCube                 testColorCube3DIntrinsic      testArtistic1          testResizeBiCubicScript     # 35-39
  testResizeBiCubicIntrinsic     testPosterizeInvoke           testPosterizeSet              testHistogramIntrinsic testHistogramScript         # 40-44
  testMandelbrotfp64             testBlurRadius25Half                                                                                           # 45-46
)

RUNNER="com.android.rs.imagejb/androidx.test.runner.AndroidJUnitRunner"
TEST_ROOT="com.android.rs.imagejb.ImageProcessingTest"


# Helper functions
show_help() {
  echo "
    Usage: ${0##*/} [OPTIONS]...
    Do stuff with FILE and write the result to standard output. With no FILE
    or when FILE is -, read standard input.

    -h, -?, --?, --help      display this help message
    -t, --time K             set the minimum time (in seconds) each test should run
    -i, --iteration[s] K     set the minimum number of iterations each test should run
    -c, --case[s] T1 [T2]... specify the number corresponding to each test to be run;
                             the test IDs are below
    -b, --batch              run all tests together for speed
    -f, --bestfit            add best fit line to graph
    -z, --zero               set graph's minimum yrange to 0
  "
  echo "Available test cases:"
  for i in `seq 0 $((${#TEST_NAMES[@]} - 1))`; do
    echo "  $i: ${TEST_NAMES[$i]}"
  done
  echo
}
fileexists() {
  [ `adb shell "[ -f $1 ] && echo found"` ]
}


# display help if blank argument list
if [ $# -eq 0 ]; then
  show_help
  exit
fi

# command line parsing
using_cases=0
while [ $# -gt 0 ]; do
  case $1 in
    -h|-\?|--\?|--help)
      show_help
      exit
      ;;
    -t|--time)
      using_cases=0
      if [ -n "$2" ]; then
        MIN_TIME=$2
        shift
        shift
      else
        echo 'ERROR: "--time" requires a non-empty option argument.'
        exit 1
      fi
      ;;
    -i|--iter|--iters|--iteration|--iterations)
      using_cases=0
      if [ -n "$2" ]; then
        MIN_ITER=$2
        shift
        shift
      else
        echo 'ERROR: "--iteration" requires a non-empty option argument.'
        exit 1
      fi
      ;;
    -c|--case|--cases)
      if [ -n "$2" ]; then
        using_cases=1
        shift
      else
        echo 'ERROR: "--case" requires a non-empty option argument.'
        exit 1
      fi
      ;;
    -b|--batch)
      using_cases=0
      BATCH_MODE=1
      shift
      ;;
    -f|--bestfit)
      using_cases=0
      GRAPH_LINE=1
      shift
      ;;
    -z|--zero)
      using_cases=0
      GRAPH_ZERO=1
      shift
      ;;
    all)
      if [ $using_cases -eq 1 ]; then
        using_cases=0
        TESTS=(`seq 0 $((${#TEST_NAMES[@]} - 1))`)
        shift
      else
        echo "ERROR: Invalid option: $1"
      fi
      ;;
    [0-9]*)
      if [ $using_cases -eq 1 ]; then
        TESTS+=($1)
        shift
      else
        echo "ERROR: Invalid option: $1"
        exit 1
      fi
      ;;
    *)
      echo "ERROR: Invalid option: $1"
      exit 1
      ;;
  esac
done

# error checking
if [ ${#TESTS[@]} -eq 0 ]; then
  echo "ERROR: need at least one --case"
  exit 1
fi

# configure launch variables
if [[ ( $MIN_TIME == "0.0" ) && ( $MIN_ITER -eq 0 ) ]]; then
  MIN_TIME=1.0
  MIN_ITER=2
fi
VARIABLES="$VARIABLES -e minimum_test_runtime $MIN_TIME -e minimum_test_iterations $MIN_ITER"
TESTS=( `printf "%s\n" "${TESTS[@]}" | sort -n | uniq` )

# print prep
echo
[ $BATCH_MODE -eq 0 ] && echo "Running tests:" || echo "Running tests (in batch mode):"
for i in ${TESTS[@]}; do
  echo $i: ${TEST_NAMES[$i]}
done
echo "with minimum runtime per test of $MIN_TIME seconds and
minimum number of $MIN_ITER iterations per test"
echo

# setup
echo
if [[ "`adb shell id | tr -d '\r' | awk -F'[()]' '{print $2}'`" != "root" ]]; then
  adb root
  adb wait-for-device
fi

# grant permission
adb shell pm grant com.android.rs.imagejb android.permission.READ_EXTERNAL_STORAGE
adb shell pm grant com.android.rs.imagejb android.permission.WRITE_EXTERNAL_STORAGE

# Run each test individually...
if [[ $BATCH_MODE -eq 0 ]]; then

  # run and plot each test result separately
  for num in `seq 0 $((${#TESTS[@]} - 1))`; do

    # alias
    testId=${TESTS[$num]}

    # report progress
    printf "Running ${TEST_NAMES[$testId]} ($(($num + 1))/${#TESTS[@]})"

    # run individual test
    adb shell "am instrument -w $VARIABLES -e class $TEST_ROOT#${FUNCTION_NAMES[$testId]} $RUNNER" > /dev/null

    # extract relevant data if present, write to temporary file
    if fileexists /sdcard/rsTimes/${TEST_NAMES[$testId]}_DATA.txt; then
      adb shell cat /sdcard/rsTimes/${TEST_NAMES[$testId]}_DATA.txt > timing.tmp
    else
      printf "\r                                                                       \r"
      echo "File ${TEST_NAMES[$testId]} not saved. Is ImageProcessing_jb able to run on this device?"
      continue
    fi

    # calculate avg and stdcoef
    AVG=`cat timing.tmp | awk '{sum+=$2}END{printf "%.2f",sum/NR}'`
    STDCOEF=`cat timing.tmp | awk '{sum+=$2;sos+=$2*$2}END{printf "%.2f",sqrt((sos-sum*sum/NR)/NR)/(sum/NR)*100}'`

    # create plot file
    echo "# temporary file" > plot.tmp
    echo "set style line 1 lc rgb '#0060ad' lt 1 lw 2 pt 7 ps 1" >> plot.tmp  # --- blue
    echo "set style line 2 lc rgb '#ff0000' lt 1 lw 2" >> plot.tmp  # --- green
    echo "set title \"${TEST_NAMES[$testId]} \(avg=$AVG ms, stdcoef=$STDCOEF%\)\"" >> plot.tmp
    echo "set xlabel \"Iteration #\"" >> plot.tmp
    echo "set ylabel \"Elapsed Time (ms)\"" >> plot.tmp
    if [ $GRAPH_ZERO -eq 1 ]; then
      echo "set yrange [0.0:*]" >> plot.tmp
    fi
    if [ $GRAPH_LINE -eq 1 ]; then
      echo "set fit quiet" >> plot.tmp
      echo "set fit logfile '/dev/null'" >> plot.tmp
      echo "f(x) = a*x + b" >> plot.tmp
      echo "fit f(x) 'timing.tmp' using 1:2 via a, b" >> plot.tmp
      echo "string = sprintf('%.3fe-3*x+%.3f', a*1000, b)" >> plot.tmp
      echo "plot 'timing.tmp' with linespoints ls 1 title 'Data', f(x) ls 2 title string" >> plot.tmp
    else
      echo "plot 'timing.tmp' with linespoints ls 1 title 'Data'" >> plot.tmp
    fi

    # plot data as simple line graph
    gnuplot -p plot.tmp

    # clear line
    printf "\r                                                                       \r"

  done

# ...or all at once
else

  # concatenate all tests together to run in batch
  TESTS_TEXT="-e class $TEST_ROOT#${FUNCTION_NAMES[${TESTS[0]}]}"
  for num in `seq 1 $((${#TESTS[@]} - 1))`; do
    TESTS_TEXT=$TESTS_TEXT,"$TEST_ROOT#${FUNCTION_NAMES[${TESTS[$num]}]}"
  done

  # run command
  adb shell "am instrument -w $VARIABLES $TESTS_TEXT $RUNNER"

  # run and plot each test result separately
  for num in `seq 0 $((${#TESTS[@]} - 1))`; do

    # alias
    testId=${TESTS[$num]}

    # extract relevant data if present, write to temporary file
    if fileexists /sdcard/rsTimes/${TEST_NAMES[$testId]}_DATA.txt; then
      adb shell cat /sdcard/rsTimes/${TEST_NAMES[$testId]}_DATA.txt > timing.tmp
    else
      echo "File ${TEST_NAMES[$testId]} not saved. Is ImageProcessing_jb able to run on this device?"
      continue
    fi

    # calculate avg and stdcoef
    AVG=`cat timing.tmp | awk '{sum+=$2}END{printf "%.2f",sum/NR}'`
    STDCOEF=`cat timing.tmp | awk '{sum+=$2;sos+=$2*$2}END{printf "%.2f",sqrt((sos-sum*sum/NR)/NR)/(sum/NR)*100}'`

    # create plot file
    echo "# temporary file" > plot.tmp
    echo "set style line 1 lc rgb '#0060ad' lt 1 lw 2 pt 7 ps 1" >> plot.tmp  # --- blue
    echo "set style line 2 lc rgb '#ff0000' lt 1 lw 2" >> plot.tmp  # --- green
    echo "set title \"${TEST_NAMES[$testId]} \(avg=$AVG ms, stdcoef=$STDCOEF%\)\"" >> plot.tmp
    echo "set xlabel \"Iteration #\"" >> plot.tmp
    echo "set ylabel \"Elapsed Time (ms)\"" >> plot.tmp
    if [ $GRAPH_ZERO -eq 1 ]; then
      echo "set yrange [0.0:*]" >> plot.tmp
    fi
    if [ $GRAPH_LINE -eq 1 ]; then
      echo "set fit quiet" >> plot.tmp
      echo "set fit logfile '/dev/null'" >> plot.tmp
      echo "f(x) = a*x + b" >> plot.tmp
      echo "fit f(x) 'timing.tmp' using 1:2 via a, b" >> plot.tmp
      echo "string = sprintf('%.3fe-3*x+%.3f', a*1000, b)" >> plot.tmp
      echo "plot 'timing.tmp' with linespoints ls 1 title 'Data', f(x) ls 2 title string" >> plot.tmp
    else
      echo "plot 'timing.tmp' with linespoints ls 1 title 'Data'" >> plot.tmp
    fi

    # plot data as simple line graph
    gnuplot -p plot.tmp

  done

fi # single or batch mode

# cleanup
rm -f plot.tmp
rm -f timing.tmp


