In [1]:
from __future__ import print_function
import sdm as sdmlib
import matplotlib.pyplot as plt
%matplotlib inline
In [2]:
bits = 1000
sample = 1000000
radius = 451
scanner_type = sdmlib.SDM_SCANNER_THREAD
In [3]:
address_space = sdmlib.AddressSpace.init_random(bits, sample)
counter = sdmlib.Counter.init_zero(bits, sample)
sdm = sdmlib.SDM(address_space, counter, radius, scanner_type)
In [4]:
for i in range(10000):
if i%100 == 0:
print('!', end='')
b = sdmlib.Bitstring.init_random(bits)
sdm.write(b, b)
print('')
In [5]:
b = sdmlib.Bitstring.init_random(1000)
sdm.write(b, b)
In [6]:
from IPython.display import clear_output
def run(z, samples=3):
distances = []
x = range(0, 1001)
for i, dist in enumerate(x):
clear_output(wait=True)
print('z={:5s} Distance: {:4d} ({:.2f}%)'.format(str(z), dist, 100.*(i+1)/len(x)))
v = []
for j in range(samples):
c = sdmlib.Bitstring.init_from_bitstring(b)
c.flip_random_bits(dist)
assert c.distance_to(b) == dist
d = sdm.read(c, z=z)
v.append(d.distance_to(b))
distances.append((1.0*sum(v))/len(v))
print('Done!')
return distances
In [7]:
d = {}
In [8]:
#z_values = [None, 0, 0.5, 1, 1.5, 2, 2.5, 3]
z_values = [0, 1.5, 3]
for z in z_values:
d[z] = run(z)
In [9]:
plt.figure(figsize=(8, 6), dpi=100)
x = list(range(0, 1001))
v = [(z, d[z]) for z in z_values]
for z, distances in v:
plt.plot(x, distances, label=str(z))
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.legend(bbox_to_anchor=(1.05, 1), loc=2, borderaxespad=0.)
plt.grid()
plt.axis([0, 1000, 0, 1000]);
In [ ]:
plt.figure()
for z, distances in d.items():
plt.plot(x, distances, label=str(z))
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 [ ]:
import pickle
pickle.dump(d, open(b'table74.pickle', 'w'))
In [ ]: