#!/usr/bin/env bash

TIME_LIMIT=300 # time (in seconds) on a test after which the solver is killed
TIME_LIMIT_MS=$(($TIME_LIMIT * 1000))

# number of same test-size to generate
NUM_ITERATION=15
RESULTS_FOLDER="benchmark_results"

function main {
  # Clean and compile the planner
  cd ..
  sed -i 's/GOOGLE_STRIP_LOG 0/GOOGLE_STRIP_LOG 1/' ./src/utils.hpp
  make clean > /dev/null
  make > /dev/null
  sed -i 's/GOOGLE_STRIP_LOG 1/GOOGLE_STRIP_LOG 0/' ./src/utils.hpp
  cd - > /dev/null

  for (( i = 0; i < $NUM_ITERATION; i++ )); do
    generate_domains $1
    run_tests_and_save_results $1 $i
  done

  aggregate_results $1
  generate_plots $1
}

function generate_domains {
  echo "generate_domains: $1"
  if [[ $1 == "wetfloor" ]]; then
    cd generate_wetfloor
    ./make_tests
  elif [[ $1 == *"chained"* ]]; then
    cd generate_chains
    ./make_tests $1
  elif [[ $1 == *"var"* ]]; then
    cd generate_layered
    ./make_tests $1
  else
    cd generate_domains
    make clean > /dev/null
    make > /dev/null
    ./make_tests.pl $1
  fi
  cd ..
}

# First param is type of tests, Second param is iteration number
function run_tests_and_save_results {
  echo "run_tests_and_save_results: $1 $2"

  SOLVER=("VI" "LRTDP" "ILAOstar" "TVI" "eTVI" "eiTVI")
  if [[ $1 == *"chained"* ]]; then
    TEST_FOLDER="chained/$1"
    SOLVER=("VI" "LRTDP" "ILAOstar" "TVI" "pcTVI")
  elif [[ $1 == *"var"* ]]; then
    TEST_FOLDER="layered/$1"
  else
    TEST_FOLDER="$1"
  fi

  DOMAINS=( $(/bin/ls -1v domains/$TEST_FOLDER/*.mdp) ) # -1v for natural ordering
  OUTPUT_FILE="$RESULTS_FOLDER/$1-$2.bench"

  # Print headers
  # echo -n -e "Domain" > $OUTPUT_FILE
  # for s in ${SOLVER[*]}; do
  #   echo -n -e "\t$s" >> $OUTPUT_FILE
  # done
  # echo "" >> $OUTPUT_FILE
  echo -e "Domain\tVI_b\tVI_t\tLRTDP_b\tLRTDP_t\tILAO_b\tILAO_t\tTVI_t1\tTVI_t2\tTVI_t3\t#SCC\tSCC_max\tTVI_b\tTVI_t\teTVI_t1\teTVI_t2\teTVI_t3\t#SCC\tSCC_max\teTVI_b\teTVI_t\teiTVI_t1\teiTVI_t2\teiTVI_t3\t#SCC\tSCC_max\teiTVI_b\teiTVI_t" > $OUTPUT_FILE

  # Run solvers
  declare -A stopdict=()
  for d in ${DOMAINS[*]}; do
    echo "Benchmarking domain $d"

    # Get start state (values from Anuj Jain)
    if [[ $d == *"sap"* ]]; then
      START=100
    elif [[ $d == *"dap"* ]]; then  # dap20 (160000) = 80000
      START=5000                    # used 5000 to support dap10
    elif [[ $d == *"tap"* ]]; then  # arbitrary value
      START=1000
    elif [[ $d == *"mcar"* ]]; then # mcar100, 300, 500
      START=1750
    else # IPPC problems, layered MDP, chained MDP, etc.
      START=0
    fi

    echo -n -e "$(basename -s .mdp $d)" >> $OUTPUT_FILE
    for s in ${SOLVER[*]}; do
      echo -e "\tUsing solver $s"
      echo -n -e "\t" >> $OUTPUT_FILE

      if [[ ${stopdict[$s]} == true ]]; then
        solver_status=124
      else
        timeout $TIME_LIMIT \
          ../solver -inputFile="$d" -solver="$s" -start="$START" \
                    -heuristic="H_MIN" -benchmark >> $OUTPUT_FILE
        solver_status=$?
      fi

      if [[ $solver_status -eq 124 ]]; then # There was a timeout
        # stopdict[$s]=true
        if [[ $s == *"TVI"* ]]; then
          echo -n -e "-\t-\t-\t-\t-\t-\t-" >> $OUTPUT_FILE
        else
          echo -n -e "-\t-" >> $OUTPUT_FILE
        fi
      fi
    done
    echo "" >> $OUTPUT_FILE
  done
}

function aggregate_results {
  echo "aggregate_results: $1"

  cd $RESULTS_FOLDER
  FILES=( $(/bin/ls -1v $1-*.bench) ) # -1v for natural ordering
  # ./median_files "${FILES[@]}" > $1.median
  ./mean-pm-conf_files "${FILES[@]}" > $1.mean
  ./separate_tables $1.mean
  sed -i 's/\_t//g' *.graph.csv
  sed -i 's/ILAO/ILAO\*/g' *.graph.csv
  mv *.csv ../generate_plot/
  cd ..
}

function generate_plots {
  echo "generate_plots: $1"

  cd generate_plot
  ./plot_$1
  cd ..
}

main "$@"
