Mercurial > hg > ltpda
diff m-toolbox/classes/@smodel/assignalias.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/classes/@smodel/assignalias.m Wed Nov 23 19:22:13 2011 +0100 @@ -0,0 +1,228 @@ +% ASSIGNALIAS assign values to smodel alias +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% DESCRIPTION: ASSIGNALIAS assign numerical values or vectors to smodel +% aliases. This is a processing method which should be run before using the +% given smodel inside smodel/fftfilt so to gain evaluation time during the +% evaluation of the model. Be careful to insert the correct values for the +% parameters otherwhise smodel/double will throw an error. +% +% CALL: mdl = assignalias(mdl) +% +% <a href="matlab:utils.helper.displayMethodInfo('smodel', 'assignalias')">Parameters Description</a> +% +% VERSION: $Id: assignalias.m,v 1.6 2011/05/10 11:07:59 luigi Exp $ +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +function varargout = assignalias(varargin) + + % Check if this is a call for parameters + if utils.helper.isinfocall(varargin{:}) + varargout{1} = getInfo(varargin{3}); + return + end + + % Collect input variable names + in_names = cell(size(varargin)); + for ii = 1:nargin + in_names{ii} = inputname(ii); + end + + % Collect all smodels and plists + [as, smodel_invars, rest] = utils.helper.collect_objects(varargin(:), 'smodel', in_names); + pl = utils.helper.collect_objects(varargin(:), 'plist'); + + + % Copy the object(s), so to inherit parameters etc + mdls = copy(as, nargout); + + % combine plists + if isempty(pl) + setvar = 'fftfilt'; + else + xvals = find(pl, 'xvals'); + if isempty(xvals) + setvar = 'fftfilt'; + else + setvar = 'UserDefinedXvals'; + end + end + + pl = parse(pl, getDefaultPlist(setvar)); + + % get parameters values from plist + switch lower(setvar) + case 'fftfilt' + nsecs = find(pl, 'nsecs'); + npad = find(pl, 'npad'); + fs = find(pl, 'fs'); + % get fft frequancies + nfft = nsecs*fs + npad; + xvals = utils.math.getfftfreq(nfft,fs,'one'); + xvals = xvals.'; + case 'userdefinedxvals' + xvals = find(pl, 'xvals'); + end + + % run over input objects + for ii=1:numel(mdls) + % Recover the mapping factor from xvals and xvar + % get xvar + xxvar = mdls(ii).xvar; + % check dimensions + if numel(xxvar)>1 + error('Multiple xvar are not supported!') + else + xxvar = xxvar{:}; + end + trans = mdls(ii).trans; + if isempty(trans) + scale = 1.0; + else + if isnumeric(trans) + scale = trans; + elseif ischar(trans) + scale = eval(trans); + elseif iscell(trans) + % check dimension + if numel(trans)>1 + error('Multiple trans are not supported!') + else + switch lower(class(trans{:})) + case 'double' + scale = trans{:}; + case 'char' + scale = eval(trans{:}); + end + end + else + error('Unknown format for the transformation!'); + end + end + % assign values for the x + getSingleVariable(xxvar,scale.*xvals); + % assign alias values + for jj=1:numel(mdls(ii).aliasNames) + switch class(mdls(ii).aliasValues{jj}) + case 'char' + getSingleVariable('calias',eval(mdls(ii).aliasValues{jj})); + mdls(ii).aliasValues{jj} = calias; + case 'smodel' + tmd = mdls(ii).aliasValues{jj}; + tmd.setXvals(xvals); + getSingleVariable('calias',tmd.double); + mdls(ii).aliasValues{jj} = calias; + otherwise + % do nothing + end + end + mdls(ii).setXvals(xvals); + % set output history + mdls(ii).addHistory(getInfo('None'), pl, smodel_invars(ii), mdls(ii).hist); + end + + %%% Set output + if nargout == numel(mdls) + % List of outputs + for ii = 1:numel(mdls) + varargout{ii} = mdls(ii); + end + else + % Single output + varargout{1} = mdls; + end + +end + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% Local Functions % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% FUNCTION: getCellVariables +% +% DESCRIPTION: Assign values to variables +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +function getSingleVariable(nms,val) + assignin('caller',nms,val); +end + +%-------------------------------------------------------------------------- +% Get Info Object +%-------------------------------------------------------------------------- +function ii = getInfo(varargin) + if nargin == 1 && strcmpi(varargin{1}, 'None') + sets = {}; + pl = []; + elseif nargin == 1 && ~isempty(varargin{1}) && ischar(varargin{1}) + sets{1} = varargin{1}; + pl = getDefaultPlist(sets{1}); + else + sets = SETS(); + % get plists + pl(size(sets)) = plist; + for kk = 1:numel(sets) + pl(kk) = getDefaultPlist(sets{kk}); + end + end + % Build info object + ii = minfo(mfilename, 'smodel', 'ltpda', utils.const.categories.helper, '$Id: assignalias.m,v 1.6 2011/05/10 11:07:59 luigi Exp $', sets, pl); +end + + +%-------------------------------------------------------------------------- +% Defintion of Sets +%-------------------------------------------------------------------------- + +function out = SETS() + out = {... + 'fftfilt', ... + 'UserDefinedXvals' ... + }; +end + + +%-------------------------------------------------------------------------- +% Get Default Plist +%-------------------------------------------------------------------------- +function plout = getDefaultPlist(set) + persistent pl; + persistent lastset; + if exist('pl', 'var')==0 || isempty(pl) || ~strcmp(lastset, set) + pl = buildplist(set); + lastset = set; + end + plout = pl; +end + +function pl = buildplist(set) + pl = plist.EMPTY_PLIST; + + switch lower(set) + case 'fftfilt' + p = param({'nsecs', 'Number of seconds of the time series will be filtered with fftfilt.'}, paramValue.DOUBLE_VALUE(1)); + pl.append(p); + + p = param({'npad', 'Number of sample pad will will be used in fftfilt.'}, paramValue.EMPTY_DOUBLE); + pl.append(p); + + p = param({'fs', 'Sampling frequency of the time series will be filtered with fftfilt.'}, paramValue.DOUBLE_VALUE(1)); + pl.append(p); + + + + case 'userdefinedxvals' + + p = param({'xvals', 'A vector of values for the X variable.'... + 'If the smodel implement a transformation for x values then you should'... + 'input the value before the transformation. E.g. xvar = s -> trans = 2*pi*i'... + 'you should input f values so you finally get inside the code xvals = 2*pi*i*f'}, paramValue.EMPTY_DOUBLE); + pl.append(p); + + + end +end