CycleEncoder and VarCycleEncoder

while we are at it, here’s the similarity plot for the VarCycleEncoder:
image

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()

2 Likes