# Pattern2.py

from gpanel import *
from operator import itemgetter
import time
import random

def euklidian(pic1, pic2):
    # pic = [[0, 1, 0,...,1],[...],...]
    count = 0
    for i in range(20):
        for k in range(20):
            count += int(pic1[i][k] != pic2[i][k])
    return count

def extractPicture(img, n):
    # n = 0..5000
    # return list with 0, 1
    pic = [[0 for i in range(20)] for k in range(20)]
    x_offset = 20 * (n % 100)
    y_offset = 20 * (n // 100)
    for x in range(20):
        for y in range(20):
            if isTigerJython:
                c = img.getPixelColor(x + x_offset, y + y_offset)
                lum = (c.getRed() + c.getGreen() + c.getBlue()) // 3
            else:
                c = GPanel.getPixelColor(img, x + x_offset, y + y_offset)
                lum = (c[0] + c[1] + c[2]) // 3
            pic[x][y] = int(lum > 127)
    return pic

def getDigit(n):
    return n // 500

def loadData(filename):
    img = getImage(filename)
    out = [0] * 5000
    for n in range(5000):
        out[n] = extractPicture(img, n)
    return out

def predict(pic0):
    distances = []
    for n in range(0, 5000):
        if n in testSample:
            continue
        pic = samples[n]
        distance = euklidian(pic0, pic)
        distances.append([n, distance])
    sorted_distances = sorted(distances, key = itemgetter(1))
    nearestPic = sorted_distances[0][0]
    return getDigit(nearestPic)

print "Loading data..."
samples = loadData("digits.png")
testSample = random.sample(range(0, 5000), 100) # 100 out of 5000
hits = 0
print "Starting test set."
for i in range(100):
    n = testSample[i]
    actual = getDigit(n)
    print "Test #", i, ": Actual digit:", actual,
    pic = samples[n]
    perceived = predict(pic)
    if perceived == actual:
        hits += 1
    print "- Perceived digit:", perceived, "-->", (perceived == actual)
print "Result: Correctly preceived", hits, "out auf 100."
