Kanerva's Table 7.3 (page 70)


In [1]:
import sdm as sdmlib
from sdm import utils
import os
import matplotlib.pyplot as plt
from IPython.display import clear_output
import time
%matplotlib inline

In [6]:
def run(bits, radius, max_iter=1, sample=1000000):
    scanner_type = sdmlib.SDM_SCANNER_OPENCL

    address_space = sdmlib.AddressSpace.init_random(bits, sample)
    counter = sdmlib.Counter.init_zero(bits, sample)
    #counter = sdmlib.Counter.create_file('TO-BE-DELETED', bits, sample)
    sdm = sdmlib.SDM(address_space, counter, radius, scanner_type)

    for i in range(100):
        if i%50 == 0:
            clear_output(wait=True)
            print 'Writing 10,000 random bitstrings... {}'.format(i)
        bs = sdmlib.Bitstring.init_random(bits)
        sdm.write(bs, bs)

    b = sdmlib.Bitstring.init_random(bits)
    sdm.write(b, b)

    distances = []
    x = range(0, bits+1)
    t0 = time.time()
    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=max_iter)
        distances.append(d.distance_to(b))
    t1 = time.time()
    print 'Done! {:.2f} seconds'.format(t1-t0)
    
    return distances

In [7]:
data = []

In [8]:
max_iter = 15
sample = 1000000

for bits in [256]:
    radius = utils.calculate_radius(bits)
    print 'Radius: ', radius
    %time distances = run(bits, radius, max_iter=max_iter, sample=sample)
    distances = [(1.0*x)/bits for x in distances]
    x = [1.0*x/bits for x in range(len(distances))]
    data.append((bits, x, distances))


Distance:  256 (100.00%)
Done! 6.78 seconds
CPU times: user 2.89 s, sys: 2.09 s, total: 4.98 s
Wall time: 8.96 s

In [10]:
plt.figure(figsize=(8, 6), dpi=100)
plt.plot(x, x, 'k')
for bits, x, distances in data:
    plt.plot(x, distances, label=str(bits))
x = [1.0*x/1000 for x in range(1000)]
plt.plot(x, [0.5]*len(x), 'k:')
plt.title('Kanerva\'s Figure 7.3')
plt.ylabel('New distance (after {} read)'.format(max_iter))
plt.xlabel('Old distance')
plt.legend(bbox_to_anchor=(1.05, 1), loc=2, borderaxespad=0.)
plt.grid()
plt.axis([0, 1, 0, 1]);



In [ ]:
utils.calculate_radius(256)

In [ ]:
bs = sdmlib.Bitstring.init_random(256)

In [ ]:
bs.to_binary()

In [ ]:
len(_34)

In [ ]:
bs.to_hex()

In [ ]:
256/4

In [ ]:
len(_36)

In [ ]: