In [1]:
# Imports and notebook statements
%load_ext autoreload
%autoreload 2
%matplotlib notebook
%load_ext line_profiler

import torch
from torch.nn.functional import conv2d, relu_, unfold, fold
localConv=torch.nn.backends.thnn.backend.SpatialConvolutionLocal
if torch.cuda.is_available():
    device = torch.device('cuda')
else:
    device = torch.device('cpu')

import numpy as np
from scipy import stats
import matplotlib
import matplotlib.pyplot as plt
import matplotlib.animation as animation
import seaborn as sns
from sklearn.linear_model import LinearRegression

from utils import *

import warnings
warnings.filterwarnings('ignore')

In [2]:
def localConvolution(activity, weights, kernel):
    outputSize = (activity.shape[-2], activity.shape[-1])
    padding = tuple((k//2 for k in kernel))
    stride = (1, 1)
    unfoldedActivity = unfold(activity, kernel, 1, padding, stride)
    results = (weights*unfoldedActivity).sum(dim = 1)
    return (results.view(1, 1, outputSize[0], outputSize[1]))

In [3]:
def createMovie(data, name, interval=10):
    def update_line(num, data, line):
        line.set_data(data[num])
        return line,
    
    fig, ax   = plt.subplots(1,1)

    a0  = ax.matshow(data[0], animated=True,)
    ani = animation.FuncAnimation(fig, update_line, data.shape[0] - 1,
                                  fargs=(data, a0),
                                  interval=interval, blit=False)
    
    mywriter = animation.FFMpegWriter()
    ani.save(name,writer=mywriter)
    
    return(ani)

In [4]:
# STDP kernel time constant in seconds.  Used for the default kernel.
STDP_TIME_CONSTANT = 0.012

def w_0(x):
    """
    @param x (numpy array)
    A distance
    """
    a = 1.00
    lambda_net = 13.0
    beta = 3.0 / lambda_net ** 2
    gamma = 1.05 * beta

    return a * np.exp(-gamma * x) - np.exp(-beta * x)

def ew(x):
    """
    @param x (numpy array)
    A distance
    """
    lambda_net = 13.0
    beta = 3.15 / lambda_net ** 2

    return np.exp(-beta * x)

def w_1(x):
    """
    @param x (numpy array)
    A distance
    """
    lambda_net = 13.0
    beta = 3.15 / lambda_net ** 2

    return - np.exp(-beta * x)   

# Random walk builder
def buildTrajectory(length, stepSize, width=1., directionStability=0.95, wrap=False, circular=False):
    trajectory = np.zeros((int(length), 2))
    turns = np.zeros((int(length)))
    if circular:
        r = np.sqrt(np.random.rand())*width
        angle = np.random.rand()*2.*np.pi
        x = np.cos(angle)*r
        y = np.sin(angle)*r
    else:
        x = np.random.rand()*width
        y = np.random.rand()*width
    direction = np.random.rand() * 2 * np.pi
    twopi = 2*np.pi
    for i in range(int(length)):
        oldDir = direction
        recenter = 0
        patience = 0
        while True:
            # This is a random value between (-180, +180) scaled by directionStability
            dirChange = ((recenter + (np.random.rand() * twopi) - np.pi) *
                       (1.0 - directionStability + patience))
            direction = (direction + dirChange) % twopi
            rotation = np.asarray([np.cos(direction), np.sin(direction)])
            movement = stepSize*rotation
            if circular:
                position = (movement[0] + x)**2 + (movement[1] + y)**2
                print(np.sqrt(position), width)
                inBounds = np.sqrt(position) < width
            else:
                inBounds = 0 < (movement[0] + x) < width and 0 < (movement[1] + y) < width
            if inBounds or wrap:
                x += movement[0]
                y += movement[1]
                trajectory[i] = (x, y)
                turns[i] = np.abs(oldDir - direction)
                oldDir = direction
                break
            else:
                patience += .5
                recenter = oldDir
                

    return(trajectory, turns)

In [5]:
class GCN2D(object):
    
    def __init__(self,
                 numX,
                 numY,
                 inhibitionWindow,
                 inhibitionRadius,
                 inhibitionStrength,
                 excitationWindow,
                 excitationCenterBlock=0,
                 smoothingWindow=1,
                 boostEffect=10,
                 boostDecay=3.,
                 placeAlpha=20,
                 activityMeanAlpha=.1,
                 dt=0.001,
                 numPlaces=200,
                 placeMax=5,
                 placeMean=1.5,
                 circularPlaces=False,
                 globalTonic=20,
                 decayConstant=0.03,
                 envelopeWidth=0.25,
                 envelopeFactor=10,
                 stdpWindow=10,
                 sigmaLoc=0.05,
                 learningRate=0.015,
                 negativeLearnFactorP=.9,
                 negativeLearnFactorE=.9,
                 initialWeightFactor=.2,
                 initialExcitatoryFactor=.2,
                 weightDecay=60,
                 boostGradientX=1,
                 decayGradientX=1.,
                 tonicGradientX=1.,
                 inhibitionGradientX=1.,
                 wideningFactor=0,
                 hardwireE=False,
                 hardwireEStrength=1.,
                 hardwireERange=1.,
                 hardwireEOffset=1.,
                 excitationGradientX=1.,
                 learningRateE=0.01,
                 gradientType="linear",
                 envSize=1.,
                 weightNoise=None,):

        self.activity = torch.zeros([1, 1, numX, numY], device=device, dtype=torch.float)
        self.inhibitoryWeights = torch.zeros(1,
                                             (2*inhibitionWindow+1)*(2*inhibitionWindow+1),
                                              numX*numY, 
                                              device=device, dtype=torch.float)

        self.smoothingKernel = torch.ones([1, 1, 1+2*smoothingWindow, 1+2*smoothingWindow], dtype=torch.float,
                         device=device)
        size = (1+2*smoothingWindow)**2
        self.smoothingKernel /= size
        self.smoothingWindow = smoothingWindow
        
        
        self.longHistory = torch.zeros([1, 1, numX, numY], device=device, dtype=torch.float)
        self.placeHistory = torch.zeros([numPlaces,], device=device, dtype=torch.float)

        self.activityMeanAlpha = activityMeanAlpha
        self.placeAlpha = placeAlpha
    
        self.numX = numX
        self.numY = numY
        self.numPlaces=numPlaces
        self.placeMax = placeMax
        self.placeMean = placeMean
        self.envSize=envSize
        
        for i in range(1+2*inhibitionWindow):
            for j in range(1+2*inhibitionWindow):
                xComp = np.abs(i - (inhibitionWindow))
                yComp = np.abs(j - (inhibitionWindow))
                dist = np.asarray((xComp, yComp))
                dist = dist[0] ** 2 + dist[1] ** 2
                
                dist = max(dist - wideningFactor, 0)
                if dist <= 0:
                    weight = 0.
                else:
                    weight = w_0(dist/inhibitionRadius)*inhibitionStrength
                
                self.inhibitoryWeights[:, i*(2*inhibitionWindow+1) + j, :] = weight
                
        self.originalWeights = torch.tensor(self.inhibitoryWeights.cpu().numpy(), device=device, dtype=torch.float)
        if weightNoise is not None:
            mask = torch.zeros((1, (2*inhibitionWindow+1)**2, numX*numY), device=device, dtype=torch.float)
            mask.uniform_(0, weightNoise)
            self.inhibitoryWeights = mask*self.inhibitoryWeights
        
        self.activationHistory = torch.zeros([1, 1, numX, numY], device=device, dtype=torch.float)
        self.instantaneous = torch.zeros([1, 1, numX, numY], device=device, dtype=torch.float)
        
        self.directions = {"e": torch.tensor([0, 1], device=device, dtype=torch.float),
                           "w": torch.tensor([0, -1], device=device, dtype=torch.float),
                           "s": torch.tensor([1, 0], device=device, dtype=torch.float),
                           "n": torch.tensor([-1, 0], device=device, dtype=torch.float),
                          }
        
        self.excitatoryWeights = dict((k, torch.randn(1, (2*excitationWindow+1)*(2*excitationWindow+1),
                                                      self.numX*self.numY,
                        device=device, dtype=torch.float)*initialExcitatoryFactor)
                                      for k in self.directions.keys())
        
        self.excitatoryKernel = ((2*excitationWindow+1), (2*excitationWindow+1))
        self.inhibitoryKernel = ((2*inhibitionWindow+1), (2*inhibitionWindow+1))
        self.bias=torch.zeros((1,self.numX,self.numY), device=device, dtype=torch.float) # outC x outH x outW

        self.localConv=localConv.apply
        
        if isinstance(gradientType, str) and "linear" in gradientType.lower():
            gradient = np.linspace(0, boostGradientX, numX)
            decayGradient = np.linspace(0., decayGradientX, numX)
            tonicGradient = np.linspace(0., tonicGradientX, numX)
            inhibitionGradient = np.linspace(0., inhibitionGradientX, numX)
            excitationGradient = np.linspace(0., excitationGradientX, numX)
        elif isinstance(gradientType, str) and "exponential" in gradientType.lower():
            base = np.power(boostGradientX, 1./numX)
            gradient = np.power(base, np.arange(0, numX))
            decayBase = np.power(decayGradientX, 1./numX)
            decayGradient = np.power(decayBase, np.arange(0, numX))
            tonicBase = np.power(tonicGradientX, 1./numX)
            tonicGradient = np.power(tonicBase, np.arange(0, numX))
            inhibitionBase = np.power(inhibitionGradientX, 1./numX)
            inhibitionGradient = np.power(inhibitionBase, np.arange(0, numX))
            excitationBase = np.power(excitationGradientX, 1./numX)
            excitationGradient = np.power(excitationBase, np.arange(0, numX))
            
        elif isinstance(gradientType, float):
            upper = np.power(boostGradientX, 1./gradientType)
            gradient = np.power(np.linspace(1., upper, numX), gradientType)
            decayUpper = np.power(decayGradientX, 1./gradientType)
            decayGradient = np.power(np.linspace(1., decayUpper, numX), gradientType)
            tonicUpper = np.power(tonicGradientX, 1./gradientType)
            tonicGradient = np.power(np.linspace(1., tonicUpper, numX), gradientType)
            inhibitionUpper = np.power(inhibitionGradientX, 1./gradientType)
            inhibitionGradient = np.power(np.linspace(1., inhibitionUpper, numX), gradientType)
            excitationUpper = np.power(excitationGradientX, 1./gradientType)
            excitationGradient = np.power(np.linspace(1., excitationUpper, numX), gradientType)
            
        self.boostEffect = torch.tensor(np.repeat(
            gradient[:, np.newaxis], self.numY, axis=-1)*boostEffect,
                                       device=device, dtype=torch.float)
        self.alpha = torch.tensor(np.repeat(
            decayGradient[:, np.newaxis], self.numY, axis=-1)*boostDecay,
                                       device=device, dtype=torch.float)
        self.globalTonic = torch.tensor(np.repeat(
            tonicGradient[:, np.newaxis], self.numY, axis=-1)*globalTonic,
                                       device=device, dtype=torch.float)
        self.dt = dt
        self.decay = decayConstant
        self.inhibitionWindow = inhibitionWindow
        self.excitationWindow = excitationWindow
        self.envelopeWidth = envelopeWidth
        self.envelopeFactor = envelopeFactor
        self.sigmaLoc = sigmaLoc
        self.learningRate = learningRate
        self.learningRateE = learningRateE
        self.negativeLearnFactorP = negativeLearnFactorP
        self.negativeLearnFactorE = negativeLearnFactorE
        self.weightDecay = weightDecay
        
        self.zero = torch.zeros([1], device=device, dtype=torch.float)
        
        if circularPlaces:
            angles = np.random.rand(numPlaces)*2*np.pi
            radii = np.sqrt(np.random.rand(numPlaces))*self.envSize
            xComp = np.cos(angles)
            yComp = np.sin(angles)
            places = np.stack([xComp*radii, yComp*radii], axis=-1)
            self.places = torch.tensor(places, device=device, dtype=torch.float)
        else:
            self.places = torch.tensor(np.random.rand(numPlaces, 2)*self.envSize, device=device, dtype=torch.float)
        
        self.placeWeights = torch.tensor(np.random.rand(numX, numY, numPlaces)*initialWeightFactor,
                                         device=device, dtype=torch.float)
        
        self.placeActivity = torch.zeros([numPlaces,], device=device, dtype=torch.float)
        self.placeHistory = torch.zeros([numPlaces,], device=device, dtype=torch.float)
        
        self.envelope = torch.tensor(self.computeEnvelope(), device=device, dtype=torch.float)
        
        self.stdpWindow = stdpWindow
        
        # Hardwire the excitatory weights
        
        self.excitationMask = torch.zeros(1, (2*excitationWindow+1)*(2*excitationWindow+1), 1,
                        device=device, dtype=torch.float)

        for i in range(1+2*excitationWindow):
            for j in range(1+2*excitationWindow):
                xComp = np.abs(i - (excitationWindow))
                yComp = np.abs(j - (excitationWindow))
                dist = np.asarray((xComp, yComp))
                dist = dist[0] ** 2 + dist[1] ** 2

                if np.sqrt(dist) > excitationCenterBlock:
                    self.excitationMask[:, i*(1+2*excitationWindow) + j, :] = 1.

        if hardwireE:
            for k, direction in self.directions.items():
                for i in range(1+2*excitationWindow):
                    for j in range(1+2*excitationWindow):
                        
                        xComp = np.abs(i + hardwireEOffset*direction[0] - (excitationWindow))
                        yComp = np.abs(j + hardwireEOffset*direction[1] - (excitationWindow))
                        dist = np.asarray((xComp, yComp))
                        dist = dist[0] ** 2 + dist[1] ** 2

                        weight = ew(dist/hardwireERange)*hardwireEStrength

                        self.excitatoryWeights[k][:, i*(1+2*excitationWindow) + j, :] = weight
        
        for k in self.directions:
            for i, f in enumerate(excitationGradient):
                self.excitatoryWeights[k][:, :, i*self.numY:(i+1)*self.numY] *= f
        for i, f in enumerate(inhibitionGradient):
            self.inhibitoryWeights[:, :, i*self.numY:(i+1)*self.numY] *= f
            


    def computeEnvelope(self):
        """
        Compute an envelope for use in suppressing border cells.
        :return: A numpy array that can be elementwise-multiplied with activations
                 for the given cell population to apply the envelope.
        """
#         envelope = np.zeros((self.numX, self.numY))
#         for i, ip in enumerate(np.linspace(-1, 1, self.numX)):
#             for j, jp in enumerate( np.linspace(-1, 1, self.numY)):
#                 dist = np.sqrt(ip**2 + jp**2)
#                 if dist < 1 - self.envelopeWidth:
#                     envelope[i, j] = 1.
#                 else:
#                     envelope[i, j] = np.exp(-1.*self.envelopeFactor *
#                           ((dist - 1 + self.envelopeWidth)/self.envelopeWidth)**2)
#         return envelope
                
        envelopeX = [1 if self.numX/2. - np.abs(p) > self.envelopeWidth else
                          np.exp(-1.*self.envelopeFactor *
                          ((-self.numX/2. + np.abs(p) + self.envelopeWidth)/self.envelopeWidth)**2)
                          for p in np.arange(self.numX) - self.numX/2.]

        envelopeY = [1 if self.numY/2. - np.abs(p) > self.envelopeWidth else
                          np.exp(-1.*self.envelopeFactor *
                          ((-self.numY/2. + np.abs(p) + self.envelopeWidth)/self.envelopeWidth)**2)
                          for p in np.arange(self.numY) - self.numY/2.]

        return np.outer(envelopeX, envelopeY)

    
    def randomLesions(self, numLesions, lesionRadius, lesionInnerCutoff, envelopeThreshold=.5):
        lesions = []
        while len(lesions) < numLesions:
            x = int(np.random.rand()*self.numX)
            y = int(np.random.rand()*self.numY)
            if self.envelope[x, y] < envelopeThreshold:
                continue
            self.addLesions([(x, y)], [lesionRadius], [lesionInnerCutoff])
            lesions.append((x, y))
            
            
    def addLesions(self, lesionCenters, lesionRadii, lesionInnerCutoffs):
        for center, radius, cutoff in zip(lesionCenters, lesionRadii, lesionInnerCutoffs):
            for x in range(self.numX):
                for y in range(self.numY):
                    distance = np.sqrt((x - center[0])**2 + (y - center[1])**2)
                    if distance < cutoff:
                        self.envelope[x, y] = 0.
                    elif distance < radius:
                        value = (distance - cutoff)/(radius - cutoff)
                        self.envelope[x, y] = min(value, self.envelope[x, y])

                        
    def step(self, vel=None, speed=1, turn=1., place=True, normalize=False):
        with torch.no_grad():
            if place:
                self.instantaneous = torch.matmul(self.placeWeights, self.placeActivity).view(1, 1, self.numX, self.numY)
            else:
                self.instantaneous.fill_(0.)
            self.instantaneous += localConvolution(self.activity,
                                                   self.inhibitoryWeights,
                                                   self.inhibitoryKernel)
            
            if vel is not None:
                for k, weights in self.excitatoryWeights.items():
                    direction = torch.dot(self.directions[k], vel)
                    if direction > self.zero:  
                        self.instantaneous += localConvolution(self.activity,
                                                               weights,
                                                               self.excitatoryKernel)*direction
            self.instantaneous += self.globalTonic
            self.instantaneous *= self.envelope
            self.instantaneous -= self.activationHistory * self.boostEffect
            self.instantaneous *= min(speed, 1)
            relu_(self.instantaneous)
            self.activity += (self.instantaneous - self.activity/self.decay)*self.dt
            
            self.activationHistory = (1 - (1 - self.alpha*self.dt)/turn)*self.instantaneous +\
                                     ((1. - self.alpha*self.dt)/turn)*self.activationHistory
            
            self.longHistory = self.activityMeanAlpha*self.dt*(self.instantaneous) +\
                                     (1. - self.activityMeanAlpha*self.dt)*self.longHistory

        
    def simulate(self, time, vel = (0,0), logFreq = 10, startFrom = 0):
        self.activity = torch.tensor(np.random.rand(1, 1, self.numX, self.numY)*0.1, device=device,
                                                 dtype=torch.float)
        
        vel = torch.tensor(vel, device = device, dtype=torch.float)
        self.activationHistory.fill_(0)
        
        numSteps = int(time/self.dt)
        numLogs = int(((time - startFrom)/self.dt)/logFreq)
        output = torch.zeros([numLogs, self.numX, self.numY], device=device, dtype=torch.float)
        
        s = 0
        for t in range(numSteps):
            self.step(vel, place=False)
            if t % logFreq == 0 and t*self.dt >= startFrom:
                print("At {}".format(t*self.dt))
                output[s].copy_(self.activity.view(self.numX, self.numY))
                s += 1
                
        return output.cpu().numpy()
    
    
    def staticLearning(self,
                       time,
                       logFreq=10,
                       startFrom=0,
                       startingActivity=None,
                       startingHistory=None):
        
        if startingActivity is None:
            self.activity = torch.tensor(np.random.rand(1, 1, self.numX, self.numY)*0.1, device=device,
                                                     dtype=torch.float)
        else:
            self.activity= torch.tensor(startingActivity,
                                        device=device,
                                        dtype=torch.float).view((1, 1, self.numX, self.numY))
        
        if startingHistory is None:  
            self.activationHistory = torch.tensor(np.random.rand(1, 1, self.numX, self.numY)*0.0, device=device,
                                                 dtype=torch.float)
            
        else:
            self.activationHistory =torch.tensor(startingHistory,
                                                   device=device,
                                                   dtype=torch.float).view((1, 1, self.numX, self.numY))
        
        
        numSteps = int(time/self.dt)
        numLogs = int(((time - startFrom)/self.dt)/logFreq)
        output = torch.zeros([numLogs, self.numX, self.numY], device=device, dtype=torch.float)
        histOutput = torch.zeros([numLogs, self.numX, self.numY], device=device, dtype=torch.float)

        
        alphaboost = 1.
        s = 0
        for t in range(numSteps):
            self.step(place=False)
            
            if t*self.dt >= startFrom:
                self.inhibitoryUpdate()
                #self.inhibitoryWeights = torch.matmul(self.symmetrizer, self.inhibitoryWeights)
                self.decayWeightsToNormalPattern()
                
                if t % logFreq == 0:
                    print("At {}".format(t*self.dt))
                    output[s].copy_(self.activity.view(self.numX))
                    histOutput[s].copy_(self.activationHistory.view(self.numX))
                    s += 1
                
        return output.cpu().numpy(), histOutput.cpu().numpy()
    
    def decayWeightsToNormalPattern(self):
        """
        Only decay place weights
        """
        self.inhibitoryWeights -= self.dt*(self.inhibitoryWeights - self.originalWeights)/self.weightDecay
    
    
    def decayWeights(self):
        """
        Only decay place weights
        """
        self.placeWeights -= self.dt*self.placeWeights/self.weightDecay
    
    
    def learn(self, time, plotting=True, plotInterval=100, runLength=10, oneD=False, learnStart=0.,
              stab=0.97, wrap=False, circular=False, speed=0.5, localNormalization=True):
        if plotting:
                fig, (ax1, ax2, ax3, ax4) = plt.subplots(4,1)
                ax1.scatter(self.places[:, 1].cpu().numpy(),
                    self.places[:, 0].cpu().numpy(),
                    c = self.placeActivity.cpu().numpy(),
                    cmap = plt.get_cmap("coolwarm"))
                im1 = ax2.matshow(self.activity.view((self.numX, self.numY)).cpu().numpy())
                cb1 = fig.colorbar(im1, ax=ax2)
                
                im2 = ax3.matshow(self.activity.view((self.numX, self.numY)).cpu().numpy())
                cb2 = fig.colorbar(im2, ax=ax3)
                
                im3 = ax4.scatter(self.places[:, 1].cpu().numpy(),
                            self.places[:, 0].cpu().numpy(),
                            c = self.placeWeights[self.numX//2, self.numY//2, :].cpu().numpy(),
                            cmap = plt.get_cmap("coolwarm"))
                cb3 = fig.colorbar(im3, ax=ax4)
                plt.show()
                
        self.activityBuffer = torch.zeros([self.stdpWindow, self.numX*self.numY],
                                          device=device, dtype=torch.float)
        self.placeBuffer = torch.zeros([self.stdpWindow, self.numPlaces],
                                       device=device, dtype=torch.float)
        self.velBuffer = torch.zeros([self.stdpWindow, 2], device=device, dtype=torch.float)
        
        self.stdpValues = torch.tensor(np.exp(-self.dt*np.arange(0, self.stdpWindow)/STDP_TIME_CONSTANT),
                                       device=device, dtype=torch.float)*self.dt
        self.bufferIndex = 0
        
        times = np.arange(0, time, self.dt)
        
        self.activity = torch.tensor(np.random.rand(1, 1, self.numX, self.numY)*0.1, device=device,
                                                 dtype=torch.float)
        self.activationHistory.fill_(0)
        self.activationHistory *= self.envelope
        
        trajectory, turns = buildTrajectory(len(times),
                                            speed*self.dt,
                                            width=self.envSize,
                                            wrap=wrap,
                                            directionStability=stab,
                                            circular=circular)

        if oneD:
              trajectory[:, 1] = 0.
        velocity = np.diff(trajectory, axis=0)/self.dt
        
        if wrap:
            trajectory = np.mod(trajectory, 1)
            
        trajectory = torch.tensor(trajectory, device=device, dtype=torch.float)
        velocity = torch.tensor(velocity, device=device, dtype=torch.float)
        turns = torch.tensor(turns, device=device, dtype=torch.float)
        speed = torch.norm(velocity, 2, dim=-1)
        distances = torch.zeros((self.numPlaces, 2), device=device, dtype=torch.float)
        
        turnScaling = torch.max(turns/torch.mean(turns), self.zero + 1.)        
        speedScaling = torch.min(speed/torch.mean(speed), self.zero + 1.)
        
        for i, t in enumerate(times[:-1]):
            pos = trajectory[i, :]
            turn = turnScaling[i]
            s = speedScaling[i]
            vel = velocity[i]
            if wrap:
                distances[:,0] = torch.min(torch.abs(self.places[:,0] - pos[0]), 1 - torch.abs(self.places[:,0] - pos[0]))
                distances[:,1] = torch.min(torch.abs(self.places[:,1] - pos[1]), 1 - torch.abs(self.places[:,1] - pos[1]))
            else:
                distances[:,0] = torch.abs(self.places[:,0] - pos[0])
                distances[:,1] = torch.abs(self.places[:,1] - pos[1])
      
            if oneD:
                distances[:,1] = 0.
            torch.exp(-1.*torch.norm(distances, 2, dim=-1)/(2*(self.sigmaLoc)), out=self.placeActivity)
            self.placeActivity *= s
            self.placeHistory = self.alpha*self.placeActivity +\
                                     (1. - self.alpha)*self.placeHistory
            self.step(vel, speed=s, turn=turn)
            if t > learnStart:
                if self.learningRateE > 0:
                    self.stdpUpdate(i, vel, places=False)
                self.bcmPlaceUpdate()
            self.placeWeights = torch.max(self.placeWeights, self.zero)
            self.placeWeights = torch.min(self.placeWeights, self.zero + self.placeMax)
#           self.placeWeights *= self.placeMean/torch.mean(self.placeWeights, 0, keepdim=True)
            inMean = torch.mean(self.placeWeights.view(self.numX*self.numY, self.numPlaces), -1)
            weightedWeights = self.envelope.view(self.numX, self.numY, 1)*self.placeWeights/torch.mean(self.envelope)
            outMean = torch.mean(weightedWeights.view(self.numX*self.numY, self.numPlaces), 0)
            productMean = torch.ger(inMean, outMean).view(self.numX, self.numY, self.numPlaces)
            self.placeWeights *= self.placeMean/productMean
            
            for k, weights in self.excitatoryWeights.items():
                weights = torch.max(weights, self.zero)
                weights = torch.min(weights, self.zero + .5)
                self.excitatoryWeights[k] = self.excitationMask*.25*weights/torch.mean(weights, -2, keepdim=True)
                    
            if localNormalization:
                allWeights = torch.stack([weights for k, weights in self.excitatoryWeights.items()], dim = -1)
                average = torch.mean(allWeights, dim=-1, keepdim=False)
                for k, weights in self.excitatoryWeights.items():
                    self.excitatoryWeights[k] = (weights + (0.25 - average))*self.excitationMask
                    
            if i % plotInterval == 0:
                if plotting:
                    ax1.scatter(self.places[:, 1].cpu().numpy(),
                        self.places[:, 0].cpu().numpy(),
                        c = self.placeActivity.cpu().numpy(),
                        cmap = plt.get_cmap("coolwarm"))
                    mat = self.activity.view((self.numX, self.numY)).cpu().numpy()
                    ax2.matshow(mat)
                    cb1.set_clim(vmin=np.min(mat),vmax=np.max(mat))
                    cb1.draw_all()

                    mat = self.placeWeights[self.numX//2, self.numY//2, :].cpu().numpy()
                    im = ax4.scatter(self.places[:, 1].cpu().numpy(),
                                self.places[:, 0].cpu().numpy(),
                                c = mat,
                                cmap = plt.get_cmap("coolwarm"))
                    cb3.set_clim(vmin=np.min(mat),vmax=np.max(mat))
                    cb3.draw_all()

                    
                    mat = self.activationHistory.view((self.numX, self.numY)).cpu().numpy()
                    cb2.set_clim(vmin=np.min(mat),vmax=np.max(mat))
                    cb2.draw_all()

                    ax3.matshow(mat)
                    ax1.set_title("Time {}, position ({}, {})".format(t, pos[0], pos[1]))
                    fig.canvas.draw()
                
                
    def bcmPlaceUpdate(self):
        update = self.dt*self.learningRate*(torch.ger(self.activity.view(self.numX*self.numY),
                                                    self.placeActivity) -\
                                               torch.ger(self.activationHistory.view(self.numX*self.numY),
                                                    self.placeHistory)).view(1, 1, self.numX, self.numY, self.numPlaces)
        update = torch.transpose(update, 0, -1)
        update = torch.squeeze(update, dim=-1)
        update = conv2d(update, self.smoothingKernel, padding=self.smoothingWindow)
        update = torch.unsqueeze(update, -1)
        update /= torch.mean(self.activity)
        self.placeWeights += torch.transpose(update, 0, -1).view(self.numX, self.numY, self.numPlaces)
                                      
                
    def stdpUpdate(self,
                   time,
                   vel,
                   clearBuffer=False,
                   covarianceCorrection=True,
                   places=False):
        if self.bufferIndex < self.activityBuffer.shape[0]:
            self.activityBuffer[self.bufferIndex].copy_(self.instantaneous.view(self.numX*self.numY,))
            if places:
                self.placeBuffer[self.bufferIndex].copy_(self.placeActivity)
            self.velBuffer[self.bufferIndex].copy_(vel)
            self.bufferIndex += 1
            
        else:
            for t in range(self.stdpWindow):
                i = (self.bufferIndex - t) % self.stdpWindow
                if covarianceCorrection:
                    correction1 = torch.mean(self.activity)
                    correction2 = torch.mean(self.activityBuffer[i])
                else:
                    correction1 = 0
                    correction2 = 0
                if places:
                    self.placeWeights += torch.ger(self.activity.view(self.numX*self.numY) - correction1, self.placeBuffer[i]* \
                                            self.stdpValues[t]).view(self.numX, self.numY, self.numPlaces)*self.learningRate
                    self.placeWeights -= (torch.ger(self.activityBuffer[i] - correction2, self.placeActivity) *\
                                            self.stdpValues[t]).view(self.numX, self.numY, self.numPlaces) *\
                                            self.negativeLearnFactorP*self.learningRate
                
                for k, weights in self.excitatoryWeights.items():
                    dForward = torch.max(torch.dot(self.directions[k],
                                                   self.velBuffer[i])/torch.norm(self.velBuffer[i]), self.zero)
                    dBackward = torch.max(torch.dot(self.directions[k],
                                                    vel)/torch.norm(vel), self.zero)
                    
                    
                    padding = tuple((k//2 for k in self.kernel))
                    stride = (1, 1)
                    unfoldedActivity = unfold(self.instantaneous, self.kernel, 1, padding, stride)
                    weights -= unfoldedActivity*\
                                self.stdpValues[t]*\
                                self.negativeLearnFactorE*\
                                dBackward*\
                                (self.activityBuffer[i].view(self.numX*self.numY)-correction2)*self.learningRateE
                    
                    
                    unfoldedActivity = unfold(self.activityBuffer[i].view(1, 1, self.numX, self.numY), self.kernel, 1, padding, stride)
                    weights += unfoldedActivity*\
                                self.stdpValues[t]*\
                                dForward*\
                                (self.instantaneous.view(self.numX*self.numY)-correction1)*self.learningRateE    
                        
                        
            self.bufferIndex += 1
            self.activityBuffer[self.bufferIndex % self.stdpWindow].copy_(self.activity.view(self.numX*self.numY,))
            self.placeBuffer[self.bufferIndex % self.stdpWindow].copy_(self.placeActivity)
            self.velBuffer[self.bufferIndex % self.stdpWindow].copy_(vel)
            
        if clearBuffer:
            pass
        

    def inhibitoryUpdate(self):
        padding = tuple((k//2 for k in self.inhibitoryKernel))
        stride = (1, 1)
        unfoldedActivity = unfold((self.instantaneous - self.longHistory).view(1, 1, self.numX, self.numY),
                                  self.inhibitoryKernel,
                                  1,
                                  padding,
                                  stride)
        update = (unfoldedActivity)*((self.instantaneous
                                      - self.longHistory)/ \
                                     (self.longHistory**2 + 0.0001)).view(self.numX*self.numY)
        update = update*self.learningRate*self.dt
        self.inhibitoryWeights += update
        self.inhibitoryWeights = torch.max(self.inhibitoryWeights, self.zero - 20.)
        self.inhibitoryWeights = torch.min(self.inhibitoryWeights, self.zero)
        return(update)

In [33]:
plt.rcParams['figure.figsize'] = [5, 5]

GCN = GCN2D(256,
            64,
            30,
            .75,
            450.,
            3,
            wideningFactor=2,
            excitationCenterBlock=-1,
            globalTonic=.1,
            stdpWindow=2,
            dt=0.01,
            placeMax=1.,
            placeMean=.25,
            boostEffect=1.,
            boostDecay=.5,
            numPlaces=1000,
            circularPlaces=True,
            learningRate=.25/4000,
            initialWeightFactor=1.2,
            initialExcitatoryFactor=0.05,
            boostGradientX=20,
            decayGradientX=5.,
            tonicGradientX=3.,
            inhibitionGradientX=1.,
            weightDecay=5000,
            decayConstant=0.03,
            negativeLearnFactorP=.9,
            negativeLearnFactorE=1.2,
            learningRateE=0,
            envelopeWidth=32,
            envelopeFactor=3.5,
            sigmaLoc=(.15)**2,
            hardwireE=False,
            hardwireEStrength=1.,
            hardwireERange=.05,
            hardwireEOffset=2.,
            excitationGradientX=10.,
            gradientType=.7,
            envSize=.5,
            weightNoise=2.)

GCN.randomLesions(3, 15, 5)

# plt.matshow(GCN.filter[0,0])
# plt.show()

plt.matshow(GCN.inhibitoryWeights[:, :, -1].view(61, 61).detach())
plt.show()


# plt.matshow(GCN.excitatoryWeights["s"][:, :, 8].view(25, 25).detach())
# plt.show()


# plt.matshow(GCN.excitatoryWeights["e"][:, :, 8].view(GCN.excitationWindow*2+1, GCN.excitationWindow*2+1).detach())
# plt.show()

# plt.matshow(GCN.excitationMask[:, :, 0].view(GCN.excitationWindow*2+1, GCN.excitationWindow*2+1).detach())
# plt.show()

plt.matshow(GCN.excitatoryWeights["w"][:, :, -1].view(7, 7).detach())
plt.show()

plt.matshow(GCN.envelope)
plt.show()


# plt.matshow(GCN.globalTonic)
# plt.show()

# plt.figure()
# plt.scatter(GCN.places[:, 0].cpu().numpy(),
#              GCN.places[:, 1].cpu().numpy())
# plt.show()



In [40]:
plt.matshow(GCN.activationHistory[0, 0])


Out[40]:
<matplotlib.image.AxesImage at 0x2d10d77e358>

In [34]:
plt.rcParams['figure.figsize'] = [5, 5]
results = GCN.simulate(50, logFreq=1, startFrom = 0, vel = (0, 0))
plt.matshow(results[-2])
plt.show()


At 0.0
At 0.01
At 0.02
At 0.03
At 0.04
At 0.05
At 0.06
At 0.07
At 0.08
At 0.09
At 0.1
At 0.11
At 0.12
At 0.13
At 0.14
At 0.15
At 0.16
At 0.17
At 0.18
At 0.19
At 0.2
At 0.21
At 0.22
At 0.23
At 0.24
At 0.25
At 0.26
At 0.27
At 0.28
At 0.29
At 0.3
At 0.31
At 0.32
At 0.33
At 0.34
At 0.35000000000000003
At 0.36
At 0.37
At 0.38
At 0.39
At 0.4
At 0.41000000000000003
At 0.42
At 0.43
At 0.44
At 0.45
At 0.46
At 0.47000000000000003
At 0.48
At 0.49
At 0.5
At 0.51
At 0.52
At 0.53
At 0.54
At 0.55
At 0.56
At 0.5700000000000001
At 0.58
At 0.59
At 0.6
At 0.61
At 0.62
At 0.63
At 0.64
At 0.65
At 0.66
At 0.67
At 0.68
At 0.6900000000000001
At 0.7000000000000001
At 0.71
At 0.72
At 0.73
At 0.74
At 0.75
At 0.76
At 0.77
At 0.78
At 0.79
At 0.8
At 0.81
At 0.8200000000000001
At 0.8300000000000001
At 0.84
At 0.85
At 0.86
At 0.87
At 0.88
At 0.89
At 0.9
At 0.91
At 0.92
At 0.93
At 0.9400000000000001
At 0.9500000000000001
At 0.96
At 0.97
At 0.98
At 0.99
At 1.0
At 1.01
At 1.02
At 1.03
At 1.04
At 1.05
At 1.06
At 1.07
At 1.08
At 1.09
At 1.1
At 1.11
At 1.12
At 1.1300000000000001
At 1.1400000000000001
At 1.1500000000000001
At 1.16
At 1.17
At 1.18
At 1.19
At 1.2
At 1.21
At 1.22
At 1.23
At 1.24
At 1.25
At 1.26
At 1.27
At 1.28
At 1.29
At 1.3
At 1.31
At 1.32
At 1.33
At 1.34
At 1.35
At 1.36
At 1.37
At 1.3800000000000001
At 1.3900000000000001
At 1.4000000000000001
At 1.41
At 1.42
At 1.43
At 1.44
At 1.45
At 1.46
At 1.47
At 1.48
At 1.49
At 1.5
At 1.51
At 1.52
At 1.53
At 1.54
At 1.55
At 1.56
At 1.57
At 1.58
At 1.59
At 1.6
At 1.61
At 1.62
At 1.6300000000000001
At 1.6400000000000001
At 1.6500000000000001
At 1.6600000000000001
At 1.67
At 1.68
At 1.69
At 1.7
At 1.71
At 1.72
At 1.73
At 1.74
At 1.75
At 1.76
At 1.77
At 1.78
At 1.79
At 1.8
At 1.81
At 1.82
At 1.83
At 1.84
At 1.85
At 1.86
At 1.87
At 1.8800000000000001
At 1.8900000000000001
At 1.9000000000000001
At 1.9100000000000001
At 1.92
At 1.93
At 1.94
At 1.95
At 1.96
At 1.97
At 1.98
At 1.99
At 2.0
At 2.0100000000000002
At 2.02
At 2.0300000000000002
At 2.04
At 2.05
At 2.06
At 2.07
At 2.08
At 2.09
At 2.1
At 2.11
At 2.12
At 2.13
At 2.14
At 2.15
At 2.16
At 2.17
At 2.18
At 2.19
At 2.2
At 2.21
At 2.22
At 2.23
At 2.24
At 2.25
At 2.2600000000000002
At 2.27
At 2.2800000000000002
At 2.29
At 2.3000000000000003
At 2.31
At 2.32
At 2.33
At 2.34
At 2.35
At 2.36
At 2.37
At 2.38
At 2.39
At 2.4
At 2.41
At 2.42
At 2.43
At 2.44
At 2.45
At 2.46
At 2.47
At 2.48
At 2.49
At 2.5
At 2.5100000000000002
At 2.52
At 2.5300000000000002
At 2.54
At 2.5500000000000003
At 2.56
At 2.57
At 2.58
At 2.59
At 2.6
At 2.61
At 2.62
At 2.63
At 2.64
At 2.65
At 2.66
At 2.67
At 2.68
At 2.69
At 2.7
At 2.71
At 2.72
At 2.73
At 2.74
At 2.75
At 2.7600000000000002
At 2.77
At 2.7800000000000002
At 2.79
At 2.8000000000000003
At 2.81
At 2.82
At 2.83
At 2.84
At 2.85
At 2.86
At 2.87
At 2.88
At 2.89
At 2.9
At 2.91
At 2.92
At 2.93
At 2.94
At 2.95
At 2.96
At 2.97
At 2.98
At 2.99
At 3.0
At 3.0100000000000002
At 3.02
At 3.0300000000000002
At 3.04
At 3.0500000000000003
At 3.06
At 3.0700000000000003
At 3.08
At 3.09
At 3.1
At 3.11
At 3.12
At 3.13
At 3.14
At 3.15
At 3.16
At 3.17
At 3.18
At 3.19
At 3.2
At 3.21
At 3.22
At 3.23
At 3.24
At 3.25
At 3.2600000000000002
At 3.27
At 3.2800000000000002
At 3.29
At 3.3000000000000003
At 3.31
At 3.3200000000000003
At 3.33
At 3.34
At 3.35
At 3.36
At 3.37
At 3.38
At 3.39
At 3.4
At 3.41
At 3.42
At 3.43
At 3.44
At 3.45
At 3.46
At 3.47
At 3.48
At 3.49
At 3.5
At 3.5100000000000002
At 3.52
At 3.5300000000000002
At 3.54
At 3.5500000000000003
At 3.56
At 3.5700000000000003
At 3.58
At 3.59
At 3.6
At 3.61
At 3.62
At 3.63
At 3.64
At 3.65
At 3.66
At 3.67
At 3.68
At 3.69
At 3.7
At 3.71
At 3.72
At 3.73
At 3.74
At 3.75
At 3.7600000000000002
At 3.77
At 3.7800000000000002
At 3.79
At 3.8000000000000003
At 3.81
At 3.8200000000000003
At 3.83
At 3.84
At 3.85
At 3.86
At 3.87
At 3.88
At 3.89
At 3.9
At 3.91
At 3.92
At 3.93
At 3.94
At 3.95
At 3.96
At 3.97
At 3.98
At 3.99
At 4.0
At 4.01
At 4.0200000000000005
At 4.03
At 4.04
At 4.05
At 4.0600000000000005
At 4.07
At 4.08
At 4.09
At 4.1
At 4.11
At 4.12
At 4.13
At 4.14
At 4.15
At 4.16
At 4.17
At 4.18
At 4.19
At 4.2
At 4.21
At 4.22
At 4.23
At 4.24
At 4.25
At 4.26
At 4.2700000000000005
At 4.28
At 4.29
At 4.3
At 4.3100000000000005
At 4.32
At 4.33
At 4.34
At 4.3500000000000005
At 4.36
At 4.37
At 4.38
At 4.39
At 4.4
At 4.41
At 4.42
At 4.43
At 4.44
At 4.45
At 4.46
At 4.47
At 4.48
At 4.49
At 4.5
At 4.51
At 4.5200000000000005
At 4.53
At 4.54
At 4.55
At 4.5600000000000005
At 4.57
At 4.58
At 4.59
At 4.6000000000000005
At 4.61
At 4.62
At 4.63
At 4.64
At 4.65
At 4.66
At 4.67
At 4.68
At 4.69
At 4.7
At 4.71
At 4.72
At 4.73
At 4.74
At 4.75
At 4.76
At 4.7700000000000005
At 4.78
At 4.79
At 4.8
At 4.8100000000000005
At 4.82
At 4.83
At 4.84
At 4.8500000000000005
At 4.86
At 4.87
At 4.88
At 4.89
At 4.9
At 4.91
At 4.92
At 4.93
At 4.94
At 4.95
At 4.96
At 4.97
At 4.98
At 4.99
At 5.0
At 5.01
At 5.0200000000000005
At 5.03
At 5.04
At 5.05
At 5.0600000000000005
At 5.07
At 5.08
At 5.09
At 5.1000000000000005
At 5.11
At 5.12
At 5.13
At 5.14
At 5.15
At 5.16
At 5.17
At 5.18
At 5.19
At 5.2
At 5.21
At 5.22
At 5.23
At 5.24
At 5.25
At 5.26
At 5.2700000000000005
At 5.28
At 5.29
At 5.3
At 5.3100000000000005
At 5.32
At 5.33
At 5.34
At 5.3500000000000005
At 5.36
At 5.37
At 5.38
At 5.39
At 5.4
At 5.41
At 5.42
At 5.43
At 5.44
At 5.45
At 5.46
At 5.47
At 5.48
At 5.49
At 5.5
At 5.51
At 5.5200000000000005
At 5.53
At 5.54
At 5.55
At 5.5600000000000005
At 5.57
At 5.58
At 5.59
At 5.6000000000000005
At 5.61
At 5.62
At 5.63
At 5.64
At 5.65
At 5.66
At 5.67
At 5.68
At 5.69
At 5.7
At 5.71
At 5.72
At 5.73
At 5.74
At 5.75
At 5.76
At 5.7700000000000005
At 5.78
At 5.79
At 5.8
At 5.8100000000000005
At 5.82
At 5.83
At 5.84
At 5.8500000000000005
At 5.86
At 5.87
At 5.88
At 5.89
At 5.9
At 5.91
At 5.92
At 5.93
At 5.94
At 5.95
At 5.96
At 5.97
At 5.98
At 5.99
At 6.0
At 6.01
At 6.0200000000000005
At 6.03
At 6.04
At 6.05
At 6.0600000000000005
At 6.07
At 6.08
At 6.09
At 6.1000000000000005
At 6.11
At 6.12
At 6.13
At 6.140000000000001
At 6.15
At 6.16
At 6.17
At 6.18
At 6.19
At 6.2
At 6.21
At 6.22
At 6.23
At 6.24
At 6.25
At 6.26
At 6.2700000000000005
At 6.28
At 6.29
At 6.3
At 6.3100000000000005
At 6.32
At 6.33
At 6.34
At 6.3500000000000005
At 6.36
At 6.37
At 6.38
At 6.390000000000001
At 6.4
At 6.41
At 6.42
At 6.43
At 6.44
At 6.45
At 6.46
At 6.47
At 6.48
At 6.49
At 6.5
At 6.51
At 6.5200000000000005
At 6.53
At 6.54
At 6.55
At 6.5600000000000005
At 6.57
At 6.58
At 6.59
At 6.6000000000000005
At 6.61
At 6.62
At 6.63
At 6.640000000000001
At 6.65
At 6.66
At 6.67
At 6.68
At 6.69
At 6.7
At 6.71
At 6.72
At 6.73
At 6.74
At 6.75
At 6.76
At 6.7700000000000005
At 6.78
At 6.79
At 6.8
At 6.8100000000000005
At 6.82
At 6.83
At 6.84
At 6.8500000000000005
At 6.86
At 6.87
At 6.88
At 6.890000000000001
At 6.9
At 6.91
At 6.92
At 6.93
At 6.94
At 6.95
At 6.96
At 6.97
At 6.98
At 6.99
At 7.0
At 7.01
At 7.0200000000000005
At 7.03
At 7.04
At 7.05
At 7.0600000000000005
At 7.07
At 7.08
At 7.09
At 7.1000000000000005
At 7.11
At 7.12
At 7.13
At 7.140000000000001
At 7.15
At 7.16
At 7.17
At 7.18
At 7.19
At 7.2
At 7.21
At 7.22
At 7.23
At 7.24
At 7.25
At 7.26
At 7.2700000000000005
At 7.28
At 7.29
At 7.3
At 7.3100000000000005
At 7.32
At 7.33
At 7.34
At 7.3500000000000005
At 7.36
At 7.37
At 7.38
At 7.390000000000001
At 7.4
At 7.41
At 7.42
At 7.43
At 7.44
At 7.45
At 7.46
At 7.47
At 7.48
At 7.49
At 7.5
At 7.51
At 7.5200000000000005
At 7.53
At 7.54
At 7.55
At 7.5600000000000005
At 7.57
At 7.58
At 7.59
At 7.6000000000000005
At 7.61
At 7.62
At 7.63
At 7.640000000000001
At 7.65
At 7.66
At 7.67
At 7.68
At 7.69
At 7.7
At 7.71
At 7.72
At 7.73
At 7.74
At 7.75
At 7.76
At 7.7700000000000005
At 7.78
At 7.79
At 7.8
At 7.8100000000000005
At 7.82
At 7.83
At 7.84
At 7.8500000000000005
At 7.86
At 7.87
At 7.88
At 7.890000000000001
At 7.9
At 7.91
At 7.92
At 7.930000000000001
At 7.94
At 7.95
At 7.96
At 7.97
At 7.98
At 7.99
At 8.0
At 8.01
At 8.02
At 8.03
At 8.040000000000001
At 8.05
At 8.06
At 8.07
At 8.08
At 8.09
At 8.1
At 8.11
At 8.120000000000001
At 8.13
At 8.14
At 8.15
At 8.16
At 8.17
At 8.18
At 8.19
At 8.2
At 8.21
At 8.22
At 8.23
At 8.24
At 8.25
At 8.26
At 8.27
At 8.28
At 8.290000000000001
At 8.3
At 8.31
At 8.32
At 8.33
At 8.34
At 8.35
At 8.36
At 8.370000000000001
At 8.38
At 8.39
At 8.4
At 8.41
At 8.42
At 8.43
At 8.44
At 8.45
At 8.46
At 8.47
At 8.48
At 8.49
At 8.5
At 8.51
At 8.52
At 8.53
At 8.540000000000001
At 8.55
At 8.56
At 8.57
At 8.58
At 8.59
At 8.6
At 8.61
At 8.620000000000001
At 8.63
At 8.64
At 8.65
At 8.66
At 8.67
At 8.68
At 8.69
At 8.700000000000001
At 8.71
At 8.72
At 8.73
At 8.74
At 8.75
At 8.76
At 8.77
At 8.78
At 8.790000000000001
At 8.8
At 8.81
At 8.82
At 8.83
At 8.84
At 8.85
At 8.86
At 8.870000000000001
At 8.88
At 8.89
At 8.9
At 8.91
At 8.92
At 8.93
At 8.94
At 8.950000000000001
At 8.96
At 8.97
At 8.98
At 8.99
At 9.0
At 9.01
At 9.02
At 9.03
At 9.040000000000001
At 9.05
At 9.06
At 9.07
At 9.08
At 9.09
At 9.1
At 9.11
At 9.120000000000001
At 9.13
At 9.14
At 9.15
At 9.16
At 9.17
At 9.18
At 9.19
At 9.200000000000001
At 9.21
At 9.22
At 9.23
At 9.24
At 9.25
At 9.26
At 9.27
At 9.28
At 9.290000000000001
At 9.3
At 9.31
At 9.32
At 9.33
At 9.34
At 9.35
At 9.36
At 9.370000000000001
At 9.38
At 9.39
At 9.4
At 9.41
At 9.42
At 9.43
At 9.44
At 9.450000000000001
At 9.46
At 9.47
At 9.48
At 9.49
At 9.5
At 9.51
At 9.52
At 9.53
At 9.540000000000001
At 9.55
At 9.56
At 9.57
At 9.58
At 9.59
At 9.6
At 9.61
At 9.620000000000001
At 9.63
At 9.64
At 9.65
At 9.66
At 9.67
At 9.68
At 9.69
At 9.700000000000001
At 9.71
At 9.72
At 9.73
At 9.74
At 9.75
At 9.76
At 9.77
At 9.78
At 9.790000000000001
At 9.8
At 9.81
At 9.82
At 9.83
At 9.84
At 9.85
At 9.86
At 9.870000000000001
At 9.88
At 9.89
At 9.9
At 9.91
At 9.92
At 9.93
At 9.94
At 9.950000000000001
At 9.96
At 9.97
At 9.98
At 9.99
At 10.0
At 10.01
At 10.02
At 10.03
At 10.040000000000001
At 10.05
At 10.06
At 10.07
At 10.08
At 10.09
At 10.1
At 10.11
At 10.120000000000001
At 10.13
At 10.14
At 10.15
At 10.16
At 10.17
At 10.18
At 10.19
At 10.200000000000001
At 10.21
At 10.22
At 10.23
At 10.24
At 10.25
At 10.26
At 10.27
At 10.28
At 10.290000000000001
At 10.3
At 10.31
At 10.32
At 10.33
At 10.34
At 10.35
At 10.36
At 10.370000000000001
At 10.38
At 10.39
At 10.4
At 10.41
At 10.42
At 10.43
At 10.44
At 10.450000000000001
At 10.46
At 10.47
At 10.48
At 10.49
At 10.5
At 10.51
At 10.52
At 10.53
At 10.540000000000001
At 10.55
At 10.56
At 10.57
At 10.58
At 10.59
At 10.6
At 10.61
At 10.620000000000001
At 10.63
At 10.64
At 10.65
At 10.66
At 10.67
At 10.68
At 10.69
At 10.700000000000001
At 10.71
At 10.72
At 10.73
At 10.74
At 10.75
At 10.76
At 10.77
At 10.78
At 10.790000000000001
At 10.8
At 10.81
At 10.82
At 10.83
At 10.84
At 10.85
At 10.86
At 10.870000000000001
At 10.88
At 10.89
At 10.9
At 10.91
At 10.92
At 10.93
At 10.94
At 10.950000000000001
At 10.96
At 10.97
At 10.98
At 10.99
At 11.0
At 11.01
At 11.02
At 11.03
At 11.040000000000001
At 11.05
At 11.06
At 11.07
At 11.08
At 11.09
At 11.1
At 11.11
At 11.120000000000001
At 11.13
At 11.14
At 11.15
At 11.16
At 11.17
At 11.18
At 11.19
At 11.200000000000001
At 11.21
At 11.22
At 11.23
At 11.24
At 11.25
At 11.26
At 11.27
At 11.28
At 11.290000000000001
At 11.3
At 11.31
At 11.32
At 11.33
At 11.34
At 11.35
At 11.36
At 11.370000000000001
At 11.38
At 11.39
At 11.4
At 11.41
At 11.42
At 11.43
At 11.44
At 11.450000000000001
At 11.46
At 11.47
At 11.48
At 11.49
At 11.5
At 11.51
At 11.52
At 11.53
At 11.540000000000001
At 11.55
At 11.56
At 11.57
At 11.58
At 11.59
At 11.6
At 11.61
At 11.620000000000001
At 11.63
At 11.64
At 11.65
At 11.66
At 11.67
At 11.68
At 11.69
At 11.700000000000001
At 11.71
At 11.72
At 11.73
At 11.74
At 11.75
At 11.76
At 11.77
At 11.78
At 11.790000000000001
At 11.8
At 11.81
At 11.82
At 11.83
At 11.84
At 11.85
At 11.86
At 11.870000000000001
At 11.88
At 11.89
At 11.9
At 11.91
At 11.92
At 11.93
At 11.94
At 11.950000000000001
At 11.96
At 11.97
At 11.98
At 11.99
At 12.0
At 12.01
At 12.02
At 12.030000000000001
At 12.040000000000001
At 12.05
At 12.06
At 12.07
At 12.08
At 12.09
At 12.1
At 12.11
At 12.120000000000001
At 12.13
At 12.14
At 12.15
At 12.16
At 12.17
At 12.18
At 12.19
At 12.200000000000001
At 12.21
At 12.22
At 12.23
At 12.24
At 12.25
At 12.26
At 12.27
At 12.280000000000001
At 12.290000000000001
At 12.3
At 12.31
At 12.32
At 12.33
At 12.34
At 12.35
At 12.36
At 12.370000000000001
At 12.38
At 12.39
At 12.4
At 12.41
At 12.42
At 12.43
At 12.44
At 12.450000000000001
At 12.46
At 12.47
At 12.48
At 12.49
At 12.5
At 12.51
At 12.52
At 12.530000000000001
At 12.540000000000001
At 12.55
At 12.56
At 12.57
At 12.58
At 12.59
At 12.6
At 12.61
At 12.620000000000001
At 12.63
At 12.64
At 12.65
At 12.66
At 12.67
At 12.68
At 12.69
At 12.700000000000001
At 12.71
At 12.72
At 12.73
At 12.74
At 12.75
At 12.76
At 12.77
At 12.780000000000001
At 12.790000000000001
At 12.8
At 12.81
At 12.82
At 12.83
At 12.84
At 12.85
At 12.86
At 12.870000000000001
At 12.88
At 12.89
At 12.9
At 12.91
At 12.92
At 12.93
At 12.94
At 12.950000000000001
At 12.96
At 12.97
At 12.98
At 12.99
At 13.0
At 13.01
At 13.02
At 13.030000000000001
At 13.040000000000001
At 13.05
At 13.06
At 13.07
At 13.08
At 13.09
At 13.1
At 13.11
At 13.120000000000001
At 13.13
At 13.14
At 13.15
At 13.16
At 13.17
At 13.18
At 13.19
At 13.200000000000001
At 13.21
At 13.22
At 13.23
At 13.24
At 13.25
At 13.26
At 13.27
At 13.280000000000001
At 13.290000000000001
At 13.3
At 13.31
At 13.32
At 13.33
At 13.34
At 13.35
At 13.36
At 13.370000000000001
At 13.38
At 13.39
At 13.4
At 13.41
At 13.42
At 13.43
At 13.44
At 13.450000000000001
At 13.46
At 13.47
At 13.48
At 13.49
At 13.5
At 13.51
At 13.52
At 13.530000000000001
At 13.540000000000001
At 13.55
At 13.56
At 13.57
At 13.58
At 13.59
At 13.6
At 13.61
At 13.620000000000001
At 13.63
At 13.64
At 13.65
At 13.66
At 13.67
At 13.68
At 13.69
At 13.700000000000001
At 13.71
At 13.72
At 13.73
At 13.74
At 13.75
At 13.76
At 13.77
At 13.780000000000001
At 13.790000000000001
At 13.8
At 13.81
At 13.82
At 13.83
At 13.84
At 13.85
At 13.86
At 13.870000000000001
At 13.88
At 13.89
At 13.9
At 13.91
At 13.92
At 13.93
At 13.94
At 13.950000000000001
At 13.96
At 13.97
At 13.98
At 13.99
At 14.0
At 14.01
At 14.02
At 14.030000000000001
At 14.040000000000001
At 14.05
At 14.06
At 14.07
At 14.08
At 14.09
At 14.1
At 14.11
At 14.120000000000001
At 14.13
At 14.14
At 14.15
At 14.16
At 14.17
At 14.18
At 14.19
At 14.200000000000001
At 14.21
At 14.22
At 14.23
At 14.24
At 14.25
At 14.26
At 14.27
At 14.280000000000001
At 14.290000000000001
At 14.3
At 14.31
At 14.32
At 14.33
At 14.34
At 14.35
At 14.36
At 14.370000000000001
At 14.38
At 14.39
At 14.4
At 14.41
At 14.42
At 14.43
At 14.44
At 14.450000000000001
At 14.46
At 14.47
At 14.48
At 14.49
At 14.5
At 14.51
At 14.52
At 14.530000000000001
At 14.540000000000001
At 14.55
At 14.56
At 14.57
At 14.58
At 14.59
At 14.6
At 14.61
At 14.620000000000001
At 14.63
At 14.64
At 14.65
At 14.66
At 14.67
At 14.68
At 14.69
At 14.700000000000001
At 14.71
At 14.72
At 14.73
At 14.74
At 14.75
At 14.76
At 14.77
At 14.780000000000001
At 14.790000000000001
At 14.8
At 14.81
At 14.82
At 14.83
At 14.84
At 14.85
At 14.86
At 14.870000000000001
At 14.88
At 14.89
At 14.9
At 14.91
At 14.92
At 14.93
At 14.94
At 14.950000000000001
At 14.96
At 14.97
At 14.98
At 14.99
At 15.0
At 15.01
At 15.02
At 15.030000000000001
At 15.040000000000001
At 15.05
At 15.06
At 15.07
At 15.08
At 15.09
At 15.1
At 15.11
At 15.120000000000001
At 15.13
At 15.14
At 15.15
At 15.16
At 15.17
At 15.18
At 15.19
At 15.200000000000001
At 15.21
At 15.22
At 15.23
At 15.24
At 15.25
At 15.26
At 15.27
At 15.280000000000001
At 15.290000000000001
At 15.3
At 15.31
At 15.32
At 15.33
At 15.34
At 15.35
At 15.36
At 15.370000000000001
At 15.38
At 15.39
At 15.4
At 15.41
At 15.42
At 15.43
At 15.44
At 15.450000000000001
At 15.46
At 15.47
At 15.48
At 15.49
At 15.5
At 15.51
At 15.52
At 15.530000000000001
At 15.540000000000001
At 15.55
At 15.56
At 15.57
At 15.58
At 15.59
At 15.6
At 15.610000000000001
At 15.620000000000001
At 15.63
At 15.64
At 15.65
At 15.66
At 15.67
At 15.68
At 15.69
At 15.700000000000001
At 15.71
At 15.72
At 15.73
At 15.74
At 15.75
At 15.76
At 15.77
At 15.780000000000001
At 15.790000000000001
At 15.8
At 15.81
At 15.82
At 15.83
At 15.84
At 15.85
At 15.860000000000001
At 15.870000000000001
At 15.88
At 15.89
At 15.9
At 15.91
At 15.92
At 15.93
At 15.94
At 15.950000000000001
At 15.96
At 15.97
At 15.98
At 15.99
At 16.0
At 16.01
At 16.02
At 16.03
At 16.04
At 16.05
At 16.06
At 16.07
At 16.080000000000002
At 16.09
At 16.1
At 16.11
At 16.12
At 16.13
At 16.14
At 16.15
At 16.16
At 16.17
At 16.18
At 16.19
At 16.2
At 16.21
At 16.22
At 16.23
At 16.240000000000002
At 16.25
At 16.26
At 16.27
At 16.28
At 16.29
At 16.3
At 16.31
At 16.32
At 16.330000000000002
At 16.34
At 16.35
At 16.36
At 16.37
At 16.38
At 16.39
At 16.4
At 16.41
At 16.42
At 16.43
At 16.44
At 16.45
At 16.46
At 16.47
At 16.48
At 16.490000000000002
At 16.5
At 16.51
At 16.52
At 16.53
At 16.54
At 16.55
At 16.56
At 16.57
At 16.580000000000002
At 16.59
At 16.6
At 16.61
At 16.62
At 16.63
At 16.64
At 16.65
At 16.66
At 16.67
At 16.68
At 16.69
At 16.7
At 16.71
At 16.72
At 16.73
At 16.740000000000002
At 16.75
At 16.76
At 16.77
At 16.78
At 16.79
At 16.8
At 16.81
At 16.82
At 16.830000000000002
At 16.84
At 16.85
At 16.86
At 16.87
At 16.88
At 16.89
At 16.9
At 16.91
At 16.92
At 16.93
At 16.94
At 16.95
At 16.96
At 16.97
At 16.98
At 16.990000000000002
At 17.0
At 17.01
At 17.02
At 17.03
At 17.04
At 17.05
At 17.06
At 17.07
At 17.080000000000002
At 17.09
At 17.1
At 17.11
At 17.12
At 17.13
At 17.14
At 17.150000000000002
At 17.16
At 17.17
At 17.18
At 17.19
At 17.2
At 17.21
At 17.22
At 17.23
At 17.240000000000002
At 17.25
At 17.26
At 17.27
At 17.28
At 17.29
At 17.3
At 17.31
At 17.32
At 17.330000000000002
At 17.34
At 17.35
At 17.36
At 17.37
At 17.38
At 17.39
At 17.400000000000002
At 17.41
At 17.42
At 17.43
At 17.44
At 17.45
At 17.46
At 17.47
At 17.48
At 17.490000000000002
At 17.5
At 17.51
At 17.52
At 17.53
At 17.54
At 17.55
At 17.56
At 17.57
At 17.580000000000002
At 17.59
At 17.6
At 17.61
At 17.62
At 17.63
At 17.64
At 17.650000000000002
At 17.66
At 17.67
At 17.68
At 17.69
At 17.7
At 17.71
At 17.72
At 17.73
At 17.740000000000002
At 17.75
At 17.76
At 17.77
At 17.78
At 17.79
At 17.8
At 17.81
At 17.82
At 17.830000000000002
At 17.84
At 17.85
At 17.86
At 17.87
At 17.88
At 17.89
At 17.900000000000002
At 17.91
At 17.92
At 17.93
At 17.94
At 17.95
At 17.96
At 17.97
At 17.98
At 17.990000000000002
At 18.0
At 18.01
At 18.02
At 18.03
At 18.04
At 18.05
At 18.06
At 18.07
At 18.080000000000002
At 18.09
At 18.1
At 18.11
At 18.12
At 18.13
At 18.14
At 18.150000000000002
At 18.16
At 18.17
At 18.18
At 18.19
At 18.2
At 18.21
At 18.22
At 18.23
At 18.240000000000002
At 18.25
At 18.26
At 18.27
At 18.28
At 18.29
At 18.3
At 18.31
At 18.32
At 18.330000000000002
At 18.34
At 18.35
At 18.36
At 18.37
At 18.38
At 18.39
At 18.400000000000002
At 18.41
At 18.42
At 18.43
At 18.44
At 18.45
At 18.46
At 18.47
At 18.48
At 18.490000000000002
At 18.5
At 18.51
At 18.52
At 18.53
At 18.54
At 18.55
At 18.56
At 18.57
At 18.580000000000002
At 18.59
At 18.6
At 18.61
At 18.62
At 18.63
At 18.64
At 18.650000000000002
At 18.66
At 18.67
At 18.68
At 18.69
At 18.7
At 18.71
At 18.72
At 18.73
At 18.740000000000002
At 18.75
At 18.76
At 18.77
At 18.78
At 18.79
At 18.8
At 18.81
At 18.82
At 18.830000000000002
At 18.84
At 18.85
At 18.86
At 18.87
At 18.88
At 18.89
At 18.900000000000002
At 18.91
At 18.92
At 18.93
At 18.94
At 18.95
At 18.96
At 18.97
At 18.98
At 18.990000000000002
At 19.0
At 19.01
At 19.02
At 19.03
At 19.04
At 19.05
At 19.06
At 19.07
At 19.080000000000002
At 19.09
At 19.1
At 19.11
At 19.12
At 19.13
At 19.14
At 19.150000000000002
At 19.16
At 19.17
At 19.18
At 19.19
At 19.2
At 19.21
At 19.22
At 19.23
At 19.240000000000002
At 19.25
At 19.26
At 19.27
At 19.28
At 19.29
At 19.3
At 19.31
At 19.32
At 19.330000000000002
At 19.34
At 19.35
At 19.36
At 19.37
At 19.38
At 19.39
At 19.400000000000002
At 19.41
At 19.42
At 19.43
At 19.44
At 19.45
At 19.46
At 19.47
At 19.48
At 19.490000000000002
At 19.5
At 19.51
At 19.52
At 19.53
At 19.54
At 19.55
At 19.56
At 19.57
At 19.580000000000002
At 19.59
At 19.6
At 19.61
At 19.62
At 19.63
At 19.64
At 19.650000000000002
At 19.66
At 19.67
At 19.68
At 19.69
At 19.7
At 19.71
At 19.72
At 19.73
At 19.740000000000002
At 19.75
At 19.76
At 19.77
At 19.78
At 19.79
At 19.8
At 19.81
At 19.82
At 19.830000000000002
At 19.84
At 19.85
At 19.86
At 19.87
At 19.88
At 19.89
At 19.900000000000002
At 19.91
At 19.92
At 19.93
At 19.94
At 19.95
At 19.96
At 19.97
At 19.98
At 19.990000000000002
At 20.0
At 20.01
At 20.02
At 20.03
At 20.04
At 20.05
At 20.06
At 20.07
At 20.080000000000002
At 20.09
At 20.1
At 20.11
At 20.12
At 20.13
At 20.14
At 20.150000000000002
At 20.16
At 20.17
At 20.18
At 20.19
At 20.2
At 20.21
At 20.22
At 20.23
At 20.240000000000002
At 20.25
At 20.26
At 20.27
At 20.28
At 20.29
At 20.3
At 20.31
At 20.32
At 20.330000000000002
At 20.34
At 20.35
At 20.36
At 20.37
At 20.38
At 20.39
At 20.400000000000002
At 20.41
At 20.42
At 20.43
At 20.44
At 20.45
At 20.46
At 20.47
At 20.48
At 20.490000000000002
At 20.5
At 20.51
At 20.52
At 20.53
At 20.54
At 20.55
At 20.56
At 20.57
At 20.580000000000002
At 20.59
At 20.6
At 20.61
At 20.62
At 20.63
At 20.64
At 20.650000000000002
At 20.66
At 20.67
At 20.68
At 20.69
At 20.7
At 20.71
At 20.72
At 20.73
At 20.740000000000002
At 20.75
At 20.76
At 20.77
At 20.78
At 20.79
At 20.8
At 20.81
At 20.82
At 20.830000000000002
At 20.84
At 20.85
At 20.86
At 20.87
At 20.88
At 20.89
At 20.900000000000002
At 20.91
At 20.92
At 20.93
At 20.94
At 20.95
At 20.96
At 20.97
At 20.98
At 20.990000000000002
At 21.0
At 21.01
At 21.02
At 21.03
At 21.04
At 21.05
At 21.06
At 21.07
At 21.080000000000002
At 21.09
At 21.1
At 21.11
At 21.12
At 21.13
At 21.14
At 21.150000000000002
At 21.16
At 21.17
At 21.18
At 21.19
At 21.2
At 21.21
At 21.22
At 21.23
At 21.240000000000002
At 21.25
At 21.26
At 21.27
At 21.28
At 21.29
At 21.3
At 21.31
At 21.32
At 21.330000000000002
At 21.34
At 21.35
At 21.36
At 21.37
At 21.38
At 21.39
At 21.400000000000002
At 21.41
At 21.42
At 21.43
At 21.44
At 21.45
At 21.46
At 21.47
At 21.48
At 21.490000000000002
At 21.5
At 21.51
At 21.52
At 21.53
At 21.54
At 21.55
At 21.56
At 21.57
At 21.580000000000002
At 21.59
At 21.6
At 21.61
At 21.62
At 21.63
At 21.64
At 21.650000000000002
At 21.66
At 21.67
At 21.68
At 21.69
At 21.7
At 21.71
At 21.72
At 21.73
At 21.740000000000002
At 21.75
At 21.76
At 21.77
At 21.78
At 21.79
At 21.8
At 21.81
At 21.82
At 21.830000000000002
At 21.84
At 21.85
At 21.86
At 21.87
At 21.88
At 21.89
At 21.900000000000002
At 21.91
At 21.92
At 21.93
At 21.94
At 21.95
At 21.96
At 21.97
At 21.98
At 21.990000000000002
At 22.0
At 22.01
At 22.02
At 22.03
At 22.04
At 22.05
At 22.06
At 22.07
At 22.080000000000002
At 22.09
At 22.1
At 22.11
At 22.12
At 22.13
At 22.14
At 22.150000000000002
At 22.16
At 22.17
At 22.18
At 22.19
At 22.2
At 22.21
At 22.22
At 22.23
At 22.240000000000002
At 22.25
At 22.26
At 22.27
At 22.28
At 22.29
At 22.3
At 22.31
At 22.32
At 22.330000000000002
At 22.34
At 22.35
At 22.36
At 22.37
At 22.38
At 22.39
At 22.400000000000002
At 22.41
At 22.42
At 22.43
At 22.44
At 22.45
At 22.46
At 22.47
At 22.48
At 22.490000000000002
At 22.5
At 22.51
At 22.52
At 22.53
At 22.54
At 22.55
At 22.56
At 22.57
At 22.580000000000002
At 22.59
At 22.6
At 22.61
At 22.62
At 22.63
At 22.64
At 22.650000000000002
At 22.66
At 22.67
At 22.68
At 22.69
At 22.7
At 22.71
At 22.72
At 22.73
At 22.740000000000002
At 22.75
At 22.76
At 22.77
At 22.78
At 22.79
At 22.8
At 22.81
At 22.82
At 22.830000000000002
At 22.84
At 22.85
At 22.86
At 22.87
At 22.88
At 22.89
At 22.900000000000002
At 22.91
At 22.92
At 22.93
At 22.94
At 22.95
At 22.96
At 22.97
At 22.98
At 22.990000000000002
At 23.0
At 23.01
At 23.02
At 23.03
At 23.04
At 23.05
At 23.06
At 23.07
At 23.080000000000002
At 23.09
At 23.1
At 23.11
At 23.12
At 23.13
At 23.14
At 23.150000000000002
At 23.16
At 23.17
At 23.18
At 23.19
At 23.2
At 23.21
At 23.22
At 23.23
At 23.240000000000002
At 23.25
At 23.26
At 23.27
At 23.28
At 23.29
At 23.3
At 23.31
At 23.32
At 23.330000000000002
At 23.34
At 23.35
At 23.36
At 23.37
At 23.38
At 23.39
At 23.400000000000002
At 23.41
At 23.42
At 23.43
At 23.44
At 23.45
At 23.46
At 23.47
At 23.48
At 23.490000000000002
At 23.5
At 23.51
At 23.52
At 23.53
At 23.54
At 23.55
At 23.56
At 23.57
At 23.580000000000002
At 23.59
At 23.6
At 23.61
At 23.62
At 23.63
At 23.64
At 23.650000000000002
At 23.66
At 23.67
At 23.68
At 23.69
At 23.7
At 23.71
At 23.72
At 23.73
At 23.740000000000002
At 23.75
At 23.76
At 23.77
At 23.78
At 23.79
At 23.8
At 23.81
At 23.82
At 23.830000000000002
At 23.84
At 23.85
At 23.86
At 23.87
At 23.88
At 23.89
At 23.900000000000002
At 23.91
At 23.92
At 23.93
At 23.94
At 23.95
At 23.96
At 23.97
At 23.98
At 23.990000000000002
At 24.0
At 24.01
At 24.02
At 24.03
At 24.04
At 24.05
At 24.060000000000002
At 24.07
At 24.080000000000002
At 24.09
At 24.1
At 24.11
At 24.12
At 24.13
At 24.14
At 24.150000000000002
At 24.16
At 24.17
At 24.18
At 24.19
At 24.2
At 24.21
At 24.22
At 24.23
At 24.240000000000002
At 24.25
At 24.26
At 24.27
At 24.28
At 24.29
At 24.3
At 24.310000000000002
At 24.32
At 24.330000000000002
At 24.34
At 24.35
At 24.36
At 24.37
At 24.38
At 24.39
At 24.400000000000002
At 24.41
At 24.42
At 24.43
At 24.44
At 24.45
At 24.46
At 24.47
At 24.48
At 24.490000000000002
At 24.5
At 24.51
At 24.52
At 24.53
At 24.54
At 24.55
At 24.560000000000002
At 24.57
At 24.580000000000002
At 24.59
At 24.6
At 24.61
At 24.62
At 24.63
At 24.64
At 24.650000000000002
At 24.66
At 24.67
At 24.68
At 24.69
At 24.7
At 24.71
At 24.72
At 24.73
At 24.740000000000002
At 24.75
At 24.76
At 24.77
At 24.78
At 24.79
At 24.8
At 24.810000000000002
At 24.82
At 24.830000000000002
At 24.84
At 24.85
At 24.86
At 24.87
At 24.88
At 24.89
At 24.900000000000002
At 24.91
At 24.92
At 24.93
At 24.94
At 24.95
At 24.96
At 24.97
At 24.98
At 24.990000000000002
At 25.0
At 25.01
At 25.02
At 25.03
At 25.04
At 25.05
At 25.060000000000002
At 25.07
At 25.080000000000002
At 25.09
At 25.1
At 25.11
At 25.12
At 25.13
At 25.14
At 25.150000000000002
At 25.16
At 25.17
At 25.18
At 25.19
At 25.2
At 25.21
At 25.22
At 25.23
At 25.240000000000002
At 25.25
At 25.26
At 25.27
At 25.28
At 25.29
At 25.3
At 25.310000000000002
At 25.32
At 25.330000000000002
At 25.34
At 25.35
At 25.36
At 25.37
At 25.38
At 25.39
At 25.400000000000002
At 25.41
At 25.42
At 25.43
At 25.44
At 25.45
At 25.46
At 25.47
At 25.48
At 25.490000000000002
At 25.5
At 25.51
At 25.52
At 25.53
At 25.54
At 25.55
At 25.560000000000002
At 25.57
At 25.580000000000002
At 25.59
At 25.6
At 25.61
At 25.62
At 25.63
At 25.64
At 25.650000000000002
At 25.66
At 25.67
At 25.68
At 25.69
At 25.7
At 25.71
At 25.72
At 25.73
At 25.740000000000002
At 25.75
At 25.76
At 25.77
At 25.78
At 25.79
At 25.8
At 25.810000000000002
At 25.82
At 25.830000000000002
At 25.84
At 25.85
At 25.86
At 25.87
At 25.88
At 25.89
At 25.900000000000002
At 25.91
At 25.92
At 25.93
At 25.94
At 25.95
At 25.96
At 25.97
At 25.98
At 25.990000000000002
At 26.0
At 26.01
At 26.02
At 26.03
At 26.04
At 26.05
At 26.060000000000002
At 26.07
At 26.080000000000002
At 26.09
At 26.1
At 26.11
At 26.12
At 26.13
At 26.14
At 26.150000000000002
At 26.16
At 26.17
At 26.18
At 26.19
At 26.2
At 26.21
At 26.22
At 26.23
At 26.240000000000002
At 26.25
At 26.26
At 26.27
At 26.28
At 26.29
At 26.3
At 26.310000000000002
At 26.32
At 26.330000000000002
At 26.34
At 26.35
At 26.36
At 26.37
At 26.38
At 26.39
At 26.400000000000002
At 26.41
At 26.42
At 26.43
At 26.44
At 26.45
At 26.46
At 26.47
At 26.48
At 26.490000000000002
At 26.5
At 26.51
At 26.52
At 26.53
At 26.54
At 26.55
At 26.560000000000002
At 26.57
At 26.580000000000002
At 26.59
At 26.6
At 26.61
At 26.62
At 26.63
At 26.64
At 26.650000000000002
At 26.66
At 26.67
At 26.68
At 26.69
At 26.7
At 26.71
At 26.72
At 26.73
At 26.740000000000002
At 26.75
At 26.76
At 26.77
At 26.78
At 26.79
At 26.8
At 26.810000000000002
At 26.82
At 26.830000000000002
At 26.84
At 26.85
At 26.86
At 26.87
At 26.88
At 26.89
At 26.900000000000002
At 26.91
At 26.92
At 26.93
At 26.94
At 26.95
At 26.96
At 26.97
At 26.98
At 26.990000000000002
At 27.0
At 27.01
At 27.02
At 27.03
At 27.04
At 27.05
At 27.060000000000002
At 27.07
At 27.080000000000002
At 27.09
At 27.1
At 27.11
At 27.12
At 27.13
At 27.14
At 27.150000000000002
At 27.16
At 27.17
At 27.18
At 27.19
At 27.2
At 27.21
At 27.22
At 27.23
At 27.240000000000002
At 27.25
At 27.26
At 27.27
At 27.28
At 27.29
At 27.3
At 27.310000000000002
At 27.32
At 27.330000000000002
At 27.34
At 27.35
At 27.36
At 27.37
At 27.38
At 27.39
At 27.400000000000002
At 27.41
At 27.42
At 27.43
At 27.44
At 27.45
At 27.46
At 27.47
At 27.48
At 27.490000000000002
At 27.5
At 27.51
At 27.52
At 27.53
At 27.54
At 27.55
At 27.560000000000002
At 27.57
At 27.580000000000002
At 27.59
At 27.6
At 27.61
At 27.62
At 27.63
At 27.64
At 27.650000000000002
At 27.66
At 27.67
At 27.68
At 27.69
At 27.7
At 27.71
At 27.72
At 27.73
At 27.740000000000002
At 27.75
At 27.76
At 27.77
At 27.78
At 27.79
At 27.8
At 27.810000000000002
At 27.82
At 27.830000000000002
At 27.84
At 27.85
At 27.86
At 27.87
At 27.88
At 27.89
At 27.900000000000002
At 27.91
At 27.92
At 27.93
At 27.94
At 27.95
At 27.96
At 27.97
At 27.98
At 27.990000000000002
At 28.0
At 28.01
At 28.02
At 28.03
At 28.04
At 28.05
At 28.060000000000002
At 28.07
At 28.080000000000002
At 28.09
At 28.1
At 28.11
At 28.12
At 28.13
At 28.14
At 28.150000000000002
At 28.16
At 28.17
At 28.18
At 28.19
At 28.2
At 28.21
At 28.22
At 28.23
At 28.240000000000002
At 28.25
At 28.26
At 28.27
At 28.28
At 28.29
At 28.3
At 28.310000000000002
At 28.32
At 28.330000000000002
At 28.34
At 28.35
At 28.36
At 28.37
At 28.38
At 28.39
At 28.400000000000002
At 28.41
At 28.42
At 28.43
At 28.44
At 28.45
At 28.46
At 28.47
At 28.48
At 28.490000000000002
At 28.5
At 28.51
At 28.52
At 28.53
At 28.54
At 28.55
At 28.560000000000002
At 28.57
At 28.580000000000002
At 28.59
At 28.6
At 28.61
At 28.62
At 28.63
At 28.64
At 28.650000000000002
At 28.66
At 28.67
At 28.68
At 28.69
At 28.7
At 28.71
At 28.72
At 28.73
At 28.740000000000002
At 28.75
At 28.76
At 28.77
At 28.78
At 28.79
At 28.8
At 28.810000000000002
At 28.82
At 28.830000000000002
At 28.84
At 28.85
At 28.86
At 28.87
At 28.88
At 28.89
At 28.900000000000002
At 28.91
At 28.92
At 28.93
At 28.94
At 28.95
At 28.96
At 28.97
At 28.98
At 28.990000000000002
At 29.0
At 29.01
At 29.02
At 29.03
At 29.04
At 29.05
At 29.060000000000002
At 29.07
At 29.080000000000002
At 29.09
At 29.1
At 29.11
At 29.12
At 29.13
At 29.14
At 29.150000000000002
At 29.16
At 29.17
At 29.18
At 29.19
At 29.2
At 29.21
At 29.22
At 29.23
At 29.240000000000002
At 29.25
At 29.26
At 29.27
At 29.28
At 29.29
At 29.3
At 29.310000000000002
At 29.32
At 29.330000000000002
At 29.34
At 29.35
At 29.36
At 29.37
At 29.38
At 29.39
At 29.400000000000002
At 29.41
At 29.42
At 29.43
At 29.44
At 29.45
At 29.46
At 29.47
At 29.48
At 29.490000000000002
At 29.5
At 29.51
At 29.52
At 29.53
At 29.54
At 29.55
At 29.560000000000002
At 29.57
At 29.580000000000002
At 29.59
At 29.6
At 29.61
At 29.62
At 29.63
At 29.64
At 29.650000000000002
At 29.66
At 29.67
At 29.68
At 29.69
At 29.7
At 29.71
At 29.72
At 29.73
At 29.740000000000002
At 29.75
At 29.76
At 29.77
At 29.78
At 29.79
At 29.8
At 29.810000000000002
At 29.82
At 29.830000000000002
At 29.84
At 29.85
At 29.86
At 29.87
At 29.88
At 29.89
At 29.900000000000002
At 29.91
At 29.92
At 29.93
At 29.94
At 29.95
At 29.96
At 29.97
At 29.98
At 29.990000000000002
At 30.0
At 30.01
At 30.02
At 30.03
At 30.04
At 30.05
At 30.060000000000002
At 30.07
At 30.080000000000002
At 30.09
At 30.1
At 30.11
At 30.12
At 30.13
At 30.14
At 30.150000000000002
At 30.16
At 30.17
At 30.18
At 30.19
At 30.2
At 30.21
At 30.22
At 30.23
At 30.240000000000002
At 30.25
At 30.26
At 30.27
At 30.28
At 30.29
At 30.3
At 30.310000000000002
At 30.32
At 30.330000000000002
At 30.34
At 30.35
At 30.36
At 30.37
At 30.38
At 30.39
At 30.400000000000002
At 30.41
At 30.42
At 30.43
At 30.44
At 30.45
At 30.46
At 30.47
At 30.48
At 30.490000000000002
At 30.5
At 30.51
At 30.52
At 30.53
At 30.54
At 30.55
At 30.560000000000002
At 30.57
At 30.580000000000002
At 30.59
At 30.6
At 30.61
At 30.62
At 30.63
At 30.64
At 30.650000000000002
At 30.66
At 30.67
At 30.68
At 30.69
At 30.7
At 30.71
At 30.72
At 30.73
At 30.740000000000002
At 30.75
At 30.76
At 30.77
At 30.78
At 30.79
At 30.8
At 30.810000000000002
At 30.82
At 30.830000000000002
At 30.84
At 30.85
At 30.86
At 30.87
At 30.88
At 30.89
At 30.900000000000002
At 30.91
At 30.92
At 30.93
At 30.94
At 30.95
At 30.96
At 30.970000000000002
At 30.98
At 30.990000000000002
At 31.0
At 31.01
At 31.02
At 31.03
At 31.04
At 31.05
At 31.060000000000002
At 31.07
At 31.080000000000002
At 31.09
At 31.1
At 31.11
At 31.12
At 31.13
At 31.14
At 31.150000000000002
At 31.16
At 31.17
At 31.18
At 31.19
At 31.2
At 31.21
At 31.220000000000002
At 31.23
At 31.240000000000002
At 31.25
At 31.26
At 31.27
At 31.28
At 31.29
At 31.3
At 31.310000000000002
At 31.32
At 31.330000000000002
At 31.34
At 31.35
At 31.36
At 31.37
At 31.38
At 31.39
At 31.400000000000002
At 31.41
At 31.42
At 31.43
At 31.44
At 31.45
At 31.46
At 31.470000000000002
At 31.48
At 31.490000000000002
At 31.5
At 31.51
At 31.52
At 31.53
At 31.54
At 31.55
At 31.560000000000002
At 31.57
At 31.580000000000002
At 31.59
At 31.6
At 31.61
At 31.62
At 31.63
At 31.64
At 31.650000000000002
At 31.66
At 31.67
At 31.68
At 31.69
At 31.7
At 31.71
At 31.720000000000002
At 31.73
At 31.740000000000002
At 31.75
At 31.76
At 31.77
At 31.78
At 31.79
At 31.8
At 31.810000000000002
At 31.82
At 31.830000000000002
At 31.84
At 31.85
At 31.86
At 31.87
At 31.88
At 31.89
At 31.900000000000002
At 31.91
At 31.92
At 31.93
At 31.94
At 31.95
At 31.96
At 31.970000000000002
At 31.98
At 31.990000000000002
At 32.0
At 32.01
At 32.02
At 32.03
At 32.04
At 32.05
At 32.06
At 32.07
At 32.08
At 32.09
At 32.1
At 32.11
At 32.12
At 32.13
At 32.14
At 32.15
At 32.160000000000004
At 32.17
At 32.18
At 32.19
At 32.2
At 32.21
At 32.22
At 32.230000000000004
At 32.24
At 32.25
At 32.26
At 32.27
At 32.28
At 32.29
At 32.3
At 32.31
At 32.32
At 32.33
At 32.34
At 32.35
At 32.36
At 32.37
At 32.38
At 32.39
At 32.4
At 32.410000000000004
At 32.42
At 32.43
At 32.44
At 32.45
At 32.46
At 32.47
At 32.480000000000004
At 32.49
At 32.5
At 32.51
At 32.52
At 32.53
At 32.54
At 32.55
At 32.56
At 32.57
At 32.58
At 32.59
At 32.6
At 32.61
At 32.62
At 32.63
At 32.64
At 32.65
At 32.660000000000004
At 32.67
At 32.68
At 32.69
At 32.7
At 32.71
At 32.72
At 32.730000000000004
At 32.74
At 32.75
At 32.76
At 32.77
At 32.78
At 32.79
At 32.8
At 32.81
At 32.82
At 32.83
At 32.84
At 32.85
At 32.86
At 32.87
At 32.88
At 32.89
At 32.9
At 32.910000000000004
At 32.92
At 32.93
At 32.94
At 32.95
At 32.96
At 32.97
At 32.980000000000004
At 32.99
At 33.0
At 33.01
At 33.02
At 33.03
At 33.04
At 33.05
At 33.06
At 33.07
At 33.08
At 33.09
At 33.1
At 33.11
At 33.12
At 33.13
At 33.14
At 33.15
At 33.160000000000004
At 33.17
At 33.18
At 33.19
At 33.2
At 33.21
At 33.22
At 33.230000000000004
At 33.24
At 33.25
At 33.26
At 33.27
At 33.28
At 33.29
At 33.3
At 33.31
At 33.32
At 33.33
At 33.34
At 33.35
At 33.36
At 33.37
At 33.38
At 33.39
At 33.4
At 33.410000000000004
At 33.42
At 33.43
At 33.44
At 33.45
At 33.46
At 33.47
At 33.480000000000004
At 33.49
At 33.5
At 33.51
At 33.52
At 33.53
At 33.54
At 33.55
At 33.56
At 33.57
At 33.58
At 33.59
At 33.6
At 33.61
At 33.62
At 33.63
At 33.64
At 33.65
At 33.660000000000004
At 33.67
At 33.68
At 33.69
At 33.7
At 33.71
At 33.72
At 33.730000000000004
At 33.74
At 33.75
At 33.76
At 33.77
At 33.78
At 33.79
At 33.8
At 33.81
At 33.82
At 33.83
At 33.84
At 33.85
At 33.86
At 33.87
At 33.88
At 33.89
At 33.9
At 33.910000000000004
At 33.92
At 33.93
At 33.94
At 33.95
At 33.96
At 33.97
At 33.980000000000004
At 33.99
At 34.0
At 34.01
At 34.02
At 34.03
At 34.04
At 34.05
At 34.06
At 34.07
At 34.08
At 34.09
At 34.1
At 34.11
At 34.12
At 34.13
At 34.14
At 34.15
At 34.160000000000004
At 34.17
At 34.18
At 34.19
At 34.2
At 34.21
At 34.22
At 34.230000000000004
At 34.24
At 34.25
At 34.26
At 34.27
At 34.28
At 34.29
At 34.300000000000004
At 34.31
At 34.32
At 34.33
At 34.34
At 34.35
At 34.36
At 34.37
At 34.38
At 34.39
At 34.4
At 34.410000000000004
At 34.42
At 34.43
At 34.44
At 34.45
At 34.46
At 34.47
At 34.480000000000004
At 34.49
At 34.5
At 34.51
At 34.52
At 34.53
At 34.54
At 34.550000000000004
At 34.56
At 34.57
At 34.58
At 34.59
At 34.6
At 34.61
At 34.62
At 34.63
At 34.64
At 34.65
At 34.660000000000004
At 34.67
At 34.68
At 34.69
At 34.7
At 34.71
At 34.72
At 34.730000000000004
At 34.74
At 34.75
At 34.76
At 34.77
At 34.78
At 34.79
At 34.800000000000004
At 34.81
At 34.82
At 34.83
At 34.84
At 34.85
At 34.86
At 34.87
At 34.88
At 34.89
At 34.9
At 34.910000000000004
At 34.92
At 34.93
At 34.94
At 34.95
At 34.96
At 34.97
At 34.980000000000004
At 34.99
At 35.0
At 35.01
At 35.02
At 35.03
At 35.04
At 35.050000000000004
At 35.06
At 35.07
At 35.08
At 35.09
At 35.1
At 35.11
At 35.12
At 35.13
At 35.14
At 35.15
At 35.160000000000004
At 35.17
At 35.18
At 35.19
At 35.2
At 35.21
At 35.22
At 35.230000000000004
At 35.24
At 35.25
At 35.26
At 35.27
At 35.28
At 35.29
At 35.300000000000004
At 35.31
At 35.32
At 35.33
At 35.34
At 35.35
At 35.36
At 35.37
At 35.38
At 35.39
At 35.4
At 35.410000000000004
At 35.42
At 35.43
At 35.44
At 35.45
At 35.46
At 35.47
At 35.480000000000004
At 35.49
At 35.5
At 35.51
At 35.52
At 35.53
At 35.54
At 35.550000000000004
At 35.56
At 35.57
At 35.58
At 35.59
At 35.6
At 35.61
At 35.62
At 35.63
At 35.64
At 35.65
At 35.660000000000004
At 35.67
At 35.68
At 35.69
At 35.7
At 35.71
At 35.72
At 35.730000000000004
At 35.74
At 35.75
At 35.76
At 35.77
At 35.78
At 35.79
At 35.800000000000004
At 35.81
At 35.82
At 35.83
At 35.84
At 35.85
At 35.86
At 35.87
At 35.88
At 35.89
At 35.9
At 35.910000000000004
At 35.92
At 35.93
At 35.94
At 35.95
At 35.96
At 35.97
At 35.980000000000004
At 35.99
At 36.0
At 36.01
At 36.02
At 36.03
At 36.04
At 36.050000000000004
At 36.06
At 36.07
At 36.08
At 36.09
At 36.1
At 36.11
At 36.12
At 36.13
At 36.14
At 36.15
At 36.160000000000004
At 36.17
At 36.18
At 36.19
At 36.2
At 36.21
At 36.22
At 36.230000000000004
At 36.24
At 36.25
At 36.26
At 36.27
At 36.28
At 36.29
At 36.300000000000004
At 36.31
At 36.32
At 36.33
At 36.34
At 36.35
At 36.36
At 36.37
At 36.38
At 36.39
At 36.4
At 36.410000000000004
At 36.42
At 36.43
At 36.44
At 36.45
At 36.46
At 36.47
At 36.480000000000004
At 36.49
At 36.5
At 36.51
At 36.52
At 36.53
At 36.54
At 36.550000000000004
At 36.56
At 36.57
At 36.58
At 36.59
At 36.6
At 36.61
At 36.62
At 36.63
At 36.64
At 36.65
At 36.660000000000004
At 36.67
At 36.68
At 36.69
At 36.7
At 36.71
At 36.72
At 36.730000000000004
At 36.74
At 36.75
At 36.76
At 36.77
At 36.78
At 36.79
At 36.800000000000004
At 36.81
At 36.82
At 36.83
At 36.84
At 36.85
At 36.86
At 36.87
At 36.88
At 36.89
At 36.9
At 36.910000000000004
At 36.92
At 36.93
At 36.94
At 36.95
At 36.96
At 36.97
At 36.980000000000004
At 36.99
At 37.0
At 37.01
At 37.02
At 37.03
At 37.04
At 37.050000000000004
At 37.06
At 37.07
At 37.08
At 37.09
At 37.1
At 37.11
At 37.12
At 37.13
At 37.14
At 37.15
At 37.160000000000004
At 37.17
At 37.18
At 37.19
At 37.2
At 37.21
At 37.22
At 37.230000000000004
At 37.24
At 37.25
At 37.26
At 37.27
At 37.28
At 37.29
At 37.300000000000004
At 37.31
At 37.32
At 37.33
At 37.34
At 37.35
At 37.36
At 37.37
At 37.38
At 37.39
At 37.4
At 37.410000000000004
At 37.42
At 37.43
At 37.44
At 37.45
At 37.46
At 37.47
At 37.480000000000004
At 37.49
At 37.5
At 37.51
At 37.52
At 37.53
At 37.54
At 37.550000000000004
At 37.56
At 37.57
At 37.58
At 37.59
At 37.6
At 37.61
At 37.62
At 37.63
At 37.64
At 37.65
At 37.660000000000004
At 37.67
At 37.68
At 37.69
At 37.7
At 37.71
At 37.72
At 37.730000000000004
At 37.74
At 37.75
At 37.76
At 37.77
At 37.78
At 37.79
At 37.800000000000004
At 37.81
At 37.82
At 37.83
At 37.84
At 37.85
At 37.86
At 37.87
At 37.88
At 37.89
At 37.9
At 37.910000000000004
At 37.92
At 37.93
At 37.94
At 37.95
At 37.96
At 37.97
At 37.980000000000004
At 37.99
At 38.0
At 38.01
At 38.02
At 38.03
At 38.04
At 38.050000000000004
At 38.06
At 38.07
At 38.08
At 38.09
At 38.1
At 38.11
At 38.12
At 38.13
At 38.14
At 38.15
At 38.160000000000004
At 38.17
At 38.18
At 38.19
At 38.2
At 38.21
At 38.22
At 38.230000000000004
At 38.24
At 38.25
At 38.26
At 38.27
At 38.28
At 38.29
At 38.300000000000004
At 38.31
At 38.32
At 38.33
At 38.34
At 38.35
At 38.36
At 38.37
At 38.38
At 38.39
At 38.4
At 38.410000000000004
At 38.42
At 38.43
At 38.44
At 38.45
At 38.46
At 38.47
At 38.480000000000004
At 38.49
At 38.5
At 38.51
At 38.52
At 38.53
At 38.54
At 38.550000000000004
At 38.56
At 38.57
At 38.58
At 38.59
At 38.6
At 38.61
At 38.62
At 38.63
At 38.64
At 38.65
At 38.660000000000004
At 38.67
At 38.68
At 38.69
At 38.7
At 38.71
At 38.72
At 38.730000000000004
At 38.74
At 38.75
At 38.76
At 38.77
At 38.78
At 38.79
At 38.800000000000004
At 38.81
At 38.82
At 38.83
At 38.84
At 38.85
At 38.86
At 38.87
At 38.88
At 38.89
At 38.9
At 38.910000000000004
At 38.92
At 38.93
At 38.94
At 38.95
At 38.96
At 38.97
At 38.980000000000004
At 38.99
At 39.0
At 39.01
At 39.02
At 39.03
At 39.04
At 39.050000000000004
At 39.06
At 39.07
At 39.08
At 39.09
At 39.1
At 39.11
At 39.12
At 39.13
At 39.14
At 39.15
At 39.160000000000004
At 39.17
At 39.18
At 39.19
At 39.2
At 39.21
At 39.22
At 39.230000000000004
At 39.24
At 39.25
At 39.26
At 39.27
At 39.28
At 39.29
At 39.300000000000004
At 39.31
At 39.32
At 39.33
At 39.34
At 39.35
At 39.36
At 39.37
At 39.38
At 39.39
At 39.4
At 39.410000000000004
At 39.42
At 39.43
At 39.44
At 39.45
At 39.46
At 39.47
At 39.480000000000004
At 39.49
At 39.5
At 39.51
At 39.52
At 39.53
At 39.54
At 39.550000000000004
At 39.56
At 39.57
At 39.58
At 39.59
At 39.6
At 39.61
At 39.62
At 39.63
At 39.64
At 39.65
At 39.660000000000004
At 39.67
At 39.68
At 39.69
At 39.7
At 39.71
At 39.72
At 39.730000000000004
At 39.74
At 39.75
At 39.76
At 39.77
At 39.78
At 39.79
At 39.800000000000004
At 39.81
At 39.82
At 39.83
At 39.84
At 39.85
At 39.86
At 39.87
At 39.88
At 39.89
At 39.9
At 39.910000000000004
At 39.92
At 39.93
At 39.94
At 39.95
At 39.96
At 39.97
At 39.980000000000004
At 39.99
At 40.0
At 40.01
At 40.02
At 40.03
At 40.04
At 40.050000000000004
At 40.06
At 40.07
At 40.08
At 40.09
At 40.1
At 40.11
At 40.12
At 40.13
At 40.14
At 40.15
At 40.160000000000004
At 40.17
At 40.18
At 40.19
At 40.2
At 40.21
At 40.22
At 40.230000000000004
At 40.24
At 40.25
At 40.26
At 40.27
At 40.28
At 40.29
At 40.300000000000004
At 40.31
At 40.32
At 40.33
At 40.34
At 40.35
At 40.36
At 40.37
At 40.38
At 40.39
At 40.4
At 40.410000000000004
At 40.42
At 40.43
At 40.44
At 40.45
At 40.46
At 40.47
At 40.480000000000004
At 40.49
At 40.5
At 40.51
At 40.52
At 40.53
At 40.54
At 40.550000000000004
At 40.56
At 40.57
At 40.58
At 40.59
At 40.6
At 40.61
At 40.62
At 40.63
At 40.64
At 40.65
At 40.660000000000004
At 40.67
At 40.68
At 40.69
At 40.7
At 40.71
At 40.72
At 40.730000000000004
At 40.74
At 40.75
At 40.76
At 40.77
At 40.78
At 40.79
At 40.800000000000004
At 40.81
At 40.82
At 40.83
At 40.84
At 40.85
At 40.86
At 40.87
At 40.88
At 40.89
At 40.9
At 40.910000000000004
At 40.92
At 40.93
At 40.94
At 40.95
At 40.96
At 40.97
At 40.980000000000004
At 40.99
At 41.0
At 41.01
At 41.02
At 41.03
At 41.04
At 41.050000000000004
At 41.06
At 41.07
At 41.08
At 41.09
At 41.1
At 41.11
At 41.12
At 41.13
At 41.14
At 41.15
At 41.160000000000004
At 41.17
At 41.18
At 41.19
At 41.2
At 41.21
At 41.22
At 41.230000000000004
At 41.24
At 41.25
At 41.26
At 41.27
At 41.28
At 41.29
At 41.300000000000004
At 41.31
At 41.32
At 41.33
At 41.34
At 41.35
At 41.36
At 41.37
At 41.38
At 41.39
At 41.4
At 41.410000000000004
At 41.42
At 41.43
At 41.44
At 41.45
At 41.46
At 41.47
At 41.480000000000004
At 41.49
At 41.5
At 41.51
At 41.52
At 41.53
At 41.54
At 41.550000000000004
At 41.56
At 41.57
At 41.58
At 41.59
At 41.6
At 41.61
At 41.62
At 41.63
At 41.64
At 41.65
At 41.660000000000004
At 41.67
At 41.68
At 41.69
At 41.7
At 41.71
At 41.72
At 41.730000000000004
At 41.74
At 41.75
At 41.76
At 41.77
At 41.78
At 41.79
At 41.800000000000004
At 41.81
At 41.82
At 41.83
At 41.84
At 41.85
At 41.86
At 41.87
At 41.88
At 41.89
At 41.9
At 41.910000000000004
At 41.92
At 41.93
At 41.94
At 41.95
At 41.96
At 41.97
At 41.980000000000004
At 41.99
At 42.0
At 42.01
At 42.02
At 42.03
At 42.04
At 42.050000000000004
At 42.06
At 42.07
At 42.08
At 42.09
At 42.1
At 42.11
At 42.12
At 42.13
At 42.14
At 42.15
At 42.160000000000004
At 42.17
At 42.18
At 42.19
At 42.2
At 42.21
At 42.22
At 42.230000000000004
At 42.24
At 42.25
At 42.26
At 42.27
At 42.28
At 42.29
At 42.300000000000004
At 42.31
At 42.32
At 42.33
At 42.34
At 42.35
At 42.36
At 42.37
At 42.38
At 42.39
At 42.4
At 42.410000000000004
At 42.42
At 42.43
At 42.44
At 42.45
At 42.46
At 42.47
At 42.480000000000004
At 42.49
At 42.5
At 42.51
At 42.52
At 42.53
At 42.54
At 42.550000000000004
At 42.56
At 42.57
At 42.58
At 42.59
At 42.6
At 42.61
At 42.62
At 42.63
At 42.64
At 42.65
At 42.660000000000004
At 42.67
At 42.68
At 42.69
At 42.7
At 42.71
At 42.72
At 42.730000000000004
At 42.74
At 42.75
At 42.76
At 42.77
At 42.78
At 42.79
At 42.800000000000004
At 42.81
At 42.82
At 42.83
At 42.84
At 42.85
At 42.86
At 42.87
At 42.88
At 42.89
At 42.9
At 42.910000000000004
At 42.92
At 42.93
At 42.94
At 42.95
At 42.96
At 42.97
At 42.980000000000004
At 42.99
At 43.0
At 43.01
At 43.02
At 43.03
At 43.04
At 43.050000000000004
At 43.06
At 43.07
At 43.08
At 43.09
At 43.1
At 43.11
At 43.12
At 43.13
At 43.14
At 43.15
At 43.160000000000004
At 43.17
At 43.18
At 43.19
At 43.2
At 43.21
At 43.22
At 43.230000000000004
At 43.24
At 43.25
At 43.26
At 43.27
At 43.28
At 43.29
At 43.300000000000004
At 43.31
At 43.32
At 43.33
At 43.34
At 43.35
At 43.36
At 43.37
At 43.38
At 43.39
At 43.4
At 43.410000000000004
At 43.42
At 43.43
At 43.44
At 43.45
At 43.46
At 43.47
At 43.480000000000004
At 43.49
At 43.5
At 43.51
At 43.52
At 43.53
At 43.54
At 43.550000000000004
At 43.56
At 43.57
At 43.58
At 43.59
At 43.6
At 43.61
At 43.62
At 43.63
At 43.64
At 43.65
At 43.660000000000004
At 43.67
At 43.68
At 43.69
At 43.7
At 43.71
At 43.72
At 43.730000000000004
At 43.74
At 43.75
At 43.76
At 43.77
At 43.78
At 43.79
At 43.800000000000004
At 43.81
At 43.82
At 43.83
At 43.84
At 43.85
At 43.86
At 43.87
At 43.88
At 43.89
At 43.9
At 43.910000000000004
At 43.92
At 43.93
At 43.94
At 43.95
At 43.96
At 43.97
At 43.980000000000004
At 43.99
At 44.0
At 44.01
At 44.02
At 44.03
At 44.04
At 44.050000000000004
At 44.06
At 44.07
At 44.08
At 44.09
At 44.1
At 44.11
At 44.12
At 44.13
At 44.14
At 44.15
At 44.160000000000004
At 44.17
At 44.18
At 44.19
At 44.2
At 44.21
At 44.22
At 44.230000000000004
At 44.24
At 44.25
At 44.26
At 44.27
At 44.28
At 44.29
At 44.300000000000004
At 44.31
At 44.32
At 44.33
At 44.34
At 44.35
At 44.36
At 44.37
At 44.38
At 44.39
At 44.4
At 44.410000000000004
At 44.42
At 44.43
At 44.44
At 44.45
At 44.46
At 44.47
At 44.480000000000004
At 44.49
At 44.5
At 44.51
At 44.52
At 44.53
At 44.54
At 44.550000000000004
At 44.56
At 44.57
At 44.58
At 44.59
At 44.6
At 44.61
At 44.62
At 44.63
At 44.64
At 44.65
At 44.660000000000004
At 44.67
At 44.68
At 44.69
At 44.7
At 44.71
At 44.72
At 44.730000000000004
At 44.74
At 44.75
At 44.76
At 44.77
At 44.78
At 44.79
At 44.800000000000004
At 44.81
At 44.82
At 44.83
At 44.84
At 44.85
At 44.86
At 44.87
At 44.88
At 44.89
At 44.9
At 44.910000000000004
At 44.92
At 44.93
At 44.94
At 44.95
At 44.96
At 44.97
At 44.980000000000004
At 44.99
At 45.0
At 45.01
At 45.02
At 45.03
At 45.04
At 45.050000000000004
At 45.06
At 45.07
At 45.08
At 45.09
At 45.1
At 45.11
At 45.12
At 45.13
At 45.14
At 45.15
At 45.160000000000004
At 45.17
At 45.18
At 45.19
At 45.2
At 45.21
At 45.22
At 45.230000000000004
At 45.24
At 45.25
At 45.26
At 45.27
At 45.28
At 45.29
At 45.300000000000004
At 45.31
At 45.32
At 45.33
At 45.34
At 45.35
At 45.36
At 45.37
At 45.38
At 45.39
At 45.4
At 45.410000000000004
At 45.42
At 45.43
At 45.44
At 45.45
At 45.46
At 45.47
At 45.480000000000004
At 45.49
At 45.5
At 45.51
At 45.52
At 45.53
At 45.54
At 45.550000000000004
At 45.56
At 45.57
At 45.58
At 45.59
At 45.6
At 45.61
At 45.62
At 45.63
At 45.64
At 45.65
At 45.660000000000004
At 45.67
At 45.68
At 45.69
At 45.7
At 45.71
At 45.72
At 45.730000000000004
At 45.74
At 45.75
At 45.76
At 45.77
At 45.78
At 45.79
At 45.800000000000004
At 45.81
At 45.82
At 45.83
At 45.84
At 45.85
At 45.86
At 45.87
At 45.88
At 45.89
At 45.9
At 45.910000000000004
At 45.92
At 45.93
At 45.94
At 45.95
At 45.96
At 45.97
At 45.980000000000004
At 45.99
At 46.0
At 46.01
At 46.02
At 46.03
At 46.04
At 46.050000000000004
At 46.06
At 46.07
At 46.08
At 46.09
At 46.1
At 46.11
At 46.12
At 46.13
At 46.14
At 46.15
At 46.160000000000004
At 46.17
At 46.18
At 46.19
At 46.2
At 46.21
At 46.22
At 46.230000000000004
At 46.24
At 46.25
At 46.26
At 46.27
At 46.28
At 46.29
At 46.300000000000004
At 46.31
At 46.32
At 46.33
At 46.34
At 46.35
At 46.36
At 46.37
At 46.38
At 46.39
At 46.4
At 46.410000000000004
At 46.42
At 46.43
At 46.44
At 46.45
At 46.46
At 46.47
At 46.480000000000004
At 46.49
At 46.5
At 46.51
At 46.52
At 46.53
At 46.54
At 46.550000000000004
At 46.56
At 46.57
At 46.58
At 46.59
At 46.6
At 46.61
At 46.62
At 46.63
At 46.64
At 46.65
At 46.660000000000004
At 46.67
At 46.68
At 46.69
At 46.7
At 46.71
At 46.72
At 46.730000000000004
At 46.74
At 46.75
At 46.76
At 46.77
At 46.78
At 46.79
At 46.800000000000004
At 46.81
At 46.82
At 46.83
At 46.84
At 46.85
At 46.86
At 46.87
At 46.88
At 46.89
At 46.9
At 46.910000000000004
At 46.92
At 46.93
At 46.94
At 46.95
At 46.96
At 46.97
At 46.980000000000004
At 46.99
At 47.0
At 47.01
At 47.02
At 47.03
At 47.04
At 47.050000000000004
At 47.06
At 47.07
At 47.08
At 47.09
At 47.1
At 47.11
At 47.12
At 47.13
At 47.14
At 47.15
At 47.160000000000004
At 47.17
At 47.18
At 47.19
At 47.2
At 47.21
At 47.22
At 47.230000000000004
At 47.24
At 47.25
At 47.26
At 47.27
At 47.28
At 47.29
At 47.300000000000004
At 47.31
At 47.32
At 47.33
At 47.34
At 47.35
At 47.36
At 47.37
At 47.38
At 47.39
At 47.4
At 47.410000000000004
At 47.42
At 47.43
At 47.44
At 47.45
At 47.46
At 47.47
At 47.480000000000004
At 47.49
At 47.5
At 47.51
At 47.52
At 47.53
At 47.54
At 47.550000000000004
At 47.56
At 47.57
At 47.58
At 47.59
At 47.6
At 47.61
At 47.62
At 47.63
At 47.64
At 47.65
At 47.660000000000004
At 47.67
At 47.68
At 47.69
At 47.7
At 47.71
At 47.72
At 47.730000000000004
At 47.74
At 47.75
At 47.76
At 47.77
At 47.78
At 47.79
At 47.800000000000004
At 47.81
At 47.82
At 47.83
At 47.84
At 47.85
At 47.86
At 47.870000000000005
At 47.88
At 47.89
At 47.9
At 47.910000000000004
At 47.92
At 47.93
At 47.94
At 47.95
At 47.96
At 47.97
At 47.980000000000004
At 47.99
At 48.0
At 48.01
At 48.02
At 48.03
At 48.04
At 48.050000000000004
At 48.06
At 48.07
At 48.08
At 48.09
At 48.1
At 48.11
At 48.120000000000005
At 48.13
At 48.14
At 48.15
At 48.160000000000004
At 48.17
At 48.18
At 48.19
At 48.2
At 48.21
At 48.22
At 48.230000000000004
At 48.24
At 48.25
At 48.26
At 48.27
At 48.28
At 48.29
At 48.300000000000004
At 48.31
At 48.32
At 48.33
At 48.34
At 48.35
At 48.36
At 48.370000000000005
At 48.38
At 48.39
At 48.4
At 48.410000000000004
At 48.42
At 48.43
At 48.44
At 48.45
At 48.46
At 48.47
At 48.480000000000004
At 48.49
At 48.5
At 48.51
At 48.52
At 48.53
At 48.54
At 48.550000000000004
At 48.56
At 48.57
At 48.58
At 48.59
At 48.6
At 48.61
At 48.620000000000005
At 48.63
At 48.64
At 48.65
At 48.660000000000004
At 48.67
At 48.68
At 48.69
At 48.7
At 48.71
At 48.72
At 48.730000000000004
At 48.74
At 48.75
At 48.76
At 48.77
At 48.78
At 48.79
At 48.800000000000004
At 48.81
At 48.82
At 48.83
At 48.84
At 48.85
At 48.86
At 48.870000000000005
At 48.88
At 48.89
At 48.9
At 48.910000000000004
At 48.92
At 48.93
At 48.94
At 48.95
At 48.96
At 48.97
At 48.980000000000004
At 48.99
At 49.0
At 49.01
At 49.02
At 49.03
At 49.04
At 49.050000000000004
At 49.06
At 49.07
At 49.08
At 49.09
At 49.1
At 49.11
At 49.120000000000005
At 49.13
At 49.14
At 49.15
At 49.160000000000004
At 49.17
At 49.18
At 49.19
At 49.2
At 49.21
At 49.22
At 49.230000000000004
At 49.24
At 49.25
At 49.26
At 49.27
At 49.28
At 49.29
At 49.300000000000004
At 49.31
At 49.32
At 49.33
At 49.34
At 49.35
At 49.36
At 49.370000000000005
At 49.38
At 49.39
At 49.4
At 49.410000000000004
At 49.42
At 49.43
At 49.44
At 49.45
At 49.46
At 49.47
At 49.480000000000004
At 49.49
At 49.5
At 49.51
At 49.52
At 49.53
At 49.54
At 49.550000000000004
At 49.56
At 49.57
At 49.58
At 49.59
At 49.6
At 49.61
At 49.620000000000005
At 49.63
At 49.64
At 49.65
At 49.660000000000004
At 49.67
At 49.68
At 49.69
At 49.7
At 49.71
At 49.72
At 49.730000000000004
At 49.74
At 49.75
At 49.76
At 49.77
At 49.78
At 49.79
At 49.800000000000004
At 49.81
At 49.82
At 49.83
At 49.84
At 49.85
At 49.86
At 49.870000000000005
At 49.88
At 49.89
At 49.9
At 49.910000000000004
At 49.92
At 49.93
At 49.94
At 49.95
At 49.96
At 49.97
At 49.980000000000004
At 49.99

In [41]:
plt.matshow(GCN.inhibitoryWeights[:, :, 125*64 + 25].view(61, 61).detach())
plt.show()



In [39]:
plt.rcParams['figure.figsize'] = [5, 5]
for i in range(50):
    print(i)
    GCN.staticLearning(200, logFreq=100000, startFrom = 100.)


0
---------------------------------------------------------------------------
KeyboardInterrupt                         Traceback (most recent call last)
<ipython-input-39-30a0c5f168cf> in <module>()
      2 for i in range(50):
      3     print(i)
----> 4     GCN.staticLearning(200, logFreq=100000, startFrom = 100.)

<ipython-input-5-eea2260417f6> in staticLearning(self, time, logFreq, startFrom, startingActivity, startingHistory)
    362         s = 0
    363         for t in range(numSteps):
--> 364             self.step(place=False)
    365 
    366             if t*self.dt >= startFrom:

<ipython-input-5-eea2260417f6> in step(self, vel, speed, turn, place, normalize)
    296             self.instantaneous += self.globalTonic
    297             self.instantaneous *= self.envelope
--> 298             self.instantaneous -= self.activationHistory * self.boostEffect
    299             self.instantaneous *= min(speed, 1)
    300             relu_(self.instantaneous)

KeyboardInterrupt: 

In [35]:
plt.rcParams['figure.figsize'] = [5, 5]
anim = createMovie(results[-1000:], "C:\\Users\\maxon\\Github\\htmresearch\\projects\\grid_cell_learning\\test.mp4", 5)



In [ ]:
plt.rcParams['figure.figsize'] = [5, 15]
lr = 1.#GCN.learningRate
for i in range(1000):
    GCN.learningRate = lr/(i+17)
    print(i, GCN.learningRate)
    GCN.learn(150,
              plotting=False,
              learnStart=1.5,
              stab=0.98,
              speed=.1,
              circular=True,
              localNormalization=False)

In [ ]:
plt.rcParams['figure.figsize'] = [15, 15]
plt.figure()
xstart = 28
xend = 32
ystart = 28
yend = 32
for i in range(xstart, xend):
    for j in range(ystart, yend):
        index = (i - xstart)*(yend - ystart) + (j - ystart) + 1
        plt.subplot((xend - xstart), (yend - ystart), index)
        plt.scatter(GCN.places[:, 0].cpu().numpy(),
                    GCN.places[:, 1].cpu().numpy(),
                    c = GCN.placeWeights[i, j, :].cpu().numpy(),
                    cmap = plt.get_cmap("coolwarm"))
        plt.draw()

In [ ]:
plt.rcParams['figure.figsize'] = [5, 5]
plt.figure()
plt.scatter(GCN.places[:, 0].cpu().numpy(),
            GCN.places[:, 1].cpu().numpy(),
            c = torch.mean(GCN.placeWeights.view(GCN.numX*GCN.numY, GCN.numPlaces), dim=0).cpu().numpy(),
            cmap = plt.get_cmap("coolwarm"))
plt.colorbar()
plt.show()

plt.matshow(torch.mean(GCN.placeWeights, dim=-1).cpu().numpy(),
            cmap = plt.get_cmap("coolwarm"))
plt.colorbar()
plt.show()

In [ ]:
GCN.placeMax /= 2.
GCN.placeMean /= 2.

In [ ]:
GCN.learningRate = 5.
plt.rcParams['figure.figsize'] = [5, 20]
GCN.learn(5.,
          plotting=True,
          plotInterval=5,
          oneD=False,
          learnStart=0.,
          stab=.99,
          circular=True,
          speed=.25,
          localNormalization=True)

In [ ]:
window=GCN.excitationWindow

plt.rcParams['figure.figsize'] = [5, 5]
plt.matshow(torch.mean(GCN.excitatoryWeights["e"], dim=-1).view(window*2+1, window*2+1).detach(), vmin=0, vmax=0.3)
plt.show()

plt.rcParams['figure.figsize'] = [5, 5]
plt.matshow(torch.mean(GCN.excitatoryWeights["w"], dim=-1).view(window*2+1, window*2+1).detach(), vmin=0, vmax=0.3)
plt.show()

plt.rcParams['figure.figsize'] = [5, 5]
plt.matshow(torch.mean(GCN.excitatoryWeights["n"], dim=-1).view(window*2+1, window*2+1).detach(), vmin=0, vmax=0.3)
plt.show()

plt.rcParams['figure.figsize'] = [5, 5]
plt.matshow(torch.mean(GCN.excitatoryWeights["s"], dim=-1).view(window*2+1, window*2+1).detach(), vmin=0, vmax=0.3)
plt.show()

In [ ]:
torch.mean(GCN.excitatoryWeights["w"][:, :, 24*48 + 24])

In [ ]:
plt.rcParams['figure.figsize'] = [5, 5]

plt.matshow(GCN.activity.view(GCN.numX, GCN.numY).cpu().numpy())
cols = unfold(GCN.activity, (25, 25), 1, (12, 12), (1, 1))

plt.matshow(cols[:, :, 55*(96)+33].view(25, 25).cpu().numpy())

weights = GCN.excitatoryWeights["n"]
results = cols*weights
plt.matshow(weights[:, :, 55*96 + 33].view(25, 25).cpu().numpy())
plt.matshow(results[:, :, 55*(96)+33].view(25, 25).cpu().numpy())

In [ ]:
weights = GCN.placeWeights.cpu().numpy()
with open("PlaceWeights2.npz", "wb") as f:
    np.savez(f, weights)

places = GCN.places.cpu().numpy()
with open("Places2.npz", "wb") as f:
    np.savez(f, places)

In [ ]:
with open("PlaceWeights.npz", "rb") as f:
    weights = np.load(f)["arr_0"]
GCN.placeWeights = torch.tensor(weights, device=device, dtype=torch.float)
with open("Places.npz", "rb") as f:
    places = np.load(f)["arr_0"]

GCN.places = torch.tensor(places, device=device, dtype=torch.float)

In [ ]:
mask = np.zeros((GCN.numX, GCN.numY))

for i in range(0, GCN.numX, 1):
    for j in range(0, GCN.numY, 1):
        mask[i, j] = 1.

processedResults, flowVelocities, flowColors = get_data_flow_and_color_maps(results[1100:1150], GCN.numX, GCN.numY, mask, 1)
processedResults = processedResults.reshape(-1, GCN.numX, GCN.numY)
flowColors = flowColors.reshape(-1, GCN.numX, GCN.numY, 3)

In [ ]:
def createMovieWithFlow(data, colors, name):
    def update(num, data, a):
        results, flowColors = data
        a[0].set_data(results[num])
        a[1].set_data(flowColors[num])
        return a,

    fig, ax   = plt.subplots(1,2)

    a0  = ax[0].imshow(data[0], animated=True)
    a1  = ax[1].imshow(colors[0], animated=True)

    ani = animation.FuncAnimation(fig, update, data.shape[0] - 1, fargs=((data, colors,), (a0,a1)),
                                   interval=10, blit=False)
    
    mywriter = animation.FFMpegWriter()
    ani.save(name,writer=mywriter)

In [ ]:
createMovieWithFlow(processedResults, flowColors,
                      "C:\\Users\\maxon\\Github\\htmresearch\\projects\\grid_cell_learning\\flowtest.mp4")

In [ ]: