我在努力编写更具可读性的声明性程序。所以我决定实现一个我们目前使用的简单算法。该程序执行如下:依赖关系图用pyDatalog解析
- 有命令和资源
- 每个命令都可以提供,需要多种资源
- 该算法将遍历所有命令和安排所规定的所有他们的要求的命令。现在提供了
- 如果全部命令被安排
- 我们不能满足的依赖关系,如果有离开的命令,我们不能对一个迭代调度新命令我们完成
- 命令提供的所有资源该算法
于是我想出了数据记录的变体看起来不错,但有两个问题:
- 这是错误的
- 我需要一个循环来读取结果
您可以找到完整的源码here。
这取决于假设,你可以很容易地用pytest运行它。
低于测试失败:如果我们需要先前的“排名”或订单提供的资源。它找不到它。我试图做出如下递归,但即使在简单的例子中它也失败了。
def test_graph_multirequire():
"""Test if the resolver can handle a graph with multiple requires"""
tree = [
[('A'), ('B'), ('C'), ('D'), ('E'), ('F'), ('G'),()],
[(), ('A'), ('B'), ('C', 'A'), ('D'), ('E'), ('F'), ('G')]
]
run_graph(tree)
def run_graph(tree):
"""Run an example"""
try:
tree_len = len(tree[0])
index = list(range(tree_len))
random.shuffle(index)
for i in index:
+ is_command(i)
for provide in tree[0][i]:
+ provides(i, provide)
for require in tree[1][i]:
+ requires(i, require)
##############################
is_root(X) <= is_command(X) & ~requires(X, Y)
follows(X, Z) <= (
provides(X, Y) & requires(Z, Y) & (X != Z)
)
order(0, X) <= is_root(X)
order(N, X) <= (N > 0) & order(N - 1, Y) & follows(Y, X)
##############################
ordered = []
try:
for x in range(tree_len):
nodes = order(x, N)
if not nodes:
break
ordered.extend([x[0] for x in nodes])
except AttributeError:
ordered = index
assert len(ordered) >= tree_len
print(ordered)
provided = set()
for command in ordered:
assert set(tree[1][command]).issubset(provided)
provided.update(tree[0][command])
finally:
pd.clear()
我的问题:
- 我使用错误的工具?
- 有人知道全面的数据记录方法吗?
- 您是如何真正解决上述问题的?
编辑:
- 我的思念像所有的量词()和存在(),我该如何表达这种在pyDatalog?
非常感谢您的回答。我解决了所有问题(删除了评论)。但我想要得到一个更好的语法:“subset([],L2)<=(L2 == L2)”或修复“+ subset([],List2)”,这是行不通的。 – Ganwell