%% Matlab-Skript fuer "Einfuehrung in Intelligente Systeme"
% Wintersemester 2007/2008
% Uebungsaufgabe 13, Demonstration und Werteberechnung
% erstellt mit Matlab 2007b
% Trainieren von Schwellenwertelementen: Negation mit Online-Lernen
% by Georg Ru\ss: russ@iws.cs.uni-magdeburg.de, 2007-11-08
% http://fuzzy.cs.uni-magdeburg.de/wiki/pmwiki.php?n=Lehre.ISE0708

%% Werte fuers Grid
resolution = 64;
W = zeros(1,resolution);
Theta = zeros(1,resolution);

% Parameter aus der Aufgabenstellung, aenderbar
eta = 0.5; %Lernrate
w = 1; %Anfangsgewicht
theta = 2; %Anfangsschwellwert
lernschritte = 50 % Anzahl Lernschritte

%% Erstellung des Grids

% range of w and theta
for i = 1:resolution
    W(1,i) = i;
    Theta(1,i) = i;
end
W = mapminmax(W,-2,2);
Theta = mapminmax(Theta,-2,2);

error_x0 = zeros(length(W),length(Theta));
error_x1 = zeros(length(W),length(Theta));

for i = 1:resolution
    for j = 1:resolution        
        % generate matrices for error surface
        error_0 = 0*W(1,i) + Theta(1,j);
        if (error_0 < 0)
            error_0 = 0;
        end
        error_x0(i,j) = error_0;
        
        error_1 = -1*W(1,i) + Theta(1,j);
        if (error_1 < 0)
            error_1 = 0;
        end
        error_x1(j,i) = error_1;
    end
end
error_sum = error_x0 + error_x1;

%% Trainingsvorgang

TH = [];
WW = [];
EE = [];
E = [];
X = [];
D = [];
Y = [];

xo = [0 1; 1 0];

for i = 1:lernschritte
    e = 0;
    
    for j = 1:size(xo,1);
  
% Achtung: e_surface ist nur fuer die graphische Darstellung gedacht,
% der Fehler des SWE ist in "e" gespeichert.

       e_surface_0 = theta
          if e_surface_0 < 0
            e_surface_0 = 0;
          end
          
        e_surface_1 = w - theta
          if e_surface_1 < 0
               e_surface_1 = 0;
          end
        e_surface = e_surface_0 + e_surface_1;
       
        
       TH = vertcat(TH,theta);
       WW = vertcat(WW,w);
       EE = vertcat(EE,e_surface);
       
        if ((w*xo(j,1)) >=theta)
            y = 1;
        else
            y = 0;
        end
       X = vertcat(X,xo(j,1)); 
       D = vertcat(D,xo(j,2));
       Y = vertcat(Y,y);
       theta = theta - eta*(xo(j,2)-y);             
       w = w + eta*(xo(j,2)-y)*xo(j,1);
       e = xo(j,2)-y;
       E = vertcat(E,e); 
       
    end
    
end
TH;
WW;
EE;

OUT = horzcat(X,D,Y,E,TH,WW,EE)


%% Plotten des Fehlergebirges und des Wegs von Gewicht/Schwellwert
clf;
%h = legend('test','test2', ...);
mesh(Theta,W,error_sum);
%set(h,'Interpreter','none');
hold on;
plot3(TH,WW,EE,'-ok')
