2015-01-07 6 views
0

Я пытаюсь выполнить пару задач и использовать ограниченный набор фактов без создания всех возможных комбинаций. Хотя следующее правило еще не завершено, производительность очень медленная. Я ищу предложения.Есть ли способ улучшить эффективность правил?

when 
$rp : RoutePair() 

accumulate(RouteRun(routePair == $rp, $runId : runId); 
      $routeRunListAm : collectList($runId), 
      $count : count(); 
      $count == 4) 
accumulate($pr : PairableRuns((runId1 == $routeRunListAm.toArray()[0] && runId2 == $routeRunListAm.toArray()[1]) 
          || (runId1 == $routeRunListAm.toArray()[0] && runId2 == $routeRunListAm.toArray()[2]) 
          || (runId1 == $routeRunListAm.toArray()[0] && runId2 == $routeRunListAm.toArray()[3]) 
          || (runId1 == $routeRunListAm.toArray()[1] && runId2 == $routeRunListAm.toArray()[2]) 
          || (runId1 == $routeRunListAm.toArray()[1] && runId2 == $routeRunListAm.toArray()[3]) 
          || (runId1 == $routeRunListAm.toArray()[2] && runId2 == $routeRunListAm.toArray()[3])); 
      $pairableRunsListPm : collectList($pr), 
      $count : count(); 
      $count >= 2) 
accumulate(RouteRun(routePair == $rp, $returnRunId : returnRunId); 
      $routeRunListPm : collectList($returnRunId)) 
accumulate($pr : PairableRuns((runId1 == $routeRunListPm.toArray()[0] && runId2 == $routeRunListPm.toArray()[1]) 
          || (runId1 == $routeRunListPm.toArray()[0] && runId2 == $routeRunListPm.toArray()[2]) 
          || (runId1 == $routeRunListPm.toArray()[0] && runId2 == $routeRunListPm.toArray()[3]) 
          || (runId1 == $routeRunListPm.toArray()[1] && runId2 == $routeRunListPm.toArray()[2]) 
          || (runId1 == $routeRunListPm.toArray()[1] && runId2 == $routeRunListPm.toArray()[3]) 
          || (runId1 == $routeRunListPm.toArray()[2] && runId2 == $routeRunListPm.toArray()[3])); 
      $pairableRunsListPm : collectList($pr), 
      $count : count(); 
      $count >= 2) 

затем

+0

Почему 'toArray() [x]'? Разве это не 'get (x)' так же хорошо? – laune

+0

Вы предполагаете, что собранный список $ routeRunListAm содержит значения в определенном порядке, потому что в противном случае асимметричное совпадение с runId1, предшествующим runId2, не имеет смысла. Я не вижу, как этот порядок должен произойти, поскольку накопление не связано с детерминированной последовательностью. – laune

+0

Функция факта и осуществимости PairableRuns будет обрабатывать любой порядок. Как я могу получить список? Это позволит сократить количество проверенных трасс, что необходимо будет выполнить. – user2952819

ответ

1

Я должен (аb) использовать ответ, так что я могу задать свои вопросы, чтобы понять проблему.

class RoutePair{...} 
class RouteRun( 
    RoutePair routePair; 
    RunId runId 
} 
class PairableRuns(
    RunId runId1; // maybe String or int - doesn't matter 
    RunId runId2; 
} 

После первого Collect, $routeRunListAm является список из 4 объектов RouteRun, в любом порядке. Но сложное логическое выражение будет возвращать true только в том случае, если порядок runId1 и runId2 в некоторых PairableRuns отражается порядком в этом списке, который был накоплен в некотором индетерминированном порядке.

Я нахожу это также что-то раздражающее, что этот Список должен иметь точно 4 Объекты RouteRun - почему бы и нет> = 4? Вторая часть условия содержит почти идентичные комбинации СЕ и ограничений, за исключением того, что здесь отсутствует условие $count == 4 из третьего накопителя СЕ.

Я не уверен, что сложное булево выражение должно выяснить, но я думаю, что гораздо проще

$pr: PairableRuns(runId1 memberOf $routeRunListAm, 
        runId2 memberOf $routeRunListAm) 

должны достичь того же.

Однако я не уверен, действительно ли этого достаточно. Рассмотрим, что $ routeRunListAm содержит 7, 12, 14, 22 и PairableRuns {7,12}, {7,14}, {7,22}. Это будет соответствовать первоначальному ограничению, а также моей предложенной форме три раза - это то, что нужно?

Невозможно проконсультироваться без краткой спецификации (что правило, как показано, определенно нет).

Смежные вопросы