% test02     Sammenligner/tester Matlab, C og Java for Vector Selection

%----------------------------------------------------------------------
% Copyright (c) 2003.  Karl Skretting.  All rights reserved.
% Hogskolen in Stavanger (Stavanger University), Signal Processing Group
% Mail:  karl.skretting@tn.his.no   Homepage:  http://www.ux.his.no/~karlsk/
% 
% HISTORY:  dd.mm.yyyy
% Ver. 1.0  15.05.2003  KS: function made
% Ver. 2.0  20.01.2005  KS: vil også teste Java program her
% Ver. 2.1  18.03.2005  KS: noen oppdateringer
%----------------------------------------------------------------------

clear all
Mfile='test02';
ErrMessage='ok';

randn('state',203);
N=16;K=40;P=1;S=7;L=1200;   % moderat stort
%N=32;K=80;P=1;S=12;L=1000;  % noe større

global F FF   % nødvendig for VSormp
F=randn(N,K);
F=NormalizeF(F);
FF=F'*F;

X=randn(N,L);

if 1
    X(:,2)=2*F(:,22)+0.3*F(:,12)+0.93*F(:,14);
end

x=X(:)'*X(:);
disp([Mfile,': Total sum av X kvadrert (',int2str(N),'x',int2str(L),') : ',num2str(x)]);
%
% Sammenligner Matlab, C og Java
disp('-- Sammenligner Matlab, C og Java -- ');
disp(['Kjører nå ',which('VSblock')]);
for i=[1,4,5,6] 
    tic;
    if (i==1); algt='VSmp2'; end;
    if (i==4); algt='VSomp'; end;
    if (i==5); algt='VSormp'; end;
    if (i==6); algt='VSfomp2'; end;
    W=VSblock(X,F,S*ones(1,L),algt);
    t2=toc; 
    R=X-F*W;
    r=R(:)'*R(:);
    w=W(:)'*W(:);
    disp(['Tid algoritme ',algt,', S=',int2str(S),', t2=',num2str(t2,'%5.2f'),...
        ', og feil kvadrert =',num2str(r,'%5.1f'),', norm(W) kvadrert =',num2str(w,'%5.1f')]);
end
disp(['Kjører nå ',which('VSblockC')]);
for i=[1,4,5] % i=[1,2,3,4,5];
    tic;
    W=VSblockC(X,F,S,i);
    t2=toc; 
    R=X-F*W;
    r=R(:)'*R(:);
    w=W(:)'*W(:);
    disp(['Tid algoritme ',int2str(i),', S=',int2str(S),', t2=',num2str(t2,'%5.2f'),...
        ', og feil kvadrert =',num2str(r,'%5.1f'),', norm(W) kvadrert =',num2str(w,'%5.1f')]);
end

%  Funksjonen VSblockJ virket for tidlige versjoner av BlockFrame men ikke
%  nå lenger. Tidsforbruket viste at den måten å gjøre dette på ikke er
%  god. Resultata da ble:
%     -- Sammenligner Matlab, C og Java -- 
%     Kjører nå d:\karl\matlab\FrameTools\VSblock.m
%     Tid algoritme VSfomp2, S=12, t2=2.39, og feil kvadrert =2594.8, norm(W) kvadrert =60408.1
%     Tid algoritme VSomp, S=12, t2=2.27, og feil kvadrert =2717.9, norm(W) kvadrert =54916.1
%     Tid algoritme VSormp, S=12, t2=2.27, og feil kvadrert =2590.6, norm(W) kvadrert =60454.2
%     Kjører nå D:\karl\VS2003\VSblockC.m
%     Tid algoritme 4, S=12, t2=0.33, og feil kvadrert =2722.6, norm(W) kvadrert =54856.2
%     Tid algoritme 5, S=12, t2=0.33, og feil kvadrert =2594.8, norm(W) kvadrert =60408.1
%     Kjører nå D:\karl\VS2003\VSblockJ.m
%     Tid algoritme 4, S=12, t2=2.70, og feil kvadrert =2722.6, norm(W) kvadrert =54856.2
%     Tid algoritme 5, S=12, t2=2.70, og feil kvadrert =2594.8, norm(W) kvadrert =60408.1

