function [ w ] = perceptron(DATA, LUOKKA, piirra)

    R = max(norm(DATA));
    marginaali = 0.5;
    
    T = R^2 / marginaali^2;
%   T

%    max(LUOKKA)
%    min(LUOKKA)
%    figure;
%    T = 100;
    d = length(DATA(1,:));
%    w = ones(d,1);
    w = zeros(d,1);
    n = length(LUOKKA);
    hilight = 1;
    
    for round = 1:T,
        update = false;
        new_w = w;
        for i = 1:n,
            x_i = DATA(i,:);
            y_i = LUOKKA(i,:);
            yhattu_i = sign(x_i * w);
            if yhattu_i ~= y_i;
                new_w = w + y_i * x_i';
                update = true;
                hilight = i;
                break;
            end
        end
        
        if piirra,
            plottaa(DATA, LUOKKA, w, round, hilight);
        end
        w = new_w;
        
        if update == false,
            break;
        end
    end
end

function [ ret ] = plottaa(DATA, LUOKKA, w, round, hilight)
%
% x*w = 0 <=> x1 * w1 + x2*w2 = 0 <=> x2*w2 = -x1*w1 <=> x2 = -w1/w2 * x1
%
        subplot(5,5,round);
        minx = min(DATA(1,:));
        maxx = max(DATA(1,:));
        foo1 = (minx:0.1:maxx)';
        foo2 = foo1 * (-w(1)/w(2));
        
        X = DATA(:,1);
        Y = DATA(:,2);
        hold on
        % Plot data dots
        plot(X(LUOKKA > 0), Y(LUOKKA > 0), 'g.');
        plot(X(LUOKKA < 0), Y(LUOKKA < 0), 'r.');
        plot(X(hilight), Y(hilight), 'bo');
        axis image;
        axis manual;
        % Plot classifier w
        plot(foo1, foo2, '-');
        hold off
        xlabel(sprintf('w = (%f,%f)\nhilight = (%f, %f)', w(1), w(2), X(hilight), Y(hilight) ));
end
