#!/bin/bash
###############################################################################
# This hook is to tune the ACOTSP software.
#
# PARAMETERS:
# $1 is the instance name  
# $2 is the candidate number
# The rest ($* after `shift 2') are parameters to run ACOTSP
#
# RETURN VALUE:
# This hook should print a single numerical value (the value to be minimized)
###############################################################################

# Path to the ACOTSP software:
EXE=~/bin/acotsp

# What "fixed" parameters should be always passed to ACOTSP?
# The time to be used is always 5 seconds, and we want only one run:
FIXED_PARAMS=" --time 20 --tries 1 "

# The instance name and the candidate id are the first parameters
INSTANCE=$1
CANDIDATE=$2

# All other parameters are the candidate parameters to be passed to ACOTSP
shift 2 || exit 1
CAND_PARAMS=$*

STDOUT="c${CANDIDATE}.stdout"
STDERR="c${CANDIDATE}.stderr"

# Now we can call ACOTSP by building a command line with all parameters for it
$EXE ${FIXED_PARAMS} -i $INSTANCE ${CAND_PARAMS} 1> $STDOUT 2> $STDERR

# In case of error, we print the current time:
error() {
    echo "`TZ=UTC date`: error: $@" >&2
    exit 1
}

# The output of the candidate $CANDIDATE should be written in the file 
# c${CANDIDATE}.stdout (see hook run for ACOTSP). Does this file exist?
if [ ! -s "${STDOUT}" ]; then
    # In this case, the file does not exist. Let's exit with a value 
    # different from 0. In this case irace will stop with an error.
    error "${STDOUT}: No such file or directory"
fi

# Ok, the file exist. It contains the whole output written by ACOTSP.
# This script should return a single numerical value, the best objective 
# value found by this run of ACOTSP. The following line is to extract
# this value from the file containing ACOTSP output.
COST=$(cat ${STDOUT} | grep -o -E 'Best [-+0-9.e]+' | cut -d ' ' -f2)
if ! [[ "$COST" =~ ^[-+0-9.e]+$ ]] ; then
    error "${STDOUT}: Output is not a number"
fi

# Print it!
echo "$COST"

# We are done with our duty. Clean files and exit with 0 (no error).
rm -f "${STDOUT}" "${STDERR}"
rm -f best.* stat.* cmp.*
exit 0
