diff m-toolbox/test/test_smodel_double.m @ 0:f0afece42f48

Import.
author Daniele Nicolodi <nicolodi@science.unitn.it>
date Wed, 23 Nov 2011 19:22:13 +0100
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/m-toolbox/test/test_smodel_double.m	Wed Nov 23 19:22:13 2011 +0100
@@ -0,0 +1,497 @@
+% test_smodel_double tests the double method of the SMODEL class.
+%
+% M Hueller 02-05-2011
+%
+% $Id: test_smodel_double.m,v 1.2 2011/05/05 21:04:13 mauro Exp $
+%
+function results = test_smodel_double(varargin)
+  
+  %% List of runs
+  if nargin == 1
+    list = varargin{1};
+    if isa(list, 'cell')
+      list = list{:};
+    end
+  else
+    list = [];
+  end
+  
+  if isempty(list)
+    list = [10 11 20 21 30 31 40 41 50 51];
+  end
+  
+  %% Run tests
+  results = [];
+  
+  %% 10 Oscillator step, default values
+  test = 10;
+  if any(ismember(list, test))
+    
+    % Pick the model
+    model_def = 'oscillator_step';
+    
+    % Decide the tolerance of the test ([] or 0 for no tolerance)
+    TOL = 0;
+    
+    % Set parameters: duration and rate
+    nsecs = 100;
+    fs    = 1;
+    
+    % Extract the information from the ao model default plist
+    ao_mdl_info = eval(['ao_model_' model_def '(''info'')']);
+    pl = ao_mdl_info.plists;
+    
+    F0     = find(pl, 'F0');
+    toff   = find(pl, 'toff');
+    m      = find(pl, 'm');
+    k      = find(pl, 'k');
+    tau    = find(pl, 'tau');
+    x0     = find(pl, 'x0');
+    v0     = find(pl, 'v0');
+    
+    % Build the ao model
+    ao_mdl = ao(plist('built-in', model_def, 'nsecs', nsecs, 'fs', fs));
+    
+    % Build the smodel model
+    smodel_mdl = smodel(plist('built-in', model_def));
+    
+    % Set smodel parameters
+    smodel_mdl.setParameters({'m','k','tau','F0','x0','v0','toff'}, {m,k,tau,F0,x0,v0,toff});
+    
+    % Set smodel xvals
+    smodel_mdl.setXvals(ao_mdl.x);
+    
+    % Eval the smodel
+    d = smodel_mdl.double();
+    
+    % Compare the numbers
+    results = [results; test check_correctness(d, ao_mdl.y, plist('tolerance', TOL))];
+  end
+  
+  %% 11 Oscillator step, high fs and high nsecs
+  test = 11;
+  if any(ismember(list, test))
+    
+    % Pick the model
+    model_def = 'oscillator_step';
+    
+    % Decide the tolerance of the test ([] or 0 for no tolerance)
+    TOL = 0;
+    
+    % Set parameters: duration and rate
+    nsecs = 10000;
+    fs    = 1000;
+    
+    % Extract the information from the ao model default plist
+    ao_mdl_info = eval(['ao_model_' model_def '(''info'')']);
+    pl = ao_mdl_info.plists;
+    
+    F0     = find(pl, 'F0');
+    toff   = find(pl, 'toff');
+    m      = find(pl, 'm');
+    k      = find(pl, 'k');
+    tau    = find(pl, 'tau');
+    x0     = find(pl, 'x0');
+    v0     = find(pl, 'v0');
+    
+    % Build the ao model
+    ao_mdl = ao(plist('built-in', model_def, 'nsecs', nsecs, 'fs', fs));
+    
+    % Build the smodel model
+    smodel_mdl = smodel(plist('built-in', model_def));
+    
+    % Set smodel parameters
+    smodel_mdl.setParameters({'m','k','tau','F0','x0','v0','toff'}, {m,k,tau,F0,x0,v0,toff});
+    
+    % Set smodel xvals
+    smodel_mdl.setXvals(ao_mdl.x);
+    
+    % Eval the smodel
+    d = smodel_mdl.double();
+    
+    % Compare the numbers
+    results = [results; test check_correctness(d, ao_mdl.y, plist('tolerance', TOL))];
+  end
+  
+  %% 20 Oscillator sine, default values
+  test = 20;
+  if any(ismember(list, test))
+    
+    % Pick the model
+    model_def = 'oscillator_sine';
+    
+    % Decide the tolerance of the test ([] or 0 for no tolerance)
+    TOL = 0e-13;
+    
+    % Set parameters: duration and rate
+    nsecs = 100;
+    fs    = 1;
+    
+    % Extract the information from the ao model default plist
+    ao_mdl_info = eval(['ao_model_' model_def '(''info'')']);
+    pl = ao_mdl_info.plists;
+    
+    F0     = find(pl, 'F0');
+    toff   = find(pl, 'toff');
+    phi    = find(pl, 'phi');
+    phi = 0.0;
+    f      = find(pl, 'f');
+    m      = find(pl, 'm');
+    k      = find(pl, 'k');
+    tau    = find(pl, 'tau');
+    x0     = find(pl, 'x0');
+    x0 = 0.0;
+    v0     = find(pl, 'v0');
+    
+    % Build the ao model
+    ao_mdl = ao(plist('built-in', model_def, 'nsecs', nsecs, 'fs', fs, 'x0', x0, 'phi', phi));
+    
+    % Build the smodel model
+    smodel_mdl = smodel(plist('built-in', model_def));
+    
+    % Set smodel parameters
+    smodel_mdl.setParameters({'m','k','tau','F0','f','phi','x0','v0','toff'}, {m,k,tau,F0,f,phi,x0,v0,toff});
+    
+    % Set smodel xvals
+    smodel_mdl.setXvals(ao_mdl.x);
+    
+    % Eval the smodel
+    d = smodel_mdl.double();
+    
+    % Compare the numbers
+    results = [results; test check_correctness(d, ao_mdl.y, plist('tol', TOL))];
+  end
+  
+  %% 21 Oscillator sine, high fs and high nsecs
+  test = 21;
+  if any(ismember(list, test))
+    
+    % Pick the model
+    model_def = 'oscillator_sine';
+    
+    % Decide the tolerance of the test ([] or 0 for no tolerance)
+    TOL = 1e-12;
+    
+    % Set parameters: duration and rate
+    nsecs = 10000;
+    fs    = 1000;
+    
+    % Extract the information from the ao model default plist
+    ao_mdl_info = eval(['ao_model_' model_def '(''info'')']);
+    pl = ao_mdl_info.plists;
+    
+    F0     = find(pl, 'F0');
+    toff   = find(pl, 'toff');
+    phi    = find(pl, 'phi');
+    f      = find(pl, 'f');
+    m      = find(pl, 'm');
+    k      = find(pl, 'k');
+    tau    = find(pl, 'tau');
+    x0     = find(pl, 'x0');
+    v0     = find(pl, 'v0');
+    
+    % Build the ao model
+    ao_mdl = ao(plist('built-in', model_def, 'nsecs', nsecs, 'fs', fs));
+    
+    % Build the smodel model
+    smodel_mdl = smodel(plist('built-in', model_def));
+    
+    % Set smodel parameters
+    smodel_mdl.setParameters({'m','k','tau','F0','f','phi','x0','v0','toff'}, {m,k,tau,F0,f,phi,x0,v0,toff});
+    
+    % Set smodel xvals
+    smodel_mdl.setXvals(ao_mdl.x);
+    
+    % Eval the smodel
+    d = smodel_mdl.double();
+    
+    % Compare the numbers
+    results = [results; test check_correctness(d, ao_mdl.y, plist('tol', TOL))];
+  end
+  
+  %% 30 Sinewave, default values
+  test = 30;
+  if any(ismember(list, test))
+    
+    % Pick the model
+    model_def = 'sinewave';
+    
+    % Decide the tolerance of the test ([] or 0 for no tolerance)
+    TOL = 0;
+    
+    % Set parameters: duration and rate
+    nsecs = 100;
+    fs    = 1;
+    
+    % Extract the information from the ao model default plist
+    ao_mdl_info = eval(['ao_model_' model_def '(''info'')']);
+    pl = ao_mdl_info.plists;
+    
+    A      = find(pl, 'A');
+    phi    = find(pl, 'phi');
+    f      = find(pl, 'f');
+    
+    % Build the ao model
+    ao_mdl = ao(plist('built-in', model_def, 'nsecs', nsecs, 'fs', fs));
+    
+    % Build the smodel model
+    smodel_mdl = smodel(plist('built-in', model_def));
+    
+    % Set smodel parameters
+    smodel_mdl.setParameters({'A','f','phi'}, {A,f,phi});
+    
+    % Set smodel yunits
+    smodel_mdl.setYunits(ao_mdl.yunits);
+    
+    % Set smodel xvals
+    smodel_mdl.setXvals(ao_mdl.x);
+    
+    % Eval the smodel
+    d = smodel_mdl.double();
+    
+    % Compare the numbers
+    results = [results; test check_correctness(d, ao_mdl.y, plist('tol', TOL))];
+  end
+  
+  %% 31 Sinewave, high fs and high nsecs
+  test = 31;
+  if any(ismember(list, test))
+    
+    % Pick the model
+    model_def = 'sinewave';
+    
+    % Decide the tolerance of the test ([] or 0 for no tolerance)
+    TOL = 0;
+    
+    % Set parameters: duration and rate
+    nsecs = 10000;
+    fs    = 1000;
+    
+    % Extract the information from the ao model default plist
+    ao_mdl_info = eval(['ao_model_' model_def '(''info'')']);
+    pl = ao_mdl_info.plists;
+    
+    A      = find(pl, 'A');
+    phi    = find(pl, 'phi');
+    f      = find(pl, 'f');
+    
+    % Build the ao model
+    ao_mdl = ao(plist('built-in', model_def, 'nsecs', nsecs, 'fs', fs));
+    
+    % Build the smodel model
+    smodel_mdl = smodel(plist('built-in', model_def));
+    
+    % Set smodel parameters
+    smodel_mdl.setParameters({'A','f','phi'}, {A,f,phi});
+    
+    % Set smodel yunits
+    smodel_mdl.setYunits(ao_mdl.yunits);
+    
+    % Set smodel xvals
+    smodel_mdl.setXvals(ao_mdl.x);
+    
+    % Eval the smodel
+    d = smodel_mdl.double();
+    
+    % Compare the numbers
+    results = [results; test check_correctness(d, ao_mdl.y, plist('tol', TOL))];
+  end
+  
+  %% 40 Squarewave, default values
+  test = 40;
+  if any(ismember(list, test))
+    
+    % Pick the model
+    model_def = 'squarewave';
+    
+    % Decide the tolerance of the test ([] or 0 for no tolerance)
+    TOL = 0;
+    
+    % Set parameters: duration and rate
+    nsecs = 100;
+    fs    = 1;
+    
+    % Extract the information from the ao model default plist
+    ao_mdl_info = eval(['ao_model_' model_def '(''info'')']);
+    pl = ao_mdl_info.plists;
+    
+    phi    = find(pl, 'phi');
+    f      = find(pl, 'f');
+    
+    % Build the ao model
+    ao_mdl = ao(plist('built-in', model_def, 'nsecs', nsecs, 'fs', fs));
+    
+    % Build the smodel model
+    smodel_mdl = smodel(plist('built-in', model_def));
+    
+    % Set smodel parameters
+    smodel_mdl.setParameters({'f','phi'}, {f,phi});
+    
+    % Set smodel yunits
+    smodel_mdl.setYunits(ao_mdl.yunits);
+    
+    % Set smodel xvals
+    smodel_mdl.setXvals(ao_mdl.x);
+    
+    % Eval the smodel
+    d = smodel_mdl.double();
+    
+    % Compare the numbers
+    results = [results; test check_correctness(d, ao_mdl.y, plist('tol', TOL))];
+  end
+  
+  %% 41 Squarewave, high fs and high nsecs
+  test = 41;
+  if any(ismember(list, test))
+    
+    % Pick the model
+    model_def = 'squarewave';
+    
+    % Decide the tolerance of the test ([] or 0 for no tolerance)
+    TOL = 0;
+    
+    % Set parameters: duration and rate
+    nsecs = 10000;
+    fs    = 1000;
+    
+    % Extract the information from the ao model default plist
+    ao_mdl_info = eval(['ao_model_' model_def '(''info'')']);
+    pl = ao_mdl_info.plists;
+    
+    phi    = find(pl, 'phi');
+    f      = find(pl, 'f');
+    
+    % Build the ao model
+    ao_mdl = ao(plist('built-in', model_def, 'nsecs', nsecs, 'fs', fs));
+    
+    % Build the smodel model
+    smodel_mdl = smodel(plist('built-in', model_def));
+    
+    % Set smodel parameters
+    smodel_mdl.setParameters({'f','phi'}, {f,phi});
+    
+    % Set smodel yunits
+    smodel_mdl.setYunits(ao_mdl.yunits);
+    
+    % Set smodel xvals
+    smodel_mdl.setXvals(ao_mdl.x);
+    
+    % Eval the smodel
+    d = smodel_mdl.double();
+    
+    % Compare the numbers
+    results = [results; test check_correctness(d, ao_mdl.y, plist('tol', TOL))];
+  end
+  
+  %% 50 Step, default values
+  test = 50;
+  if any(ismember(list, test))
+    
+    % Pick the model
+    model_def = 'step';
+    
+    % Decide the tolerance of the test ([] or 0 for no tolerance)
+    TOL = 0;
+    
+    % Set parameters: duration and rate
+    nsecs = 100;
+    fs    = 1;
+    
+    % Extract the information from the ao model default plist
+    ao_mdl_info = eval(['ao_model_' model_def '(''info'')']);
+    pl = ao_mdl_info.plists;
+    
+    A    = find(pl, 'A');
+    toff = find(pl, 'toff');
+    
+    % Build the ao model
+    ao_mdl = ao(plist('built-in', model_def, 'nsecs', nsecs, 'fs', fs));
+    
+    % Build the smodel model
+    smodel_mdl = smodel(plist('built-in', model_def));
+    
+    % Set smodel parameters
+    smodel_mdl.setParameters({'A','toff'}, {A,toff});
+    
+    % Set smodel yunits
+    smodel_mdl.setYunits(ao_mdl.yunits);
+    
+    % Set smodel xvals
+    smodel_mdl.setXvals(ao_mdl.x);
+    
+    % Eval the smodel
+    d = smodel_mdl.double();
+    
+    % Compare the numbers
+    results = [results; test check_correctness(d, ao_mdl.y, plist('tol', TOL))];
+  end
+  
+  %% 51 Step, high fs and high nsecs
+  test = 51;
+  if any(ismember(list, test))
+    
+    % Pick the model
+    model_def = 'step';
+    
+    % Decide the tolerance of the test ([] or 0 for no tolerance)
+    TOL = 0;
+    
+    % Set parameters: duration and rate
+    nsecs = 10000;
+    fs    = 1000;
+    
+    % Extract the information from the ao model default plist
+    ao_mdl_info = eval(['ao_model_' model_def '(''info'')']);
+    pl = ao_mdl_info.plists;
+    
+    A    = find(pl, 'A');
+    toff = find(pl, 'toff');
+    
+    % Build the ao model
+    ao_mdl = ao(plist('built-in', model_def, 'nsecs', nsecs, 'fs', fs));
+    
+    % Build the smodel model
+    smodel_mdl = smodel(plist('built-in', model_def));
+    
+    % Set smodel parameters
+    smodel_mdl.setParameters({'A','toff'}, {A,toff});
+    
+    % Set smodel yunits
+    smodel_mdl.setYunits(ao_mdl.yunits);
+    
+    % Set smodel xvals
+    smodel_mdl.setXvals(ao_mdl.x);
+    
+    % Eval the smodel
+    d = smodel_mdl.double();
+    
+    % Compare the numbers
+    results = [results; test check_correctness(d, ao_mdl.y, plist('tol', TOL))];
+  end
+  
+end
+
+function atest = check_correctness(smodel_y, ao_y, pl)
+  
+  % Exceptions plist for ao/eq
+  ple = plist('Exceptions', ...
+    {'created', 'proctime', 'UUID', 'param/desc', 'name', 'methodInvars', 'version'});
+  
+  % Start testing
+  atest = true;
+  
+  % Strict check or with tolerance?
+  tol = mfind(pl, 'tolerance', 'tol');
+  if ~isempty(tol) && tol > 0
+    % Check within tolerance
+    if any(abs(smodel_y - ao_y) ./ max(abs(smodel_y)) >= tol)
+      atest = false;
+    end
+  else
+    % Strict check on the values
+    if ~isequal(smodel_y, ao_y)
+      atest = false;
+    end
+  end
+  
+end
\ No newline at end of file