% Preprocessing für den Partitionsschätzer. Hier werden die Daten
% dimensionsweise auf das Intervall [0,1] gelegt. Nur die Extrema an beiden
% Rändern (in 1/100) werden aus dem Intervall gefiltert.

function [Y_calc, error, best_ms] = regression_tree( X, Y, X_eval, Y_eval , minsplit_list, param_samplerate)
    
    %           SAMPLE SPLITTING
    % 
    % Anzahl der Datenpunkte für Schritt 1:
    % Wie viele Datensätze sind zum Lernen? aufrunden
    n=size(X,1);
    %n=100;
    n_l=ceil(n*param_samplerate);
    %n_t=n-n_l;
    %learning
    X_l=X(1:n_l,:);
    Y_l=Y(1:n_l);
    %testing
    X_t=X(n_l+1:n,:);
    Y_t=Y(n_l+1:n);
  
    
    
    number_minsplit=length(minsplit_list);
    % und uebferfluessige Variablen loeschen
    clear X Y;
    
    
    trees=cell(number_minsplit,1);
    errors=zeros(number_minsplit,1);
    
%     t = classregtree(X_l,Y_l);
% 
%      % Find the minimum-cost tree
%      [c,s,n,best] = test(t,'test',X_t,Y_t);
%      tmin = prune(t,'level',best);
%     Y_calc=eval(tmin,X_eval);
%     %best choice
    for ms=1:number_minsplit
        display(minsplit_list(ms))
        trees{ms}=classregtree(X_l,Y_l,'minparent',minsplit_list(ms));
        Y_calc= treeval(trees{ms},X_t); 
        %cost = test(trees{ms},'resubstitution');
        
        errors(ms)=sum((Y_calc-Y_t).^2);       
        display(errors(ms))
    end
    
    [~, best_ms]=min(errors);
    Y_calc=treeval(trees{best_ms},X_eval);
    error=sum((Y_calc-Y_eval).^2);  
    best_ms=minsplit_list(best_ms);
    
    
end

