while we are at it, here’s the similarity plot for the VarCycleEncoder:
from matplotlib import pyplot as plt
import numpy as np
import math
np.random.seed(0)
from math import log2
# multi cycle encoder. As CycleEncoder yet its period varies linearly between a min and a max value
def dense2sdr(x, slen):
return set(np.argsort(x)[-slen:])
def VarCycleEncoder(sdr_size, period=1, sdr_len=0, seed=None):
me = Self()
if sdr_len == 0:
# Arbitrary initial sdr length.
sdr_len = sdr_size // 4
periods = np.linspace(period, period * math.e, sdr_size)
r = np.linspace(0, 1, num=sdr_size, endpoint=False, dtype=np.float32)
r += 0.5 / sdr_size
np.random.seed(seed)
np.random.shuffle(r)
np.random.shuffle(periods)
def dense(x):
return (r + x / periods) % 1
def sdr(x, slen=sdr_len):
return dense2sdr(dense(x), slen)
me.dense, me.sdr, me.periods, me.r = dense, sdr, periods, r
return me
class Self:
pass
encoder = VarCycleEncoder(100)
representations = []
X = 100
N = 10
for i in range(X * N):
representations.append(encoder.sdr(i / X))
similarities = np.zeros((X * N, X * N), dtype=np.int32)
for i, a in enumerate(representations):
for j, b in enumerate(representations):
similarities[i, j] = len(a & b)
plt.imshow(similarities)
plt.show()