% ciclo main. Si impostano le costanti TEM, HUM, NOR per scegliere se
% identificare la temperatura, l'umidita' e se utilizzare i dati con
% varianza unitaria o no. la media è nulla.
% il file passa in rassegna i vari metodi di identificazione e salva i
% risultati in una struttura dati contenuta nel file Dati_Matrice_id.mat



clc
clear all

warning off


load Dati_Matrice_chiuso.mat; %  QUI SI CARICANO I DATI PER L'IDENTIFICAZIONE
str=['Dati_Matrice_id_chiuso_prova_glar'];%  Nome del file di salvataggio

for k=1:length(Dati)
  
    y = Dati(k).t.y_org; 
    U = Dati(k).t.Udati_org;   
    
    %%%%%%%%%%%%%%%%%%%%%%%%%   
    varU = var(U);
    meanU = mean(U);

    for i=1:size(U,2)
       u(:,i) = (U(:,i)-meanU(i))/sqrt(varU(i));    
    end
    Dati(k).t.Udati_norm = u(:,:); % <- aggiunta del campo

    varY = var(y);
    meanY = mean(y);
    
    Dati(k).t.y_norm=(y(:,1)-meanY(1))/sqrt(varY(1));  % <- aggiunta del campo    
end

% ora salvo la Dati_Matrice a cui ho aggiunto i due campi.
save(str,'Dati')

len = length(Dati);

for k=1:len
    Dati(k).t.y_id = Dati(k).t.y_norm;
    Dati(k).t.Udati_id = Dati(k).t.Udati_norm;   
end




%% GLAR TEMPERATURA
    %%%%%% parametri variabili
    n_vet=[100 300 500];%input('# of measurements = ');%numero dati effettivi per la stima (50,300)
    maxp_GLARS = 30; % maximum order for GLARS;
    frac=1/3;% fraction of data used for validation/selection
    %%%%%%%%%%%%

    %creazione matrice ingressi U, vettore uscite y
    cont_tmp = 0;
    for num_sens=1:len

        for num_n=1:length(n_vet)
            
                 
            cont_tmp = cont_tmp+1;
            strt = [' glar temperatura ' num2str(cont_tmp) ' di ' num2str(len*length(n_vet))];
            disp(strt)
            fid = fopen('stato.txt', 'w' );
            fprintf(fid, strt);
            fclose(fid);
            
            n=n_vet(num_n);

            ntval=floor(frac*(n));%dimensione validation set

            U = Dati(num_sens).t.Udati_id;
            y = Dati(num_sens).t.y_id;

            yaLARS=y(1:(n-ntval),:);
            UaLARS=U(1:(n-ntval),:);
            yvalLARS=y((n-ntval+1):n,:);
            UvalLARS=U((n-ntval+1):n,:);

            clear AIK    
            tic
             try
                %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
                %%%%%%%%%% STIMA GLARS VALIDATION %%%%%%%%%%%%%%%%%%%%%%%%
                %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

                dat_val=iddata(yvalLARS,UvalLARS);
                t=0;
                for pl=1:1:maxp_GLARS;
                    t=t+1;
                    ll(t,:)=pl;
                    [Mgl,Mgls] = Dyn_GLARS_all_k(yaLARS,[],UaLARS,pl,1,0,yvalLARS,[],UvalLARS);
                    predd=predict(Mgl,dat_val);predd=iddata(predd);predd=predd.y;
                    RM1(t)=sum((predd-yvalLARS).^2);
                    predd=predict(Mgls,dat_val);predd=iddata(predd);predd=predd.y;
                    RM2(t)=sum((predd-yvalLARS).^2);
                end
                [q,w1]=min(RM1);ll(w1,:)
                [Mgl,Mgls] = Dyn_GLARS_all_k(yaLARS,[],UaLARS,ll(w1,:),1,0,yvalLARS,[],UvalLARS);

                %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

            
            catch exception
                 w1=1;
                 Mgl = NaN;
                 Mgls = NaN;
                 ll(w1,:) = NaN;
                 disp(['ite: sens ' num2str(num_sens) ' n: ' num2str(num_n) '. ' exception.message])
                    
            end
            toc
            id_glar(1,num_sens).mod(1,num_n) = struct('Mgl',Mgl,'Mgls',Mgls,'deg',ll(w1,:),'n',n);

        end
    end
    
        %%%%%%%%%% AGGIUNTA GLAR TEMPERATURA %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%


for i=1:len
    Dati(i).t.glar_norm = id_glar(i);
end

    save(str,'Dati')



