Je m'efforce d'écrire des programmes déclaratifs plus lisibles. J'ai donc décidé d'implémenter un algorithme simple que nous utilisons actuellement. La mise en œuvre de la procédure est la suivante:Graphique de dépendance Résolution avec pyDatalog
- Il y a des commandes et des ressources
- Chaque commande peut fournir et exiger des ressources multiples
- L'algorithme boucle sur toutes les commandes et planifier les commandes que toutes leurs exigences sont prévues .
- Toutes les ressources de la commande fournit sont désormais prévus
- Nous avons terminé si toutes les commandes sont programmées
- Nous ne pouvons pas satisfaire les dépendances s'il y a des commandes gauche et nous ne pouvons pas planifier de nouvelles commandes pour une itération de l'algorithme
Ainsi, la variante datalog je suis venu avec l'air bien, mais a deux problèmes:
- Il est faux
- J'ai besoin d'une boucle pour lire le résultat
Vous pouvez trouver la source complète here.
Cela dépend de l'hypothèse et vous pouvez facilement l'exécuter avec pytest. Ci-dessous le test qui échoue: Si nous avons besoin de ressources fournies par un "rank" ou une commande précédente. Il ne peut pas le trouver. J'ai essayé de faire récursif suit, mais alors il échoue même dans les exemples simples.
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()
Mes questions:
- Suis-je utiliser le bon outil?
- Est-ce que quelqu'un est au courant des procédures détaillées du journal des données?
- Comment résolvez-vous réellement le problème ci-dessus?
Edit:
- Je suis absent quantificateurs comme tous() et exists(), comment puis-je exprimer en pyDatalog?
Merci beaucoup pour votre réponse. J'ai résolu tous les problèmes que j'avais avec (supprimé les commentaires). Mais j'aimerais obtenir une syntaxe plus agréable pour: "subset ([], L2) <= (L2 == L2)" ou un correctif pour "+ sous-ensemble ([], List2)" qui ne fonctionne pas. – Ganwell