有没有办法提高规则性能?
Is there a way to improve rule performance?
我正在尝试配对任务(运行)并利用一组有限的事实,而不实例化所有可能的组合。虽然以下规则尚未完成,但性能非常慢。我正在寻找建议。
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)
然后
我必须 (ab) 使用一个答案,这样我才能提出我的问题来理解问题。
class RoutePair{...}
class RouteRun(
RoutePair routePair;
RunId runId
}
class PairableRuns(
RunId runId1; // maybe String or int - doesn't matter
RunId runId2;
}
第一次收集后,$routeRunListAm
是一个包含 4 个 RouteRun 对象的列表,顺序不限。但是,如果某些 PairableRuns 中的 runId1 和 runId2 的顺序反映在以某种不确定顺序累积的该列表中的顺序,则复杂的布尔表达式只会 return 为真。
我发现这个 List 必须正好 4 个 RouteRun 对象——为什么不 >= 4?条件的第二部分包含几乎相同的 CE 和约束组合,只是这里的条件 $count == 4
在第三个累积 CE 中缺失。
我不确定复杂的布尔表达式应该确定什么,但我认为更简单
$pr: PairableRuns( runId1 memberOf $routeRunListAm,
runId2 memberOf $routeRunListAm )
应该达到同样的效果。
但是,我不确定这是否真的足够。考虑 $routeRunListAm 包含 7, 12, 14, 22
和 PairableRuns {7,12}
、{7,14}
、{7,22}
。这将匹配原始约束以及我建议的形式三次 - 这是期望的吗?
没有简明的规范就不可能提出建议(如图所示的规则绝对不是)。
我正在尝试配对任务(运行)并利用一组有限的事实,而不实例化所有可能的组合。虽然以下规则尚未完成,但性能非常慢。我正在寻找建议。
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)
然后
我必须 (ab) 使用一个答案,这样我才能提出我的问题来理解问题。
class RoutePair{...}
class RouteRun(
RoutePair routePair;
RunId runId
}
class PairableRuns(
RunId runId1; // maybe String or int - doesn't matter
RunId runId2;
}
第一次收集后,$routeRunListAm
是一个包含 4 个 RouteRun 对象的列表,顺序不限。但是,如果某些 PairableRuns 中的 runId1 和 runId2 的顺序反映在以某种不确定顺序累积的该列表中的顺序,则复杂的布尔表达式只会 return 为真。
我发现这个 List 必须正好 4 个 RouteRun 对象——为什么不 >= 4?条件的第二部分包含几乎相同的 CE 和约束组合,只是这里的条件 $count == 4
在第三个累积 CE 中缺失。
我不确定复杂的布尔表达式应该确定什么,但我认为更简单
$pr: PairableRuns( runId1 memberOf $routeRunListAm,
runId2 memberOf $routeRunListAm )
应该达到同样的效果。
但是,我不确定这是否真的足够。考虑 $routeRunListAm 包含 7, 12, 14, 22
和 PairableRuns {7,12}
、{7,14}
、{7,22}
。这将匹配原始约束以及我建议的形式三次 - 这是期望的吗?
没有简明的规范就不可能提出建议(如图所示的规则绝对不是)。