Kanerva's Table 7.3 (page 70)


In [1]:
import sdm as sdmlib
import matplotlib.pyplot as plt
%matplotlib inline

In [2]:
bits = 1000
sample = 1000000
radius = 451
scanner_type = sdmlib.SDM_SCANNER_OPENCL

In [3]:
address_space = sdmlib.AddressSpace.init_from_b64_file('sdm-10000w.as')
counter = sdmlib.Counter.load_file('sdm-10000w')
sdm = sdmlib.SDM(address_space, counter, radius, scanner_type)

In [4]:
b = sdmlib.Bitstring.init_random(1000)
sdm.write(b, b)

In [5]:
from IPython.display import clear_output

distances = []
x = range(0, 1001)
for i, dist in enumerate(x):
    clear_output(wait=True)
    print 'Distance: {:4d} ({:.2f}%)'.format(dist, 100.*(i+1)/len(x))
    c = sdmlib.Bitstring.init_from_bitstring(b)
    c.flip_random_bits(dist)
    assert c.distance_to(b) == dist
    d = sdm.iter_read(c, max_iter=1)
    distances.append(d.distance_to(b))
print 'Done!'


Distance: 1000 (100.00%)
Done!

In [6]:
plt.figure()
plt.plot(x, distances)
plt.plot(x, x, 'k')
plt.plot(x, [500]*len(x), 'k:')
plt.title('Kanerva\'s Figure 7.3')
plt.ylabel('New distance (after one read)')
plt.xlabel('Old distance')
plt.grid()
plt.axis([0, 1000, 0, 1000]);



In [7]:
c = sdmlib.Bitstring.init_from_bitstring(b)
c.flip_random_bits(1000)
d = c
print 0, b.distance_to(d)
for i in xrange(10):
    d = sdm.read(d)
    print i+1, b.distance_to(d)


0 1000
1 765
2 682
3 570
4 512
5 519
6 509
7 498
8 506
9 481
10 489

In [ ]: