Skip to content

Commit 0c32341

Browse files
author
Axel Dahlberg
committed
More tests
1 parent 55a957c commit 0c32341

File tree

2 files changed

+64
-8
lines changed

2 files changed

+64
-8
lines changed

qlinklayer/scheduler.py

+5-2
Original file line numberDiff line numberDiff line change
@@ -810,7 +810,7 @@ def __init__(self, distQueue, qmm, feu, weights=None):
810810
:param feu: :obj:`~qlinklayer.feu.FidelityEstimationUnit`
811811
(optional) The fidelity estimation unit
812812
:param weights: None, list of floats
813-
* If None, a strict priority queue will be used, with the queue IDs as priorities
813+
* If None, a unweighted fair queue will be used, (i.e. equal weights)
814814
* If list of floats, the length of the list needs to equal the number of queues in the distributed queue.
815815
The floats need to be non-zero. If a weight is zero, this is seen as infinite weight and queues with zero
816816
weight will always be scheduled before other queues. If multiple queues have weight zero, then
@@ -853,7 +853,7 @@ def _compare_mhp_cycle(self, cycle1, cycle2):
853853

854854
def _get_relative_weights(self, weights):
855855
if weights is None:
856-
return [0] * len(self.distQueue.queueList)
856+
return [1] * len(self.distQueue.queueList)
857857
if not isinstance(weights, list) or isinstance(weights, tuple):
858858
raise TypeError("Weights need to be None or list")
859859
if not len(weights) == len(self.distQueue.queueList):
@@ -918,10 +918,13 @@ def set_virtual_finish(self, scheduler_request, qid):
918918
est_nr_cycles_per_pair = self._estimate_nr_of_cycles_per_pair(scheduler_request)
919919

920920
# Check if this is an atomic request
921+
# Compute initial virt finish (if non-atomic this will be updated per success)
921922
if scheduler_request.atomic:
922923
virt_duration = est_nr_cycles_per_pair * scheduler_request.num_pairs
924+
self.last_virt_finish[qid] = virt_start + virt_duration / self.relative_weights[qid]
923925
else:
924926
virt_duration = est_nr_cycles_per_pair
927+
self.last_virt_finish[qid] = virt_start + virt_duration * scheduler_request.num_pairs /self.relative_weights[qid]
925928

926929
# Compute initial virt finish (if non-atomic this will be updated per success)
927930
init_virt_finish = virt_start + virt_duration / self.relative_weights[qid]

tests/test_scheduler.py

+59-6
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
from easysquid.quantumMemoryDevice import NVCommunicationDevice
1111
from netsquid.simutil import sim_run, sim_reset
1212
from qlinklayer.distQueue import EGPDistributedQueue, WFQDistributedQueue
13-
from qlinklayer.scheduler import StrictPriorityRequestScheduler, WFQRequestScheduler
13+
from qlinklayer.scheduler import StrictPriorityRequestScheduler, WFQRequestScheduler, SchedulerRequest
1414
from qlinklayer.qmm import QuantumMemoryManagement
1515
from qlinklayer.egp import EGPRequest
1616
from qlinklayer.scenario import EGPSimulationScenario
@@ -183,7 +183,7 @@ def setUp(self):
183183
def test_init(self):
184184
# Test default
185185
scheduler = WFQRequestScheduler(self.distQueueA, self.qmmA, self.feuA)
186-
self.assertEqual(scheduler.relative_weights, [0] * self.num_queues)
186+
self.assertEqual(scheduler.relative_weights, [1] * self.num_queues)
187187

188188
# Test wrong type
189189
with self.assertRaises(TypeError):
@@ -215,12 +215,65 @@ def test_compare_cycle_odd(self):
215215
cycle1 = 0
216216
cycle2 = 1
217217

