From 1f3067012c6bf2ca3e021749ca4c7c5e2c36a5c4 Mon Sep 17 00:00:00 2001 From: HaYeong Lee <110161434+glorialeezero@users.noreply.github.com> Date: Fri, 22 Nov 2024 04:32:28 +0000 Subject: [PATCH 1/4] Add worklist --- qupsy/worklist.py | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 qupsy/worklist.py diff --git a/qupsy/worklist.py b/qupsy/worklist.py new file mode 100644 index 0000000..7af2e28 --- /dev/null +++ b/qupsy/worklist.py @@ -0,0 +1,27 @@ +from queue import PriorityQueue + +from qupsy.language import Pgm + + +class Worklist: + def __init__(self) -> None: + self.current_set: PriorityQueue[tuple[int, int, Pgm]] = PriorityQueue() + self.overall_set: list[Pgm] = [] + + def put(self, enqueue: list[Pgm]) -> None: + for element in enqueue: + if element not in self.overall_set: + self.current_set.put((element.cost, element.depth, element)) + self.overall_set.append(element) + + def get(self) -> Pgm: + return self.current_set.get_nowait()[2] + + def show_set(self) -> None: + print(self.overall_set) + + def show_pq(self) -> None: + print(self.current_set.queue) + + def notEmpty(self) -> bool: + return not self.current_set.empty() From 75989c676f7805ee064872d4958b48f5101e5140 Mon Sep 17 00:00:00 2001 From: HaYeong Lee <110161434+glorialeezero@users.noreply.github.com> Date: Fri, 22 Nov 2024 04:44:19 +0000 Subject: [PATCH 2/4] Modify Pgm language less than --- qupsy/language.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/qupsy/language.py b/qupsy/language.py index 7b92c57..266d8b6 100644 --- a/qupsy/language.py +++ b/qupsy/language.py @@ -1,3 +1,5 @@ +from __future__ import annotations + from abc import ABC, abstractmethod from textwrap import indent @@ -420,6 +422,9 @@ def __str__(self) -> str: def __repr__(self) -> str: return f"Pgm({self.body:!r})" + def __lt__(self, other: Pgm) -> bool: + return self.cost < other.cost + @property def cost(self) -> int: return self.body.cost From eba62c794666e3355bdfa4ed9298baf8ca2a42a6 Mon Sep 17 00:00:00 2001 From: HaYeong Lee <110161434+glorialeezero@users.noreply.github.com> Date: Fri, 22 Nov 2024 04:44:32 +0000 Subject: [PATCH 3/4] Refactoring --- qupsy/worklist.py | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/qupsy/worklist.py b/qupsy/worklist.py index 7af2e28..9e8d486 100644 --- a/qupsy/worklist.py +++ b/qupsy/worklist.py @@ -8,11 +8,11 @@ def __init__(self) -> None: self.current_set: PriorityQueue[tuple[int, int, Pgm]] = PriorityQueue() self.overall_set: list[Pgm] = [] - def put(self, enqueue: list[Pgm]) -> None: - for element in enqueue: - if element not in self.overall_set: - self.current_set.put((element.cost, element.depth, element)) - self.overall_set.append(element) + def put(self, *pgms: Pgm) -> None: + for pgm in pgms: + if pgm not in self.overall_set: + self.current_set.put((pgm.cost, pgm.depth, pgm)) + self.overall_set.append(pgm) def get(self) -> Pgm: return self.current_set.get_nowait()[2] @@ -25,3 +25,6 @@ def show_pq(self) -> None: def notEmpty(self) -> bool: return not self.current_set.empty() + + def num_pgm_left(self) -> int: + return self.current_set.qsize() From 4bb4007bbcb413501f8b99ad2e86a8e0ad95da1d Mon Sep 17 00:00:00 2001 From: HaYeong Lee <110161434+glorialeezero@users.noreply.github.com> Date: Fri, 22 Nov 2024 04:44:41 +0000 Subject: [PATCH 4/4] Add testcases --- tests/test_worklist.py | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 tests/test_worklist.py diff --git a/tests/test_worklist.py b/tests/test_worklist.py new file mode 100644 index 0000000..6f2f5b4 --- /dev/null +++ b/tests/test_worklist.py @@ -0,0 +1,30 @@ +from qupsy.language import GateCmd, H, HoleAexp, HoleCmd, HoleGate, Pgm, SeqCmd, X +from qupsy.worklist import Worklist + + +def test_worklist(): + worklist = Worklist() + assert not worklist.notEmpty() + + +def test_add_same_pgm(): + worklist = Worklist() + pgm = Pgm(HoleCmd()) + worklist.put(pgm, pgm) + assert worklist.num_pgm_left() == 1 + + +def test_get_pgm(): + worklist = Worklist() + pgm1 = Pgm(HoleCmd()) + pgm2 = Pgm(GateCmd(HoleGate())) + worklist.put(pgm1, pgm2) + assert worklist.get() == pgm2 + + +def test_add_same_cost(): + worklist = Worklist() + pgm1 = Pgm(SeqCmd(GateCmd(H(HoleAexp())), GateCmd(H(HoleAexp())))) + pgm2 = Pgm(SeqCmd(GateCmd(X(HoleAexp())), GateCmd(X(HoleAexp())))) + worklist.put(pgm1, pgm2) + assert worklist.get() == pgm1