
%tanitas Lmax lepesben (minden tanitas soran veletlenszeru sorrendben
%vegigmegy az osszes mintan
Lmax=5000;

%kijelzes DLepes-enkent
DLepes=200;



ThetaTanulasFlag=input('Tanitjuk a szakértõket (alapértelmezes: igen)?    valaszok 1:igen, 0: nem  ');
if isempty(ThetaTanulasFlag) ,ThetaTanulasFlag=1; end 
VTanulasFlag=input('Tanitjuk a kapuzo hálózatot (alapértelmezes: igen)?    valaszok 1:igen, 0: nem  ');
if isempty(VTanulasFlag) ,VTanulasFlag=1; end 
Exp2LinearisFlag=input('A második szakértõ nemlin/lin (alapértelmezes: lineáris)?    valaszok  2: nemlineáris (szigmoid)    1:lineáris,  ');
if isempty(Exp2LinearisFlag) || ((Exp2LinearisFlag~=1) && (Exp2LinearisFlag~=2)),Exp2LinearisFlag=1; end 
KezdetiErtek=input('Kezdeti ertek beallitas (alapertelmezes: 3)?     valaszok (1,2,3,4,5):  ');
if isempty(KezdetiErtek) || ((KezdetiErtek~=1) && (KezdetiErtek~=2) && (KezdetiErtek~=3) && (KezdetiErtek~=4) && (KezdetiErtek~=5)), KezdetiErtek=3; end

%% x-y a megkozeliteni kivant nemlinearitas
% Bemeno adatok eloallitasa: [XLlim,X12lim] tartomanyban linearis,
% [X12lim,XHlim] tartomanyban negyzetes fuggveny szerint;

XLlim=0;   % a vizsgált tartomány alsó széle
XHlim=10;  % a vizsgált tartomány felsõ széle
N=100;     % a mintapontok száma
Dx=(XHlim-XLlim)/N;

X12lim=5;

C11=4;
C20=0;
C21=2;
C22=-2;

x=[XLlim:Dx:XHlim];   % sorvektor

[Nx,Mx]=size(x);

for kk=1:Mx
   if x(kk)<X12lim
      y(kk)=C11*x(kk);
   else
      y(kk)=C11*X12lim+C22*(x(kk)-X12lim)^2+C21*(x(kk)-X12lim)+C20;
   end
end
y=y/max(y);

%% a ket szakerto parametervektor ertekei kezdetben
%kezdeti ertekek
if KezdetiErtek==1
    v1=[1.5 -0.3]';		%elso pelda: relative nem rosszak a parameterek
    v2=[-1.5 0.3]';
    T1=[-0.3 0.1]';
    T2=[1.2 -0.3]';     %for linear and sigmoid nonlin
elseif KezdetiErtek==2
    v1=[-10 0]';			%masodik pelda
    v2=[-1.5 0.3]';         % a kapuzo parameterek nagyon rosszak (v1 valtozott 1-hez kepest, hat mindketto sulyara)
    T1=[-0.3 0.1]';
    T2=[1.2 -0.3]';
elseif KezdetiErtek==3
    v1=[2.5 -0.3]';		%harmadik pelda:
    v2=[-2.5 0.3]';
    T1=[-0.8 -0.5]';     %az elso szakerto indulo parametere rossz, de egyik vege legalabb a kivant gorbe kozeleben van
    T2=[5 -1]';        % a masodik szakerto linearisra jo, nemlinearisra rossz
elseif  KezdetiErtek==4
    v1=[2.5 -0.3]';		%negyedik pelda:
    v2=[-2.5 0.3]';
    T1=[-4 0]';     %az elso szakerto indulo parametere NAGYON rosszak, mindenutt tavol a kivant gorbetol
    T2=[-10 1]';
else
    v1=[3.5 -0.3]';		%negyedik pelda:
    v2=[-2.5 0.3]';
    T1=[2 -0.2]';     %az elso szakerto szinten a jobboldali szakaszt kozeliti jobban indulsakor, akarcsak a masodik
    T2=[-10 1]';

end



mu=0.0005;               %batorsagi faktor



u1Vekt=T1'*[ones(1,Mx);x];   % elso szakerto mindig linearis
%masodik szakerto lehet lin vagy nemlin:
if Exp2LinearisFlag==1
    u2Vekt=T2'*[ones(1,Mx);x]; 
elseif Exp2LinearisFlag==2
    u2Vekt=-1*(1-exp(-T2'*[ones(1,Mx);x]))./(1+exp(-T2'*[ones(1,Mx);x]));
end        %T2'*[ones(1,Mx);x];
%a szakertokkiindulo sulyai:
sumgVekt=exp(v1'*[ones(1,Mx);x])+exp(v2'*[ones(1,Mx);x]);
g1Vekt=exp(v1'*[ones(1,Mx);x])./sumgVekt;
g2Vekt=exp(v2'*[ones(1,Mx);x])./sumgVekt;

uVekt=g1Vekt.*u1Vekt+g2Vekt.*u2Vekt;    % a MOE struktura kimenete
figure(1),
plot(x,y,'k*',x,u1Vekt,'r.',x,u2Vekt,'g.',x,uVekt,'m.'),          % a kozeliteni kivant nemlinearitas, es a ket szakerto
hold on
plot(x,g1Vekt,'r',x,g2Vekt,'g'),      % a ket szakerto a priori valoszinusege (sulya)        
title('KIINDULO HELYZET   piros: 1. szakerto, ill. sulya     zold: 2. szakerto, ill. sulya    lila: eredo megoldas')
pause
hold off

%% ------------------------------------
%MOE tanitasa: 1 bemenet, 1 kimenet, ket szakerto
%    szakerto #1 linearis u1=[t10  t11]*[1  x]'= T1*x1'
%    szakerto #2 
%       VAGY sigmoid  u2=-(tanh([t21  t22]*[1 x]'))=-(1-exp(-T2'*x1))./(1+exp(-T2'*x1)) 
%       VAGY a masodik is linearis szakerto!!!!
%
% a szakertokhoz egysegnyi Gauss eloszlasu zajt aszocialunk a tanitasnal




for kk=1:Lmax
    iiVekt=randperm(Mx);         %veletlen minta index
    for ii=1:Mx               %- - - - - - - 
        xL=x(iiVekt(ii));
        yL=y(iiVekt(ii));
        xL1=[1 xL]';                         %bemeneti minta eltolassal (bias)
        sumg=exp(v1'*xL1)+exp(v2'*xL1);
        g1=exp(v1'*xL1)/sumg;     %az elso szakerto sulya (a priori valoszinusege) a mintapontnal
        g2=exp(v2'*xL1)/sumg;        %g1 es g2 a priori valoszinusegek szamitasa

        u1=T1'*xL1;                  %elso linearis kimenete
        if Exp2LinearisFlag==1     %a masodik LIN/NEMLIN szakerto kimenete
            u2=T2'*xL1; 
        elseif Exp2LinearisFlag==2   % sigmoid nemlinearitas
            u2=-1*(1-exp(-T2'*xL1))/(1+exp(-T2'*xL1)); 
        end 

        pyLxL1=exp(-(yL-u1)^2/2);    %az elso linearis szakerto milyen valoszinuseggel adna jo eredmenyt (a normalizalas kiesik, mert azonosak a szorasok)
        pyLxL2=exp(-(yL-u2)^2/2);

        h1=g1*pyLxL1/(g1*pyLxL1+g2*pyLxL2);  % a posteriori valoszinusegek
        h2=g2*pyLxL2/(g1*pyLxL1+g2*pyLxL2);


        DT1=mu*h1*(yL-u1)*xL1;           %az elso szakerto paramvektoranak tanitasa
        if Exp2LinearisFlag==1  %a masodik szakerto paramvektoranak tanitasa az alkalmazott nemlinearitasnak megfeleloen
            DT2=mu*h2*(yL-u2)*xL1;            %lineáris
        elseif Exp2LinearisFlag==2
            DT2=mu*h2*(yL-u2)*  (-1*(1+u2)*(1-u2))  *xL1;  % szigmoid derivalt: (1+s)*(1-s)
        end
   
   %[xL yL u1 (T1+DT1)'*xL1 u2 -(1-exp(-(T2+DT2)'*xL1))/(1+exp(-(T2+DT2)'*xL1))]
%% itt tortenik a tenyleges modositas
        if ThetaTanulasFlag
            T1=T1+DT1;
            if Exp2LinearisFlag==1     %a masodik LIN/NEMLIN szakerto kimenete
                T2=T2+DT2;                 %LIN eset
            elseif Exp2LinearisFlag==2     %a masodik NEMLIN szigmoid szakerto kimenete
                T2=T2+DT2;
           end
        end

        if VTanulasFlag  %mindig lináris kapuzó hálózat
            v1=v1+mu*(h1-g1)*xL1;     %kapuzo halozat paramvektor tanitasa
            v2=v2+mu*(h2-g2)*xL1;
        end
%% tenyleges modositas vege
        
    end               % for ii=1:Mx - - - - - - - 

%   DLepes-enkent kijelzes
    if kk==DLepes*floor(kk/DLepes)
    % a kivant valasz es a ket szakerto valaszai
        figure(2);          %hold off, 
        u1Vekt=T1'*[ones(1,Mx);x];
        if Exp2LinearisFlag==1 
            u2Vekt=T2'*[ones(1,Mx);x]; 
        elseif Exp2LinearisFlag==2
            u2Vekt=-1*(1-exp(-T2'*[ones(1,Mx);x]))./(1+exp(-T2'*[ones(1,Mx);x]));
        end
        plot(x,y,'k*',x,u1Vekt,'r.',x,u2Vekt,'g.'),          % a kozeliteni kivant nemlinearitas es a ket szakerto valasza
        title(['tanitasi ciklus: ' num2str(kk) '   fekete a kívánt rendszer válasz, vörös és zöld a két szakértõ válasza']),
%        hold on
    %a ket szakerto sulyai a vizsgalt tartomanyban
        sumgVekt=exp(v1'*[ones(1,Mx);x])+exp(v2'*[ones(1,Mx);x]);
        g1Vekt=exp(v1'*[ones(1,Mx);x])./sumgVekt;
        g2Vekt=exp(v2'*[ones(1,Mx);x])./sumgVekt;
        figure(4),plot(x,g1Vekt,'r',x,g2Vekt,'g'),
        title(['tanitasi ciklus: ' num2str(kk)  '    a két szakértõ súlya a vizsgált tartományban'])
        
        uVekt=g1Vekt.*u1Vekt+g2Vekt.*u2Vekt;    % a MOE struktura kimenete
    % a kivant valasz es a MOE eredo valasza
        figure(3),
        plot(x,y,'k*',x,uVekt,'m.'),
        title(['tanitasi ciklus: ' num2str(kk) '    a MOE struktura eredõ kimenete - magenta'])
        drawnow,
        pause(2)
    end

end


% u1Vekt=T1'*[ones(1,Mx);x];
% if Exp2LinearisFlag, u2Vekt=T2'*[ones(1,Mx);x]; else u2Vekt=-(1-exp(-T2'*[ones(1,Mx);x]))./(1+exp(-T2'*[ones(1,Mx);x]));end
% sumgVekt=exp(v1'*[ones(1,Mx);x])+exp(v2'*[ones(1,Mx);x]);
% g1Vekt=exp(v1'*[ones(1,Mx);x])./sumgVekt;
% g2Vekt=exp(v2'*[ones(1,Mx);x])./sumgVekt;
% 
% uVekt=g1Vekt.*u1Vekt+g2Vekt.*u2Vekt;    % a MOE struktura kimenete
% figure(3)
% plot(x,y,'k.',x,uVekt,'m.')
