Skip to content
This repository was archived by the owner on Apr 25, 2024. It is now read-only.

Commit c8072a4

Browse files
committed
Address comments
1 parent ff9d0c8 commit c8072a4

File tree

2 files changed

+18
-66
lines changed

2 files changed

+18
-66
lines changed

src/pyk/proof/parallel.py

Lines changed: 16 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313

1414

1515
P = TypeVar('P', bound='Proof')
16-
U = TypeVar('U', bound='Any')
16+
U = TypeVar('U')
1717

1818

1919
class Prover(ABC, Generic[P, U]):
@@ -83,30 +83,31 @@ def exec(self) -> U:
8383

8484

8585
def prove_parallel(
86-
proofs: list[Proof],
87-
# We need a way to map proofs to provers, but for simplicity, I'll assume it as a given
88-
provers: dict[Proof, Prover],
86+
proofs: dict[str, Proof],
87+
provers: dict[str, Prover],
8988
) -> Iterable[Proof]:
90-
pending: dict[Future[Any], Proof] = {}
89+
pending: dict[Future[Any], str] = {}
9190
explored: set[ProofStep] = set()
9291

93-
def submit(proof: Proof, pool: Executor) -> None:
94-
prover = provers[proof]
92+
def submit(proof_id: str, pool: Executor) -> None:
93+
proof = proofs[proof_id]
94+
prover = provers[proof_id]
9595
for step in prover.steps(proof): # <-- get next steps (represented by e.g. pending nodes, ...)
9696
if step in explored:
9797
continue
9898
explored.add(step)
9999
future = pool.submit(step.exec) # <-- schedule steps for execution
100-
pending[future] = proof
100+
pending[future] = proof_id
101101

102102
with ProcessPoolExecutor(max_workers=2) as pool:
103-
for proof in proofs:
104-
submit(proof, pool)
103+
for proof_id in proofs.keys():
104+
submit(proof_id, pool)
105105

106106
while pending:
107-
future = list(wait(pending).done)[0]
108-
proof = pending[future]
109-
prover = provers[proof]
107+
future = wait(pending).done.pop()
108+
proof_id = pending[future]
109+
proof = proofs[proof_id]
110+
prover = provers[proof_id]
110111
update = future.result()
111112
prover.commit(proof, update) # <-- update the proof (can be in-memory, access disk with locking, ...)
112113

@@ -121,6 +122,6 @@ def submit(proof: Proof, pool: Executor) -> None:
121122
assert len(list(prover.steps(proof))) == 0
122123
break
123124

124-
submit(proof, pool)
125+
submit(proof_id, pool)
125126
pending.pop(future)
126-
return proofs
127+
return proofs.values()

src/tests/integration/proof/test_parallel_prove.py

Lines changed: 2 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
from __future__ import annotations
22

33
import time
4-
from copy import deepcopy
54
from dataclasses import dataclass
65
from typing import TYPE_CHECKING
76

@@ -81,7 +80,6 @@ def commit(self, proof: TreeExploreProof, update: int) -> None:
8180

8281

8382
def simple_tree() -> dict[int, set[int]]:
84-
edges: dict[int, set[int]] = {}
8583
# 0
8684
# / \
8785
# 1 2
@@ -91,17 +89,7 @@ def simple_tree() -> dict[int, set[int]]:
9189
# 5 6 7
9290
# / \
9391
# 8 9
94-
edges[0] = {1, 2}
95-
edges[1] = set()
96-
edges[2] = {3, 4}
97-
edges[3] = {5, 6}
98-
edges[4] = {7}
99-
edges[5] = set()
100-
edges[6] = set()
101-
edges[7] = {8, 9}
102-
edges[8] = set()
103-
edges[9] = set()
104-
return edges
92+
return {0: {1, 2}, 1: set(), 2: {3, 4}, 3: {5, 6}, 4: {7}, 5: set(), 6: set(), 7: {8, 9}, 8: set(), 9: set()}
10593

10694

10795
def test_multiple_provers_fails() -> None:
@@ -115,47 +103,10 @@ def test_multiple_provers_fails() -> None:
115103
prover2.commit(proof, step.exec())
116104

117105

118-
def test_steps_read_only() -> None:
119-
def assert_proof_equals(p1: TreeExploreProof, p2: TreeExploreProof) -> None:
120-
assert p1.edges == p2.edges
121-
assert p1.init == p2.init
122-
assert p1.reached == p2.reached
123-
assert p1.target == p2.target
124-
125-
prover = TreeExploreProver()
126-
proof = TreeExploreProof(0, 9, simple_tree())
127-
while True:
128-
initial_proof = deepcopy(proof)
129-
steps = prover.steps(proof)
130-
if len(list(steps)) == 0:
131-
break
132-
final_proof = deepcopy(proof)
133-
assert_proof_equals(initial_proof, final_proof)
134-
for step in steps:
135-
prover.commit(proof, step.exec())
136-
137-
138-
def test_commit_after_finished() -> None:
139-
prover = TreeExploreProver()
140-
proof = TreeExploreProof(0, 9, simple_tree())
141-
results: list[int] = []
142-
while True:
143-
steps = prover.steps(proof)
144-
if len(list(steps)) == 0:
145-
break
146-
for step in steps:
147-
result = step.exec()
148-
results.append(result)
149-
prover.commit(proof, result)
150-
prover.commit(proof, result)
151-
for result in results:
152-
prover.commit(proof, result)
153-
154-
155106
def test_parallel_prove() -> None:
156107
prover = TreeExploreProver()
157108
proof = TreeExploreProof(0, 9, simple_tree())
158-
results = prove_parallel([proof], {proof: prover})
109+
results = prove_parallel({'proof1': proof}, {'proof1': prover})
159110
assert len(list(results)) == 1
160111
assert len(list(prover.steps(proof))) == 0
161112
assert list(results)[0].status == ProofStatus.PASSED

0 commit comments

Comments
 (0)