Inhaltsverzeichnis

CLI: Sim und Fit in Unterfunktionen

Idee
Auslagerung der Bereiche für „sim“ und „fit“ in Unterfunktionen.
Vorteile
Sorgt für übersichtlicheren Code
Vereinfacht ggf. die Übergabe von Datensätzen, je nachdem, woher man kommt und was man will.1)
Implementierung
Geht mit der Umwandlung in eine Funktion einher

Umsetzung

Der Schlüssel ist eine sinnvolle und brauchbare Schnittstelle der Funktionen.

Nachfolgend deshalb die Vorschläge für die beiden Funktionsköpfe. Die Funktionsnamen (trEPRTSim_cli_sim und trEPRTSim_cli_fit) sind vorläufig und sollen keine Vorentscheidung darstellen.

Schnittstelle

function varargout = trEPRTSim_cli_sim(varargin)
% TREPRTSIM_CLI_SIM Subfunction of the trEPRTSim CLI handling the simulation part.
%
% Usage
%   trEPRTsim_cli_sim
%   trEPRTSim_cli_sim(dataset)
%   dataset = trEPRTSim_cli_sim
%   dataset = trEPRTSim_cli_sim(dataset)
%   [dataset,<command>] = trEPRTSim_cli_sim(dataset,<command>)
%
%   dataset  - struct
%              Full trEPR toolbox dataset including TSim structure
%
%   command  - string
%              Additional information what to do (bypassing certain loops)

Ideen zur Schnittstelle:

Aufruf

Der Aufruf in der Hauptschleife, die zwischen Fit und Simulation unterscheidet, sieht vermutlich wie folgt aus:

% ...
 
% Chose wether it shall be simulated or fitted
answer = cliMenu({'f','Fit';'s','Simulate';'q','Quit'},'default','f','title',...
    'Do you wish to simulate or to fit?');
 
switch answer
    case 'f'
        trEPRTSim_cli_fit();
    case 's'
        trEPRTSim_cli_sim();
    case 'q'
        disp('Goodbye!');
        return;
    otherwise
        % Shall never happen
        action = '';
end

Alternativ (vielleicht sinnvoller) könnte das auch innerhalb der outerloop stattfinden:

outerloop = true;
while outerloop
    switch lower(action)
        case {'fit','f'}
            [dataset,command] = trEPRTSim_cli_fit();
            if strcmpi(command,'exit')
                outerloop = false;
            end
        case {'sim','s'}
            [dataset,command] = trEPRTSim_cli_sim();
            if strcmpi(command,'exit')
                outerloop = false;
            end
    end
end

Wenn die Funktionen sich untereinander selbst aufrufen, eben gerade um vom Fit zur Simulation und zurück zu wechseln, ist es wichtig, sie mit den Rückgabeparametern aufzurufen:

[dataset,command] = trEPRTSim_cli_sim();

bzw.

[dataset,command] = trEPRTSim_cli_sim(dataset);

Da es jetzt vermutlich aufgrund der Schachtelung nicht mehr einfach möglich ist, die Funktion zu beenden – return wird vermutlich nur bis zur aufrufenden Funktion zurückgehen –, müßte im Falle, daß man enden möchte, als Rückgabewert für „command“ sowas wie „exit“ übergeben werden. Das könnte dann wie folgt abgefragt werden:

[dataset,command] = trEPRTSim_cli_sim();
if strcmpi(command,'exit')
    return;
end

Erzeugung eines Datensatzes

Bislang erzeugen sowohl die Fit- als auch die Simulationsschleife jeweils einen leeren Datensatz. Im Fit wird dieser dann weitestgehend mit den Daten aus dem geladenen experimentellen Datensatz gefüllt.

Wenn man den zu schreibenden eigenen Funktionen jeweils optional einen Datensatz übergeben kann, muß das natürlich abgefragt werden. Das könnte ungefähr so aussehen:

if nargin % If we have input arguments
    if isstruct(varargin{1})
        dataset = varargin{1};
    end
else
    % Create (empty) dataset
    % TODO: Handle missing parameters, such as field range, ...
    dataset = trEPRTSim_dataset();
 
    % Initialize minimal simulation parameters
    dataset = trEPRTSim_simini(dataset);   
end
1)
Das betrifft insbesondere dis Situationen, wenn man vom Fit zur Simulation und zurück wechseln und dabei Parameter übergeben möchte.