fix: use circuit compute trait in lut resolver
This commit is contained in:
@@ -1,10 +1,9 @@
|
|||||||
import bisect
|
import bisect
|
||||||
from itertools import chain, product
|
from itertools import chain
|
||||||
from functools import cached_property
|
|
||||||
from .common import Resolver
|
from .common import Resolver
|
||||||
from .bfs import BfsResolver
|
from .bfs import BfsResolver
|
||||||
from ..dataset import DatasetCollection, Dataset
|
from ..dataset import DatasetCollection, Dataset
|
||||||
from ..common import Circuit, DeviceKind, JointKind, CircuitValueTrait
|
from ..common import Circuit, DeviceKind, CircuitValueTrait
|
||||||
from ..query import Request, Response
|
from ..query import Request, Response
|
||||||
|
|
||||||
|
|
||||||
@@ -91,6 +90,7 @@ class LutResolver(Resolver):
|
|||||||
# target. This guarantees items are visited in strictly increasing
|
# target. This guarantees items are visited in strictly increasing
|
||||||
# difference order, so the first N items within tolerance are exactly
|
# difference order, so the first N items within tolerance are exactly
|
||||||
# the N best matches.
|
# the N best matches.
|
||||||
|
cv_trait = CircuitValueTrait(request.device_kind, target)
|
||||||
while left >= 0 or right < len(lut):
|
while left >= 0 or right < len(lut):
|
||||||
if len(bucket) >= count_limit:
|
if len(bucket) >= count_limit:
|
||||||
break
|
break
|
||||||
@@ -100,7 +100,15 @@ class LutResolver(Resolver):
|
|||||||
elif right >= len(lut):
|
elif right >= len(lut):
|
||||||
go_left = True
|
go_left = True
|
||||||
else:
|
else:
|
||||||
go_left = (target - lut[left].value) <= (lut[right].value - target)
|
left_instance = lut[left]
|
||||||
|
left_diff = cv_trait.unsigned_difference(
|
||||||
|
left_instance.circuit, value=left_instance.value
|
||||||
|
)
|
||||||
|
right_instance = lut[right]
|
||||||
|
right_diff = cv_trait.unsigned_difference(
|
||||||
|
right_instance.circuit, value=right_instance.value
|
||||||
|
)
|
||||||
|
go_left = left_diff <= right_diff
|
||||||
|
|
||||||
if go_left:
|
if go_left:
|
||||||
item = lut[left]
|
item = lut[left]
|
||||||
@@ -109,7 +117,7 @@ class LutResolver(Resolver):
|
|||||||
item = lut[right]
|
item = lut[right]
|
||||||
right += 1
|
right += 1
|
||||||
|
|
||||||
diff = abs(target - item.value)
|
diff = cv_trait.unsigned_difference(item.circuit, value=item.value)
|
||||||
# Since the LUT is sorted, values on each side only move further
|
# Since the LUT is sorted, values on each side only move further
|
||||||
# from target as we advance. Once one side exceeds tolerance,
|
# from target as we advance. Once one side exceeds tolerance,
|
||||||
# the rest of that side is guaranteed out of range — disable it.
|
# the rest of that side is guaranteed out of range — disable it.
|
||||||
|
|||||||
Reference in New Issue
Block a user