%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%                             Function stima                              %%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

% input:  Potenze ricevute dai nodi ancora in considerazione suddivise in
%         training_X e test_X e posizioni nodo mobile lungo l'asse desiderato
%         (training_Y)
% output: Stime delle posizioni del nodo mobile relative all'asse prescelto
%         (fstar) e varianze (S2)

function  [fstar S2] = stima(training_X, test_X, training_Y)

%%% Scalatura dati:

mean_training_X = mean(training_X);
offset = mean(training_Y);

[N M]=size(training_X);
for k=1:M
    training_X(:,k) = (training_X(:,k) - mean_training_X(k));
end
training_Y = training_Y - offset;

mean_test_X = mean(test_X);

[N M]=size(test_X);
for k=1:M
    test_X(:,k) = (test_X(:,k) - mean_test_X(k)); 
end

%--------------------------------------------------------------------------

%%% Scelta funzione covarianza:

%3 Parametri

% covfunc = {'covSum', {'covMatern3iso','covNoise'}};
% covfunc = {'covSum', {'covMatern5iso','covNoise'}};
% covfunc = {'covSum', {'covNNone','covNoise'}};

% logtheta0 = 5*[1; 1; 1];
% logtheta0 = 1*[1; 1; 1];
% logtheta0 = 1*[1; 1; 1];

% L Parametri

covfunc = {'covSum', {'covSEard','covNoise'}};
% covfunc = {'covSum', {'covLINard','covNoise'}};
% covfunc = {'covSum', {'covRQard','covNoise'}};

temp = ones(M,1);

logtheta0 = 6*[temp; 1; 1];
% logtheta0 = 1*[temp; 1];
% logtheta0 = 1*[temp; 1; 10; 1];

%--------------------------------------------------------------------------

%%% Determinazione del Kernel scelto:

[logtheta, fvals, iter] = minimize(logtheta0, 'gpr', -100, covfunc, training_X, training_Y);

%--------------------------------------------------------------------------

%%% Calcolo delle stime di posizioni lungo l'asse desiderato del nodo mobile

[fstar S2] = gpr(logtheta, covfunc, training_X, training_Y, test_X);
fstar = fstar + offset;

end