Mercurial > hg > ltpda
diff m-toolbox/classes/@plist/parse.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/@plist/parse.m Wed Nov 23 19:22:13 2011 +0100 @@ -0,0 +1,199 @@ +% PARSE a plist for strings which can be converted into numbers +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% DESCRIPTION: PARSE a plist for strings which can be converted into numbers +% depending on the default plist +% +% CALL: plo = parse(pl, dpl) +% +% EXAMPLE: pl = plist('x', '3', 'y', 'x+5', 'z', 'x-y') +% dpl = plist('x', [], 'y', [], 'z', []) +% +% pl = plist('x', '1:12', 'y', 'randn(length(x),1)') +% dpl = plist('x', [], 'y', [], 'z', []) +% +% VERSION: $Id: parse.m,v 1.17 2011/03/28 12:45:31 hewitson Exp $ +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +function ppl = parse(varargin) + + %%% Check if this is a call for parameters + if utils.helper.isinfocall(varargin{:}) + ppl = getInfo(varargin{3}); + return + end + + if nargin > 0 + pl = varargin{1}; + else + error('### Input at least one plist.'); + end + if nargin > 1 + dpl = varargin{2}; + else + dpl = plist(); + end + + if isempty(pl) + pl = plist(); + end + if isempty(dpl) + dpl = plist(); + end + + % combine + pl = combine(pl); % in case we get more than one input plist + ppl = combine(pl, dpl); + + % check each parameter and replace key names with upper-case key names + matches = zeros(size(ppl.params)); + for kk=1:numel(ppl.params) + sval = ppl.params(kk).getVal; + if ( ischar(sval) || isnumeric(sval) ) + if ischar(sval) + if ~isempty(dpl.params) + dkeys = {dpl.params(:).key}; + else + dkeys = {''}; + end + if any(strcmp(ppl.params(kk).key, dkeys)) + if isnumeric(find(dpl, ppl.params(kk).key)) + % look for matching key strings + for jj=1:numel(ppl.params) + if jj ~= kk + key = ppl.params(jj).key; + % get words out of sval + words = regexp(sval, '(\w+)', 'match'); + wordidxs = regexp(sval, '(\w+)'); + % do any of these words match the key? + idx = strcmpi(words, key); + for ll=1:numel(idx) + if idx(ll) + word = words{ll}; + matches(kk) = 1; + val = ppl.params(kk).getVal; + sidx = wordidxs(ll):wordidxs(ll)+length(word)-1; + val(sidx) = upper(val(sidx)); + ppl.params(kk).setVal(val); +% ppl.params(kk).setVal(strrep(ppl.params(kk).getVal, word, upper(word))); + end % If matched + end % end loop over matches + end + end % End loop over params + else % not numeric parameter + matches(kk) = -1; + end + else % key is not present in default plist + matches(kk) = -1; + end + else % param value is not char + matches(kk) = 0; + end + else % param value is neither char nor numeric + matches(kk) = -1; + end + end % end loop over params + + % Don't eval parameters in default plist if they are not in the input + % plist + if ~isempty(pl.params) + ikeys = {pl.params(:).key}; + else + ikeys = {''}; + end + for kk=1:numel(ppl.params) + if ~any(strcmpi(ppl.params(kk).key, ikeys)) +% if ~ismember(ppl.params(kk).key, ikeys) + matches(kk) = -1; + end + end + + % First eval all non-dependent keys + for kk=1:numel(ppl.params) + if matches(kk) == 0 + if ischar(ppl.params(kk).getVal) + try + ev = eval(ppl.params(kk).getVal); + ppl.params(kk).setVal(ev); + catch me + utils.helper.warn(sprintf('Unable to evaluate non-dependent parameter [%s]. Leaving it as char.', ppl.params(kk).getVal)); + end + else + ev = ppl.params(kk).getVal; + end + % If they are needed later, put them in this workspace + if any(matches>0) + cmd = [ppl.params(kk).key '=' mat2str(ev) ';']; + eval(cmd); + end + end + end + + % Now evaluate dependent parameters + count = 0; + while any(matches>0) && count < 100 + for kk=1:numel(ppl.params) + if matches(kk)==1 + try + ppl.params(kk).setVal(eval(ppl.params(kk).getVal)); + cmd = sprintf('%s = %s;', ppl.params(kk).key, mat2str(ppl.params(kk).getVal)); + eval(cmd); + matches(kk) = 0; + end + end + end + count = count + 1; + end + + % did we reach maximum number of tries? + if count >= 100 + for kk=1:numel(matches) + if matches(kk) == 1 + warning('!!! Can''t resolve dependency in parameter: %s', ppl.params(kk).key); + % Chenge the value back to the input values in case of dependency. + % It might be that we changed this value to upper case. + ppl.params(kk).setVal(pl.find(ppl.params(kk).key)); + end + end + end + +end + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% Local Functions % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% FUNCTION: getInfo +% +% DESCRIPTION: Get Info Object +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +function ii = getInfo(varargin) + if nargin == 1 && strcmpi(varargin{1}, 'None') + sets = {}; + pl = []; + else + sets = {'Default'}; + pl = getDefaultPlist; + end + % Build info object + ii = minfo(mfilename, 'plist', 'ltpda', utils.const.categories.internal, '$Id: parse.m,v 1.17 2011/03/28 12:45:31 hewitson Exp $', sets, pl); +end + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% FUNCTION: getDefaultPlist +% +% DESCRIPTION: Get Default Plist +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +function plo = getDefaultPlist() + plo = plist(); +end + +