% 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_h] = b_splines_preproc( X, Y, X_eval, Y_eval , alpha_list,param_samplerate)
    
    % param_samplerate: Welcher Anteil sind Trainings/Lerndaten?
    %param_samplerate = 0.5;
    
    % Quantile (Zum Abfangen extremer Werte werden in jeder Dimension die
    % Werte, die unterhalb bzw oberhalb des ersten bzw zweiten Quantils
    % liegen in eine Partition 'sonstiges' gepackt
    quantils = [0.01 0.99];
        
    % Intervallgröße h errechnen (ergibt sich aus 1/n, n = Anzahl Felder pro
    % Dimension)
    %h=1./n;
    
    
    %
    % Ab hier Programmcode
    %
    
    grenzen = quantile (X, quantils);
    
    if size(X,2)==1
       grenzen=grenzen'; 
    end
    
    
    % grenzen(1)-grenzen(2) = 0 aussieben... Sonst später Division durch 0
    if ~isempty(grenzen(2,((grenzen(2,:) - grenzen(1,:) == 0))))
        display('Div by ZERO abgewendert')
    end
    grenzen(2,((grenzen(2,:) - grenzen(1,:) == 0))) = 1;

    
    % Daten verschieben (unteres Quantil: 0) und anpassen (oberes
    % Quantil: 1; für Training und Evaluation)
    for i_loop=1:size(X,1)
        X(i_loop,:)=(X(i_loop,:)-grenzen(1,:))*diag(1./(grenzen(2,:)-grenzen(1,:)));
    end
    
% ACHTUNG!! WIRD BEI KONSTANTE ABBRECHEN MIT DIV BY ZERO!!!
    for i_loop=1:size(X_eval,1)
        X_eval(i_loop,:)=(X_eval(i_loop,:)-grenzen(1,:))*diag(1./(grenzen(2,:)-grenzen(1,:)));
    end
    
    % Partitionsschaetzer drauf loslassen
    [Y_calc, error, best_h] = b_splines(X, Y, X_eval, Y_eval, alpha_list, param_samplerate);
end

