-
Because why not. Since we now have postfix trees, the void in naive algorithm shall be filled. Tests included (updated)
Because why not. Since we now have postfix trees, the void in naive algorithm shall be filled. Tests included (updated)
Code owners
Assign users and groups as approvers for specific file changes. Learn more.
tests.repeats.sh 7.54 KiB
#!/usr/bin/env bash
# $1 test dir suffix (debug / release)
source bash_multithread.sh
# ALGORITHM SETTINGS
TESTCASE_ITERATIONS=30
TESTCASE_TIMEOUT=10
LOGFILE="log_tests.txt"
# RANDOM TREE SETTINGS (./arand2 parameters)
# BEWARE, NOT ALL VALUES MAY WORK TOGETHER
NODES=100
HEIGHT=15
ALPHABET_SIZE=10
EXECUTABLES="aarbology2 acast2 atniceprint arand2 "
TESTS_DIR="`pwd`/examples2/tree"
RES_GOOD=
RES_FAIL=
RES_TIME=
RES_SEGV=
RES_UNKN=
# ----------------------------
for FILE in $EXECUTABLES; do
if [ ! -f bin-$1/$FILE ]; then
echo "Executable $FILE is required for testing. Make sure it is in bin-$1 folder."
exit 1
fi
done
cd bin-$1/
rm -f $LOGFILE
JOBS=$2
if [ -z "$JOBS" ]; then
JOBS=1
fi
# ----------------------------
# $1 = file path
# $2 = return code
# $3 = diff out
# $4 = RankedTree xml
# $5 = Naive output
# $6 = Advanced output
function log {
echo "==========================================================" >> $LOGFILE
echo "file: " $1 >> $LOGFILE
echo "ret: " $2 >> $LOGFILE
echo "problematic tree:" >> $LOGFILE
cat $4 >> $LOGFILE
ONE=$(mktemp)
TWO=$(mktemp)
echo "Naive : " >> $ONE
echo "Yours : " >> $TWO
cat $5 | ./atniceprint >> $ONE
cat $6 | ./atniceprint >> $TWO
paste $ONE $TWO | pr -t -e$(awk 'n<length {n=length} END {print n+1}' $ONE) >> $LOGFILE
rm $ONE $TWO
}
# $1 = file path
# $2 = return code
# $3 = diff out
# $4 = RankedTree
# $5 = RankedTree -> Postfix -> RankedTree
function log2 {
echo "==========================================================" >> $LOGFILE
echo "file: " $1 >> $LOGFILE
echo "ret: " $2 >> $LOGFILE
ONE=$(mktemp)
TWO=$(mktemp)
echo "Simple : " >> $ONE
echo "After conversions : " >> $TWO
cat $4 >> $ONE
cat $5 >> $TWO
paste $ONE $TWO | pr -t -e$(awk 'n<length {n=length} END {print n+1}' $ONE) >> $LOGFILE
rm $ONE $TWO
}
# $1 = TREE_FILE
function runPostfix2RankedAlgorithmTest {
#compares RankedTree to RankedTree -> PostfixRankedTree -> RankedTree
RANKED2POSTFIX2RANKED=$(mktemp)
RANKED=$(mktemp)
./acast2 -t RankedTree -i $1 | ./atniceprint > $RANKED
./acast2 -t RankedTree -i $1 | ./acast2 -t PostfixRankedTree | ./acast2 -t RankedTree | ./atniceprint > $RANKED2POSTFIX2RANKED
OUT=`timeout $TESTCASE_TIMEOUT bash -c "diff $RANKED $RANKED2POSTFIX2RANKED"`
RET=$?
if [ $RET != 0 ]; then # fail
log2 "$1" $RET "$OUT" "$RANKED" "$RANKED2POSTFIX2RANKED"
fi
rm $1 $RANKED2POSTFIX2RANKED $RANKED
if [ $RET == 124 ]; then # timeout
registerResult 2
return 2
elif [ $RET -ge 124 ]; then #segv
registerResult 3
return 3
elif [ $RET != 0 ]; then # fail
registerResult 1
return 1
else
registerResult 0
return 0
fi
}
function runNaivePostfixRepeatsTest {
NAIVE_OUTPUT=$(mktemp)
ADVANCED_OUTPUT=$(mktemp)
./aarbology2 -s $1 -a exactSubtreeRepeatsNaive | ./aarbology2 -a normalizeTreeLabels > $NAIVE_OUTPUT
./acast2 -t PostfixRankedTree -i $1 | ./aarbology2 -a exactSubtreeRepeatsNaive | ./acast2 -t RankedTree | ./aarbology2 -a normalizeTreeLabels > $ADVANCED_OUTPUT
OUT=`timeout $TESTCASE_TIMEOUT bash -c "diff $NAIVE_OUTPUT $ADVANCED_OUTPUT"`
RET=$?
if [ $RET != 0 ]; then # fail
log "$1" $RET "$OUT" "$1" "$NAIVE_OUTPUT" "$ADVANCED_OUTPUT"
fi
rm $1 $NAIVE_OUTPUT $ADVANCED_OUTPUT
if [ $RET == 124 ]; then # timeout
registerResult 2
return 2
elif [ $RET -ge 124 ]; then #segv
registerResult 3
return 3
elif [ $RET != 0 ]; then # fail
registerResult 1
return 1
else
registerResult 0
return 0
fi
}
# $1 = TREE_FILE
function runRepeatsAlgorithmTest {
NAIVE_OUTPUT=$(mktemp)
ADVANCED_OUTPUT=$(mktemp)
./aarbology2 -s $1 -a exactSubtreeRepeatsNaive | ./aarbology2 -a normalizeTreeLabels > $NAIVE_OUTPUT
./acast2 -t PostfixRankedTree -i $1 | ./aarbology2 -a exactSubtreeRepeats | ./acast2 -t RankedTree | ./aarbology2 -a normalizeTreeLabels > $ADVANCED_OUTPUT
OUT=`timeout $TESTCASE_TIMEOUT bash -c "diff $NAIVE_OUTPUT $ADVANCED_OUTPUT"`
RET=$?
if [ $RET != 0 ]; then # fail
log "$1" $RET "$OUT" "$1" "$NAIVE_OUTPUT" "$ADVANCED_OUTPUT"
fi
rm $1 $NAIVE_OUTPUT $ADVANCED_OUTPUT
if [ $RET == 124 ]; then # timeout
registerResult 2
return 2
elif [ $RET -ge 124 ]; then #segv
registerResult 3
return 3
elif [ $RET != 0 ]; then # fail
registerResult 1
return 1
else
registerResult 0
return 0
fi
}
function registerResult {
case $1 in
0)
echo -n "."
echo -n "+1" >> $RES_GOOD
;;
1)
echo -n "x"
echo -n "+1" >> $RES_FAIL
;;
2)
echo -n "T"
echo -n "+1" >> $RES_TIME
;;
3)
echo -n "E"
echo -n "+1" >> $RES_SEGV
;;
*)
echo -n "?"
echo -n "+1" >> $RES_UNKN
;;
esac
}
function initResults {
RES_GOOD=$(mktemp)
echo -n "0" > $RES_GOOD
RES_FAIL=$(mktemp)
echo -n "0" > $RES_FAIL
RES_TIME=$(mktemp)
echo -n "0" > $RES_TIME
RES_SEGV=$(mktemp)
echo -n "0" > $RES_SEGV
RES_UNKN=$(mktemp)
echo -n "0" > $RES_UNKN
}
function clearResults {
rm $RES_GOOD
rm $RES_FAIL
rm $RES_TIME
rm $RES_SEGV
rm $RES_UNKN
}
function outputResults {
echo "" >> $RES_GOOD
echo "" >> $RES_FAIL
echo "" >> $RES_TIME
echo "" >> $RES_SEGV
echo "" >> $RES_UNKN
# summary
echo -ne "\n\t"
echo "RES: GOOD:" $(bc < $RES_GOOD) ", FAIL:" $(bc < $RES_FAIL) ", TIME:" $(bc < $RES_TIME) ", SEGV:" $(bc < $RES_SEGV), "UNKN:" $(bc < $RES_UNKN)
echo ""
}
function subtreeRepeatsTest {
initResults
echo "subtreeRepeatsTest"
echo "Testing on predefined trees"
echo -ne "\t"
for TREE_FILE in `ls $TESTS_DIR/repeats.test*.xml`; do
# echo "Testing tree $(basename $TREE_FILE) "
TREE_COPY=$(mktemp)
cat $TREE_FILE > $TREE_COPY
bgxlimit ${JOBS} runRepeatsAlgorithmTest "$TREE_COPY"
done
wait
outputResults
clearResults
initResults
echo "Testing on randomly generated trees"
echo -ne "\t"
for i in $(seq 1 $TESTCASE_ITERATIONS); do
# echo "Testing tree $(basename $TREE_FILE) "
TREE_FILE=$(mktemp)
./arand2 -t RT --nodes $NODES --terminals $(( $RANDOM % $ALPHABET_SIZE + 1 )) --height $HEIGHT > $TREE_FILE
bgxlimit ${JOBS} runRepeatsAlgorithmTest "$TREE_FILE"
done
wait
outputResults
clearResults
}
function postfixToRankedTest {
initResults
echo "PostfixToRankedTest"
echo "Testing on predefined trees"
echo -ne "\t"
for TREE_FILE in `ls $TESTS_DIR/repeats.test*.xml`; do
# echo "Testing tree $(basename $TREE_FILE) "
TREE_COPY=$(mktemp)
cat $TREE_FILE > $TREE_COPY
bgxlimit ${JOBS} runPostfix2RankedAlgorithmTest "$TREE_COPY"
done
wait
outputResults
clearResults
initResults
echo "Testing on randomly generated trees"
echo -ne "\t"
for i in $(seq 1 $TESTCASE_ITERATIONS); do
# echo "Testing tree $(basename $TREE_FILE) "
TREE_FILE=$(mktemp)
./arand2 -t RT --nodes $NODES --terminals $(( $RANDOM % $ALPHABET_SIZE + 1 )) --height $HEIGHT > $TREE_FILE
bgxlimit ${JOBS} runPostfix2RankedAlgorithmTest "$TREE_FILE"
done
wait
outputResults
clearResults
}
function naivePostfixRepeatsTest {
initResults
echo "NaivePostfixRepeatsTest"
echo "Testing on predefined trees"
echo -ne "\t"
for TREE_FILE in `ls $TESTS_DIR/repeats.test*.xml`; do
# echo "Testing tree $(basename $TREE_FILE) "
TREE_COPY=$(mktemp)
cat $TREE_FILE > $TREE_COPY
bgxlimit ${JOBS} runNaivePostfixRepeatsTest "$TREE_COPY"
done
wait
outputResults
clearResults
initResults
echo "Testing on randomly generated trees"
echo -ne "\t"
for i in $(seq 1 $TESTCASE_ITERATIONS); do
# echo "Testing tree $(basename $TREE_FILE) "
TREE_FILE=$(mktemp)
./arand2 -t RT --nodes $NODES --terminals $(( $RANDOM % $ALPHABET_SIZE + 1 )) --height $HEIGHT > $TREE_FILE
bgxlimit ${JOBS} runNaivePostfixRepeatsTest "$TREE_FILE"
done
wait
outputResults
clearResults
}
subtreeRepeatsTest
postfixToRankedTest
naivePostfixRepeatsTest