if 1     % bruk av partiell søking og enkel matlab funksjon
    disp(['Kjører nå partiell søk med ',which('VSblockC')]);
    for M=[10,50] % M=[10,20,50,100,400,1000]    % ca 200 s for M=1000 (L=2000, N=16, K=40, S=7)
        tic;
        W=VSblockC(X,F,S,6,M);
        t2=toc; 
        R=X-F*W;
        r=R(:)'*R(:);
        w=W(:)'*W(:);
        disp(['Tid VSps (C++), M=',int2str(M),', S=',int2str(S),', t2=',num2str(t2,'%5.2f'),...
                ', og feil kvadrert =',num2str(r,'%5.1f'),', norm(W) kvadrert =',num2str(w,'%5.1f')]);
    end
    tic;
    disp(['Kjører nå hver vektor for seg med ',which('VSormp')]);
    W=zeros(K,L);
    for l=1:L
        x=X(:,l);
        w=VSormp(x,S);   % FrameTools function
        W(:,l)=w;
    end
    t2=toc; 
    R=X-F*W;
    r=R(:)'*R(:);
    w=W(:)'*W(:);
    disp(['Tid VSormp, S=',int2str(S),', t2=',num2str(t2,'%5.2f'),...
        ', og feil kvadrert =',num2str(r,'%5.1f'),', norm(W) kvadrert =',num2str(w,'%5.1f')]);
end

if 1   % java klasse BlockFrame
    disp('-- Nå brukes Java.');
    fr = BlockFrame(N,K,F(:));
    fr.makeUniform;
    fr.setVerboseLevel(2);
    if 1
        disp(['Fra java-klassen: fr.getN=',int2str(fr.getN)]);   % merk brukere ikke getN()
        disp(['Fra java-klassen: fr.getK=',int2str(fr.getK)]);
        disp('Merk indeksering i java objektet, funksjonen getIpValue.');
        disp(['Fra java-klassen: fr.getIpValue(4,7)=',num2str(fr.getIpValue(4,7)),...
                ' og fra rammen FF(5,8) : ',num2str(FF(5,8))]);  % merk indeksering!
    end
    tic;
    W=zeros(K,L);
    for l=1:L
        W(:,l)=fr.vsBMP(X(:,l), int32(S));
    end
    t2=toc; 
    R=X-F*W;
    r=R(:)'*R(:);
    w=W(:)'*W(:);
    disp(['Tid fr.vsBMP (Java klasse BlockFrame), S=',int2str(S),', t2=',num2str(t2,'%5.2f'),...
        ', og feil kvadrert =',num2str(r,'%5.1f'),', norm(W) kvadrert =',num2str(w,'%5.1f')]);
    tic;
    W=zeros(K,L);
    for l=1:L
        W(:,l)=fr.vsOMP(X(:,l), int32(S));
    end
    t2=toc; 
    R=X-F*W;
    r=R(:)'*R(:);
    w=W(:)'*W(:);
    disp(['Tid fr.vsOMP (Java klasse BlockFrame), S=',int2str(S),', t2=',num2str(t2,'%5.2f'),...
        ', og feil kvadrert =',num2str(r,'%5.1f'),', norm(W) kvadrert =',num2str(w,'%5.1f')]);
    tic;
    W=zeros(K,L);
    for l=1:L
        W(:,l)=fr.vsORMP(X(:,l), int32(S));
    end
    t2=toc; 
    R=X-F*W;
    r=R(:)'*R(:);
    w=W(:)'*W(:);
    disp(['Tid fr.vsORMP (Java klasse BlockFrame), S=',int2str(S),', t2=',num2str(t2,'%5.2f'),...
        ', og feil kvadrert =',num2str(r,'%5.1f'),', norm(W) kvadrert =',num2str(w,'%5.1f')]);
    %
    nComb=50;
    tic
    W=zeros(K,L);
    for l=1:L
        W(:,l)=fr.vsPS(X(:,l), int32(S), 1e-4, int32(nComb));
    end
    t2=toc; 
    R=X-F*W;
    r=R(:)'*R(:);
    w=W(:)'*W(:);
    disp(['Tid fr.vsPS, nComb=',int2str(nComb),', S=',int2str(S),', t2=',num2str(t2,'%5.2f'),...
        ', og feil kvadrert =',num2str(r,'%5.1f'),', norm(W) kvadrert =',num2str(w,'%5.1f')]);
