Correlation Matrix Memories' Orthogonal Key Tests

#!/usr/bin/env python3
"""This Source Code Form is subject to the terms of the Mozilla Public
License, v. 2.0. If a copy of the MPL was not distributed with this
file, You can obtain one at http://mozilla.org/MPL/2.0/.

Based on the paper "Correlation Matrix Memories" by TEUVO KOHONEN.
"""
__author__ = 'Mārtiņš Avots'
import unittest
from completeCorrelationMatrixMemories import CompleteCorrelationMatrixMemory
from testingArtifacts import floatTuple, difference, images3x3
from random import uniform, sample
class OrthogonalKeyTests(unittest.TestCase):
def testAssymetricOrthogonalKeys(self):
self.__testOrthogonalKeys({
(3,0) : (3,1,4.5),
(0,-7) : (-3,-1,99)
})
def testSimpleOrthogonalKeys1(self):
self.__testOrthogonalKeys({
(1,0) : (3,1,4.5),
(0,1) : (-3,-1,99)
})
def testSimpleOrthogonalKeys2(self):
self.__testOrthogonalKeys({
(2,0) : (3,1,4.5),
(0,2) : (-3,-1,99)
})
def testSimpleOrthogonalKeys4(self):
self.__testOrthogonalKeys({
(4,0) : (3,1,4.5),
(0,4) : (-3,-1,99)
})
def testSimpleOrthogonalKeys8(self):
self.__testOrthogonalKeys({
(8,0) : (3,1,4.5),
(0,8) : (-3,-1,99)
})
def testSimpleOrthogonalKeysRandom(self):
self.__testOrthogonalKeys({
(uniform(-1000, 1000),0) : (3,1,4.5), # TODO Random chosen magic constants
(0,uniform(-1000, 1000)) : (-3,-1,99) # TODO Random chosen magic constants
})
def testSimpleOrthogonalKeys9ZeroTwo(self):
values = sample(list(images3x3.values()), 9)
mapping = {}
for i in range(9):
orthogonalKey = [0]*9
orthogonalKey[i] = 2
orthogonalKey = tuple(orthogonalKey)
mapping[orthogonalKey] = values[i]
self.__testOrthogonalKeys(mapping)
def testSimpleOrthogonalKeys9uniform(self):
values = sample(list(images3x3.values()), 9)
mapping = {}
for i in range(9):
orthogonalKey = [0]*9
orthogonalKey[i] = uniform(-1000, 1000) # TODO Random chosen magic constants
orthogonalKey = tuple(orthogonalKey)
mapping[orthogonalKey] = values[i]
self.__testOrthogonalKeys(mapping)
def __testOrthogonalKeys(self, mapping):
testSubject = CompleteCorrelationMatrixMemory(mapping)
for key in mapping:
recall = testSubject.recall(key)
expectedRecall = floatTuple(mapping[key])
for i in range(len(recall)):
self.assertAlmostEqual(recall[i], expectedRecall[i])