218-
for _ in range(scheduler.max_mhp_cycle_number):
219-
print(scheduler._compare_mhp_cycle(cycle1, cycle2))
218+
for i in range(scheduler.max_mhp_cycle_number):
219+
if i == 3:
220+
self.assertEqual(scheduler._compare_mhp_cycle(cycle1, cycle2), 1)
221+
else:
222+
self.assertEqual(scheduler._compare_mhp_cycle(cycle1, cycle2), -1)
223+
self.assertEqual(scheduler._compare_mhp_cycle(cycle1, cycle1), 0)
224+
self.assertEqual(scheduler._compare_mhp_cycle(cycle2, cycle2), 0)
220225
scheduler.mhp_cycle_number += 1
221226

222-
def test_set_virtual_finish(self):
223-
pass
227+
def test_compare_cycle_even(self):
228+
scheduler = WFQRequestScheduler(self.distQueueA, self.qmmA, self.feuA)
229+
scheduler.max_mhp_cycle_number = 6
230+
scheduler.mhp_cycle_number = 0
231+
232+
cycle1 = 0
233+
cycle2 = 1
234+
235+
for i in range(scheduler.max_mhp_cycle_number):
236+
if i == 4:
237+
self.assertEqual(scheduler._compare_mhp_cycle(cycle1, cycle2), 1)
238+
else:
239+
self.assertEqual(scheduler._compare_mhp_cycle(cycle1, cycle2), -1)
240+
self.assertEqual(scheduler._compare_mhp_cycle(cycle1, cycle1), 0)
241+
self.assertEqual(scheduler._compare_mhp_cycle(cycle2, cycle2), 0)
242+
scheduler.mhp_cycle_number += 1
243+
244+
def test_set_virtual_finish_same_queue_same_req(self):
245+
scheduler = WFQRequestScheduler(self.distQueueA, self.qmmA, self.feuA)
246+
247+
# Compare high and low min_fidelity
248+
requests = [SchedulerRequest(), SchedulerRequest()]
249+
wfq_requests = []
250+
for req in requests:
251+
wfq_requests.append(scheduler.set_virtual_finish(req, 0))
252+
self.assertGreater(wfq_requests[0].init_virtual_finish, wfq_requests[1].init_virtual_finish)
253+
self.assertEqual(wfq_requests[0].est_cycles_per_pair, wfq_requests[1].est_cycles_per_pair)
254+
self.assertEqual(wfq_requests[0].init_virtual_finish + wfq_requests[0].est_cycles_per_pair, wfq_requests[1].init_virtual_finish)
255+
256+
def test_set_virtual_finish_fidelity(self):
257+
scheduler = WFQRequestScheduler(self.distQueueA, self.qmmA, self.feuA)
258+
259+
# Compare high and low min_fidelity
260+
requests = [SchedulerRequest(min_fidelity=0.8), SchedulerRequest(min_fidelity=0.6)]
261+
wfq_requests = []
262+
for qid, req in enumerate(requests):
263+
wfq_requests.append(scheduler.set_virtual_finish(req, qid))
264+
self.assertGreater(wfq_requests[0].init_virtual_finish, wfq_requests[1].init_virtual_finish)
265+
self.assertGreater(wfq_requests[0].est_cycles_per_pair, wfq_requests[1].est_cycles_per_pair)
266+
267+
def test_set_virtual_finish_num_pairs(self):
268+
scheduler = WFQRequestScheduler(self.distQueueA, self.qmmA, self.feuA)
269+
270+
# Compare high and low num pairs (non atomic)
271+
requests = [SchedulerRequest(num_pairs=2), SchedulerRequest(num_pairs=10)]
272+
wfq_requests = []
273+
for qid, req in enumerate(requests):
274+
wfq_requests.append(scheduler.set_virtual_finish(req, qid))
275+
self.assertEqual(wfq_requests[0].init_virtual_finish, wfq_requests[1].init_virtual_finish)
276+
self.assertEqual(wfq_requests[0].est_cycles_per_pair, wfq_requests[1].est_cycles_per_pair)
224277

225278
def test_scheduling(self):
226279
pass

0 commit comments

Comments
 (0)