end

if 1   % tester med å behandle M (delelig med L) blokker om gangen
    disp('-- Lager en utvidet ramme.');
    M=6;
    frM = BlockFrame(fr,M);
    % og lager ny ramme i F
    F0=F;
    F=zeros(N*M,K*M);
    for m=1:M
        F((1:N)+(m-1)*N,(1:K)+(m-1)*K)=F0;
    end
    Fm=F;
    FF=F'*F;
    K=K*M;N=N*M;S=S*M;L=L/M;
    disp([Mfile,': Nå settes N=',int2str(N),', K=',int2str(K),', L=',int2str(L),' og S=',int2str(S)]);
    X=reshape(X,N,L);
    W=zeros(K,L);
    x=zeros(N,1);
    w=zeros(K,1);
    disp(['Kjører nå ',which('VSblockC')]);
    for i=[1,4,5] % i=[1,2,3,4,5];
        tic;
        W=VSblockC(X,F,S,i);
        t2=toc; 
        R=X-F*W;
        r=R(:)'*R(:);
        w=W(:)'*W(:);
        disp(['Tid algoritme ',int2str(i),', S=',int2str(S),', t2=',num2str(t2,'%5.2f'),...
                ', og feil kvadrert =',num2str(r,'%5.1f'),', norm(W) kvadrert =',num2str(w,'%5.1f')]);
    end
    %
    tic;
    for l=1:L
        x=X(:,l);
        w=VSormp(x,S);   % FrameTools function
        W(:,l)=w;
    end
    t2=toc; 
    R=X-F*W;
    r=R(:)'*R(:);
    w=W(:)'*W(:);
    disp(['Tid VSormp (for hver vektor), S=',int2str(S),', t2=',num2str(t2,'%5.2f'),...
        ', og feil kvadrert =',num2str(r,'%5.1f'),', norm(W) kvadrert =',num2str(w,'%5.1f')]);
    %
    tic;
    W=zeros(K,L);
    for l=1:L
        W(:,l)=frM.vsBMP(X(:,l), int32(S));
    end
    t2=toc; 
    R=X-F*W;
    r=R(:)'*R(:);
    w=W(:)'*W(:);
    disp(['Tid frM.vsBMP (Java klasse BlockFrame), S=',int2str(S),', t2=',num2str(t2,'%5.2f'),...
        ', og feil kvadrert =',num2str(r,'%5.1f'),', norm(W) kvadrert =',num2str(w,'%5.1f')]);
    tic;
    W=zeros(K,L);
    for l=1:L
        W(:,l)=frM.vsORMP(X(:,l), int32(S));
    end
    t2=toc; 
    R=X-F*W;
    r=R(:)'*R(:);
    w=W(:)'*W(:);
    disp(['Tid frM.vsORMP (Java klasse BlockFrame), S=',int2str(S),', t2=',num2str(t2,'%5.2f'),...
        ', og feil kvadrert =',num2str(r,'%5.1f'),', norm(W) kvadrert =',num2str(w,'%5.1f')]);
    disp('En legger merke til at nå går Java like raskt (raskere?) som C-implemeteringen.');
    % setter tilbake F og FF (og N, K, S, og L)
    N = N/M;
    K = K/M;
    F=F0;     
    FF=F'*F;          
    S=S/M;
    L=L*M;
    X=reshape(X,N,L);
