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

Reply via email to