classdef parameter
  properties
    % Parametrisierungseinstellungen
    n; % Anzahl der Neuronen
    d; % Dimension der Domain
    I; % Anzahl der Trainingsdaten

    xStern;        % Exakte Parameterlösung in struct-Form
    xSternVektor;  % Exakte Parameterlösung in Vektor-Form
    xInitVektor;   % Parameter-Anfangswerte in Vektor-Form
    
    t;             % Trainingsstellen
  end
  
  methods
    function p = parameter()
    % initialisiert die Parameterwerte
         p.n = 3;
         p.d = 2;
         p.I = 100;
         
         % Vorgabe der korrekten Lösung in struct-Form
         p.xStern.w = rand(p.n, p.d); % Gewichte
         p.xStern.v = -rand(p.n, 1); % Schwellenwerte
         p.xStern.wo = rand(1, p.n); % Ausgabegewichte
         p.xStern.vo = rand(1, 1); % Verschiebung

         % Vorgabe der korrekten Lösung in Vektor-Form
         p.xSternVektor = p.alsVektor(p.xStern);
         
         % (zufällige) Trainingsstellen
         p.t = rand(p.d, p.I); 
         
         % Anfangswerte in Vektor-Form
         p.xInitVektor(:,1) = p.xSternVektor;
         p.xInitVektor(:,2) = zeros(size(p.xSternVektor));
         p.xInitVektor(:,3) = ones(size(p.xSternVektor));
         p.xInitVektor(:,4) = rand(size(p.xSternVektor));
    end
    
    function xVektor = alsVektor(~, xStruct)
    % Wandelt die Parametrisierung von Vektor- in struct-Form um
      xVektor = [reshape(xStruct.w, [], 1); xStruct.v; xStruct.wo'; xStruct.vo];  
    end

    function xStruct = alsStruct(p, xVektor)
    % Wandelt die Parametrisierung von Vektor- in struct-Form um
      xStruct.w = reshape(xVektor(1 : p.n*p.d), p.n, p.d);
      xStruct.v = xVektor(end-2*p.n : end-p.n-1);
      xStruct.wo = xVektor(end-p.n : end-1)';
      xStruct.vo = xVektor(end);
    end
  end
end



