Mercurial > hg > ltpda
diff m-toolbox/classes/@smodel/mergeFields.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/mergeFields.m Wed Nov 23 19:22:13 2011 +0100 @@ -0,0 +1,129 @@ +% MERGEFIELDS merges properties (name/values) of smodels +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% DESCRIPTION: MERGEFIELDS merges properties (name/values) of smodels +% in preparation of dual operations +% +% CALL: mergeFields(mdl1, mdl2, mdl, name, value) +% +% PARAMETERS: op - MATLAB operation name +% opname - Name for displaying +% opsym - Operation symbol +% infoObj - minfo object +% pl - default plist +% fcnArgIn - Input argument list of the calling fcn. +% varNames - Variable names of the input +% +% VERSION: $Id: mergeFields.m,v 1.1 2011/05/10 20:40:53 mauro Exp $ +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +%-------------------------------------------------------------------------- +% Merge Fields and Their Values +%-------------------------------------------------------------------------- +function varargout = mergeFields(varargin) + + mdl1 = varargin{1}; + mdl2 = varargin{2}; + mdl = varargin{3}; + name = varargin{4}; + value = varargin{5}; + + switch lower(name) + case {'params', 'aliasnames', 'xvar'} + otherwise + error('Unknown field %s', name); + end + + % Start appending all the entries: (name) + mdl.(name) = [mdl1.(name) mdl2.(name)]; + + % If dealing with xvar+trans, we need to expand the trans + % This will be discontinued in future releases + if strcmpi(value, 'trans') || strcmpi(value, 'xunits') + n_vals = numel(mdl1.(value)); + n_xvar = numel(mdl1.(name)); + if n_vals == 1 && n_vals ~= n_xvar + valvec1 = cell(1, n_xvar); + for jj = 1:n_xvar + valvec1(jj) = mdl1.(value); + end + mdl1.(value) = valvec1; + end + n_vals = numel(mdl2.(value)); + n_xvar = numel(mdl2.(name)); + if n_vals == 1 && n_vals ~= n_xvar + valvec2 = cell(1, n_xvar); + for jj = 1:n_xvar + valvec2(jj) = mdl2.(value); + end + mdl2.(value) = valvec2; + end + end + + % Start appending all the entries: (values) + if isempty(mdl1.(value)) + values1 = cell(size(mdl1.(name))); + else + values1 = mdl1.(value); + end + if isempty(mdl2.(value)) + values2 = cell(size(mdl2.(name))); + else + values2 = mdl2.(value); + end + mdl.(value) = [values1 values2]; + + % Check if the (name) are overlapping + [c, i1, i2] = intersect(mdl1.(name), mdl2.(name)); + if isempty(c) + % No overlap: nothing to do + else + % Some overlap: check the (value) + for kk = 1: numel(c) + % xunits are always a vector + if strcmpi(value, 'xunits') + val1 = values1(i1(kk)); + val2 = values2(i2(kk)); + else + val1 = values1{i1(kk)}; + val2 = values2{i2(kk)}; + end + prop_name = c(kk); + if ~isempty(val1) + % (value) is defined in 1st model + if ~isempty(val2) + % (value) is defined in 2nd model + if ~isequal(val1, val2) + % the (value) are different, give error + error('LTPDA:err:ContentMismatchMismatch', 'The [%s] fields do not match, because ''%s'' are different!', name, prop_name{:}); + else + % the (value) are equal, nothing to do + end + else + % (value) is not defined in 2nd model, take value from 1st + % Take the (name) position in the cell-array + idx = strcmp(mdl.(name), prop_name); + mdl.(value)(idx) = {val1 val1}; + end + else + % (value) is not defined in 1st model + if ~isempty(val2) + % (value) is defined in 2nd model, take value from 2nd + % Take the (name) position in the cell-array + idx = strcmp(mdl.(name), prop_name); + mdl.(value)(idx) = {val2 val2}; + else + % (value) is not defined in 2nd model, nothing to do + end + end + end + + % All identical. Go ahead and merge + [mdl.(name), idx1, idx2] = unique(mdl.(name)); + mdl.(value) = mdl.(value)(idx1); + end + + % Set output + varargout = {}; +end