function [siec, wynikowy, wprowadzony, wynik, uczacy]=myOCRmlp(nowy)
%% funkcja prostego OCR-u opartego na metodzie wstecznej propagacji bledu w
%% dwuwarstwowej sieci (z warstwa ukryta) bez sprzezenia zwrotnego.
%%
%% autor: Kacper Kulczycki (c) 2006
%%
%% funkcja byla programem zaliczeniowym kursu "Sieci neuropodobne"
%% prowadzonego przez dr Jaroslawa Zygierewicza
%%
%% uzycie: [siec, wynikowy, wprowadzony, wynik, uczacy]=myOCRmlp(nowy)
%% argument nowy=0 - tworzy siec, inne przypadki czyta z obiektu net ktory
%% jest struktura sieci 
%%
%% wymaga uzycia plikow: 
%% mlp.m, netopt.m, netgrad.m, linemin.m, minbrack.m, mlpprior.m, mlppak.m,
%% mlpunpak.m, mlpfwd.m, mlperr.m, mlpbkp.m, consist.m, errbayes.m, gbayes.m,
%% maxitmess.m, mlpgrad.m, neterr.m, netpak.m, netunpak.m
%% bfgs.m (metoda ???)
%% graddesc.m (metoda Gradient descent),
%% scg.m (metoda Scaled conjugate gradient),
%% hmc.m (metoda Monte Carlo),
%% conjgrad.m (metoda Conjugate gradients),
%% quasinew.m (metoda Quasi-Newton)
%% oraz plikow wzorow: 
%% litera-a.dat, litera-b.dat, ... litera-z.dat

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% ladowanie wzorow liter do macierzy alfabet
global net;
global L_ukryt;
global L_wzorow;
global D_wys;
global D_dlug;
disp('wczytuje wzory liter');

 L_ukryt=28; % liczba neuronow w warstwie ukrytej
 L_wzorow=26; % liczba rozpoznawanych wzorow (znakow)
 D_wys=7; % wysokosc macierzy "obrazka jednego znaku"
 D_dlug=5; % dlugosc  macierzy "obrazka jednego znaku"

litery=['a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'];
alfabet=zeros(L_wzorow,D_wys,D_dlug);

for ij=1:L_wzorow,
    alfabet(ij,:,:)=load(sprintf('litera-%s.dat',litery(ij)));
    disp(sprintf('wczytalem litere: %s',litery(ij)));
end
alfabet=mod(alfabet-2,2); % zamiana 1->0 i 0->1
alfabet=alfabet*255; % przerobienie macierzy wzorcow na skale szarosci
disp('wcisnij cos by kontynuowac');
pause;

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% przerobienie macierzy wzorow 3D (26,7,5) na macierz 2D (26,35)
disp('teraz przerabiam wzory do strawnej postaci');
indeks=0;
for jk=1:L_wzorow,
    for kl=1:D_wys,
        for lm=1:D_dlug,
            indeks=indeks+1;
            wzory(jk,indeks)=alfabet(jk,kl,lm);
        end
    end
    indeks=0;
end
disp('wcisnij cos by kontynuowac');
pause;

if(nowy==0)
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    %inicjalizacja sieci
    disp('teraz tworze siec');
  %%  net = mlp((D_wys*D_dlug), L_ukryt, L_wzorow, 'logistic',0.00008);
    %% wektor opcji opisany w pliku scg.m
    options(1)=-1; % wyswietlanie wartosci bledow - aby usunac - ustawic wartosc na "-1"
    options(2)= 0.001; % satysfakcjonujaca wartosc bledu
    options(9)=0; % definiowanie "funkcji zmian" przez uzytkownika - aby wlaczyc - ustawic wartosc na "1"
    options(10)=0; % definiowanie ilosci ewaluacji funkcji zmian
    options(11)=0; % definiowanie ilosci ewaluacji zmian
    options(14)=3000; % maksymalna ilo¶æ iteracji - domyslnie 100
    options(18)=0; % ????
    errlog=100;
    disp('siec gotowa teraz pozostaje zmudna nauka');
