I have 2 alternatives of writing my rules,
here is a cutout (see below for all the rules *):
A) With predicates
query "matchRepeater"
Match($homeTeam : homeTeam, $awayTeam : awayTeam, $day1 : day);
Match(homeTeam == $awayTeam, awayTeam == $homeTeam,
$day2 : day -> ($day2.getIndex() == $day1.getIndex() + 1));
end
B) With separate facts
query "matchRepeater"
$day1 : Day($index1 : index);
$day2 : Day($index2 : index -> ($index2 == $index1 + 1));
Match($homeTeam : homeTeam, $awayTeam : awayTeam, day == $day1);
Match(homeTeam == $awayTeam, awayTeam == $homeTeam, day == $day2);
end
Now, I was expecting B to be faster, because A uses predicates which
aren't indexed. Or I was expecting them to be equally fast.
However, using the trunk version of today I 've recorded this benchmark:
nl10, 100 iterations:
A = 3m 02s
B = 3m 45s
Using a trunk version of a few weeks ago I had this:
nl6, 1500 iterations:
A = 10m 10s
B = 11m 33s
In both cases, A is faster the B, which surprises me.
What could be causing this?
Performance and scalability is the only issue when trying to break the
traveling tournament problem records, so understanding how to write
faster rules is important to me :)
--
With kind regards,
Geoffrey De Smet
* All the rules:
A)
query "fourConsecutiveHomeMatches"
Match($homeTeam : homeTeam, $day1 : day);
Match(homeTeam == $homeTeam, $day2 : day -> ($day2.getIndex() ==
$day1.getIndex() + 1));
Match(homeTeam == $homeTeam, $day3 : day -> ($day3.getIndex() ==
$day1.getIndex() + 2));
Match(homeTeam == $homeTeam, $day4 : day -> ($day4.getIndex() ==
$day1.getIndex() + 3));
end
query "fourConsecutiveAwayMatches"
Match($awayTeam : awayTeam, $day1 : day);
Match(awayTeam == $awayTeam, $day2 : day -> ($day2.getIndex() ==
$day1.getIndex() + 1));
Match(awayTeam == $awayTeam, $day3 : day -> ($day3.getIndex() ==
$day1.getIndex() + 2));
Match(awayTeam == $awayTeam, $day4 : day -> ($day4.getIndex() ==
$day1.getIndex() + 3));
end
query "matchRepeater"
Match($homeTeam : homeTeam, $awayTeam : awayTeam, $day1 : day);
Match(homeTeam == $awayTeam, awayTeam == $homeTeam, $day2 : day ->
($day2.getIndex() == $day1.getIndex() + 1));
end
B)
query "fourConsecutiveHomeMatches"
$day1 : Day($index1 : index);
$day2 : Day($index2 : index -> ($index2 == $index1 + 1));
$day3 : Day($index2 : index -> ($index2 == $index1 + 2));
$day4 : Day($index2 : index -> ($index2 == $index1 + 3));
Match($homeTeam : homeTeam, day == $day1);
Match(homeTeam == $homeTeam, day == $day2);
Match(homeTeam == $homeTeam, day == $day3);
Match(homeTeam == $homeTeam, day == $day4);
end
query "fourConsecutiveAwayMatches"
$day1 : Day($index1 : index);
$day2 : Day($index2 : index -> ($index2 == $index1 + 1));
$day3 : Day($index2 : index -> ($index2 == $index1 + 2));
$day4 : Day($index2 : index -> ($index2 == $index1 + 3));
Match($awayTeam : awayTeam, day == $day1);
Match(awayTeam == $awayTeam, day == $day2);
Match(awayTeam == $awayTeam, day == $day3);
Match(awayTeam == $awayTeam, day == $day4);
end
query "matchRepeater"
$day1 : Day($index1 : index);
$day2 : Day($index2 : index -> ($index2 == $index1 + 1));
Match($homeTeam : homeTeam, $awayTeam : awayTeam, day == $day1);
Match(homeTeam == $awayTeam, awayTeam == $homeTeam, day == $day2);
end
---------------------------------------------------------------------
To unsubscribe from this list please visit:
http://xircles.codehaus.org/manage_email