end

if 1    % test overlappende ramme
    disp('-- Lager en overlappende ramme.');
    fro = OverlappingFrame(fr);
    fro.makeUniform;
    tic;
    w=fro.vsGMP(X(:),S*L);
    t2=toc;
    W=reshape(w,K,L);
    R=X-F*W;
    r=R(:)'*R(:);
    w=W(:)'*W(:);
    disp(['Tid fro.vsGMP (Java klasse OverlappingFrame), S=',int2str(S),', t2=',num2str(t2,'%5.2f'),...
            ', og feil kvadrert =',num2str(r,'%5.1f'),', norm(W) kvadrert =',num2str(w,'%5.1f')]);
    %
    Stab=sum(W ~= 0);
    tic;
    W=zeros(K,L);
    for l=1:L
        W(:,l)=fr.vsORMP(X(:,l), int32(Stab(l)));
    end
    t2=toc; 
    R=X-F*W;
    r=R(:)'*R(:);
    w=W(:)'*W(:);
    disp(['Tid fr.vsORMP (Java klasse BlockFrame) og Stab, t2=',num2str(t2,'%5.2f'),...
        ', og feil kvadrert =',num2str(r,'%5.1f'),', norm(W) kvadrert =',num2str(w,'%5.1f')]);
    % 
    F=Fm;   FF=F'*F;
    K=K*M;N=N*M;S=S*M;L=L/M;
    X=reshape(X,N,L);
    W=reshape(W,K,L);
    Stab=sum(W ~= 0);
    tic;
    W=zeros(K,L);
    for l=1:L
        W(:,l)=frM.vsORMP(X(:,l), int32(Stab(l)));
    end
    t2=toc; 
    R=X-F*W;
    r=R(:)'*R(:);
    w=W(:)'*W(:);
    disp(['Tid frM.vsORMP (Java klasse BlockFrame) og Stab, t2=',num2str(t2,'%5.2f'),...
        ', og feil kvadrert =',num2str(r,'%5.1f'),', norm(W) kvadrert =',num2str(w,'%5.1f')]);
    nComb=50;
    tic
    W=zeros(K,L);
    for l=1:L
        W(:,l)=frM.vsPS(X(:,l), int32(Stab(l)), 1e-4, int32(nComb));
    end
    t2=toc; 
    R=X-F*W;
    r=R(:)'*R(:);
    w=W(:)'*W(:);
    disp(['Tid frM.vsPS, nComb=',int2str(nComb),', S=',int2str(S),', t2=',num2str(t2,'%5.2f'),...
        ', og feil kvadrert =',num2str(r,'%5.1f'),', norm(W) kvadrert =',num2str(w,'%5.1f')]);
    % setter tilbake til F0
    F=F0;         FF=F'*F;          
    S=S/M;    N = N/M;    K = K/M;    L=L*M;
    X=reshape(X,N,L);
    W=reshape(W,K,L);
    Stab=sum(W ~= 0);
    nComb=50;
    tic
    W=zeros(K,L);
    for l=1:L
        W(:,l)=fr.vsPS(X(:,l), int32(Stab(l)), 1e-4, int32(nComb));
    end
    t2=toc; 
    R=X-F*W;
    r=R(:)'*R(:);
    w=W(:)'*W(:);
    disp(['Tid fr.vsPS, nComb=',int2str(nComb),', S=',int2str(S),', t2=',num2str(t2,'%5.2f'),...
        ', og feil kvadrert =',num2str(r,'%5.1f'),', norm(W) kvadrert =',num2str(w,'%5.1f')]);
end

return