import heapq
class KNN:
def __init__(self, reference, distanceFn, K):
self.reference = reference
self.distanceFn = distanceFn
self.k = K
self.k_nearest = []
def observe(self, query):
distances = self.distanceFn(query, self.reference)
for distance, patch in zip(distances, query):
min_dist = float('inf')
for dist in distance:
if dist<min_dist:
min_dist = dist
heapq.heappush(self.k_nearest, (min_dist, patch))
if len(self.k_nearest)>k:
heapq.heappop(self.k_nearest)
@property
def nearest_k(self):
self.k_nearest.sort()
nearest_k_return = [patch for _, patch in self.k_nearest]
return np.array(sorted(nearest_k))
aW1wb3J0IGhlYXBxCgpjbGFzcyBLTk46CglkZWYgX19pbml0X18oc2VsZiwgcmVmZXJlbmNlLCBkaXN0YW5jZUZuLCBLKToKCQlzZWxmLnJlZmVyZW5jZSA9IHJlZmVyZW5jZQoJCXNlbGYuZGlzdGFuY2VGbiA9IGRpc3RhbmNlRm4KCQlzZWxmLmsgPSBLCgkJc2VsZi5rX25lYXJlc3QgPSBbXQoJCQoJZGVmIG9ic2VydmUoc2VsZiwgcXVlcnkpOgoJCWRpc3RhbmNlcyA9IHNlbGYuZGlzdGFuY2VGbihxdWVyeSwgc2VsZi5yZWZlcmVuY2UpCgkJCgkJZm9yIGRpc3RhbmNlLCBwYXRjaCBpbiB6aXAoZGlzdGFuY2VzLCBxdWVyeSk6CgkJCW1pbl9kaXN0ID0gZmxvYXQoJ2luZicpCgkJCWZvciBkaXN0IGluIGRpc3RhbmNlOgoJCQkJaWYgZGlzdDxtaW5fZGlzdDoKCQkJCQltaW5fZGlzdCA9IGRpc3QKCQkJaGVhcHEuaGVhcHB1c2goc2VsZi5rX25lYXJlc3QsIChtaW5fZGlzdCwgcGF0Y2gpKQoJCQlpZiBsZW4oc2VsZi5rX25lYXJlc3QpPms6CgkJCQloZWFwcS5oZWFwcG9wKHNlbGYua19uZWFyZXN0KQoKCUBwcm9wZXJ0eQkKCWRlZiBuZWFyZXN0X2soc2VsZik6CgkJc2VsZi5rX25lYXJlc3Quc29ydCgpCgkJbmVhcmVzdF9rX3JldHVybiA9IFtwYXRjaCBmb3IgXywgcGF0Y2ggaW4gc2VsZi5rX25lYXJlc3RdCgkJcmV0dXJuIG5wLmFycmF5KHNvcnRlZChuZWFyZXN0X2spKQ==