end
dopowiedz='y';
odpowiedz=input('czy chcesz uczyc siec Y/N? ','s');
if (odpowiedz=='y'| odpowiedz=='Y' | odpowiedz=='T' | odpowiedz=='t')
     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    % tworzenie ciagu uczacego
    disp('teraz tworze ciag uczacy');
    uczacy=zeros((6*L_wzorow),(D_wys*D_dlug));
    wynikowy=zeros((6*L_wzorow),L_wzorow);
    for jm=1:(6*L_wzorow),
        ix=ceil(L_wzorow*rand()); % losowanie wzoru
        uczacy(jm,:)=round(abs(wzory(ix,:)-rand(1,(D_wys*D_dlug))*8*2.55)); % wektor zaszumiony
        wynikowy(jm,ix)=1;% macierz rzutowa na przestrzen wynikow (wzorow)
    end
    disp('wcisnij cos by kontynuowac');
    pause;
    while errlog(end)>1
        [net, options, errlog] = netopt(net, options, (uczacy), wynikowy, 'scg');
    end
    siec=net;
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%sprawdzamy efekty nauki

disp('sprawdzmy czy nauka nie poszla w las');
probny_test=zeros(L_wzorow,(D_wys*D_dlug));
for kh=1:L_wzorow,
    probny_test(kh,:)=wzory(kh,:); % wektor bezszumowy
end
wynik_test=zeros(L_wzorow,L_wzorow);
for fg=1:L_wzorow,
wynik_test(fg,:)=mlpfwd(net,probny_test(fg,:));
[wart_maks_test(fg), index_maks_test(fg)]=max(wynik_test(fg,:));
end
for vc=1:L_wzorow,
disp(sprintf('wczytalem: %s dopasowalem: %s',litery(vc), litery(index_maks_test(vc))));
end
odp_err=2; % obsluga bledu interface'u uzytkownika
while (odp_err~=1)
    odp=input('czy chcesz kontynuowac Y/N? ','s');
    switch odp
        case {'y','Y','t','T'}
            szum_err=0;%obsluga bledu interface'u uzytkownika
            while (szum_err~=1)
                szum=input('podaj poziom szumu w przedziale od 0 do 100 (w procentach): ');
                if (szum<101 & szum>(-1))
                    pomoc=zeros(L_wzorow);
                    iy=ceil(L_wzorow*rand()); % losowanie wzoru
                    wprowadzony=round(abs((wzory(iy,:)-szum*rand(1,D_wys*D_dlug)*2.55))); % wektor zaszumiony
                    wynik=mlpfwd(net,wprowadzony);% przepuszczamy przez siec
                    disp(sprintf('wylosowalem litere %s',litery(iy)));
                    [wart_maks, index_maks]=max(wynik);
                    disp(sprintf('dopasowana litera %s',litery(index_maks)));
                    colormap(gray);
                    wzor_bitmap=[wzory(iy,1:5);wzory(iy,6:10);wzory(iy,11:15);wzory(iy,16:20);wzory(iy,21:25);wzory(iy,26:30);wzory(iy,31:35)];
                    wprowadzony_bitmap=[wprowadzony(1,1:5);wprowadzony(1,6:10);wprowadzony(1,11:15);wprowadzony(1,16:20);wprowadzony(1,21:25);wprowadzony(1,26:30);wprowadzony(1,31:35)];
                    odzyskany_bitmap=[wzory(index_maks,1:5);wzory(index_maks,6:10);wzory(index_maks,11:15);wzory(index_maks,16:20);wzory(index_maks,21:25);wzory(index_maks,26:30);wzory(index_maks,31:35)];
                    subplot(1,3,2);
                    title('zaszumiony')
                    axis equal
                    imagesc(wprowadzony_bitmap);
                    subplot(1,3,1);
                    title('wzor')
                    axis equal
                    imagesc(wzor_bitmap);
                    subplot(1,3,3);
                    title('dopasowany')
                    axis equal
                    imagesc(odzyskany_bitmap);
                    szum_err=1;
                else
                    szum_err=1;
                    disp('nie pracuje z analfabetami');
                end
            end
        case {'n','N'}
            disp('dziekuje za wspolprace');
            odp_err=1;
        otherwise
            if (odp_err==2)
                disp('czy nie umiesz czytac?');
                odp_err=0;
            else
                disp('widze ze to ty masz klopoty z czytaniem, a ja koncze swoje dzilanie');
                odp_err=1;
            end
    end
end