www.gusucode.com > mbcdata 工具箱 matlab 源码程序 > mbcdata/@cgoppoint/CreateError.m

    function [op,e_ptr,e] = CreateError(op,addvec,left,right,varargin)
% op = CreateError(op,addvec,left,right)
%   addvec: vector length 3, containing 1s where left, right, error 
%   should be added to dataset.
%   left, right may be: factor index (new value created)
%                       ptr
% Checks for error already existing; if not, generates name and
%  creates error.
%
% op = CreateError(op,addvec,left,right,name) uses given name
% op = CreateError(op,addvec,left,right,e_ptr,[name]) updates given equation, 
%       updating name if applicable.
% [op,ptr] = CreateError(...) returns the pointer to the error equation

%  Copyright 2000-2011 The MathWorks, Inc. and Ford Global Technologies, Inc.



if nargin<4
    error(message('mbc:cgoppoint:TooFewInputs1'));
elseif ~isa(op,'cgoppoint')
    error(message('mbc:cgoppoint:InvalidArgument5'));
elseif ~isnumeric(addvec) | length(addvec)~=3
    error(message('mbc:cgoppoint:InvalidSize1'));
end


name_i = 0; done_e = 0; e_ptr = xregpointer; errname = '';
argsused = 4;
while nargin>argsused
    this = varargin{argsused-3};
    switch class(this)
    case 'xregpointer'
        e_ptr = this;
    case 'char'
        errname = this;
        name_i = -1;
    otherwise
        error(message('mbc:cgoppoint:InvalidArgument6'));
    end
    argsused = argsused + 1;
end

if isnumeric(right)
    [op,fact1,ptr1] = AddCage(op,right);
elseif isa(right,'xregpointer')
    ptr1 = right;
    name_i = 1;
    if addvec(2) & isempty(find(right==op.ptrlist))
        op = addfactor(op,right);
    end
else
    error(message('mbc:cgoppoint:InvalidArgument7'));
end
if isnumeric(left)
    [op,fact2,ptr2] = AddCage(op,left);
elseif isa(left,'xregpointer')
    ptr2 = left;
    name_i = 2;
    if addvec(1) & isempty(find(left==op.ptrlist))
        op = addfactor(op,left);
    end
else
    error(message('mbc:cgoppoint:InvalidArgument8'));
end

if isempty(errname)
switch name_i
case {0,1}
    errname = ['Error_' ptr1.getname];
case 2
    errname = ['Error_' ptr2.getname];
end
end
    
if ~isempty(errname)
    % filter out invalid characters -
    %  do some checks against other names later.
    e = setname(cgexpr,errname);
    errname = getname(e);
end
created_flag = 0;
if ~isvalid(e_ptr)
    if ~addvec(3)
        error(message('mbc:cgoppoint:InvalidState4'));
    end
    % create new equation
    % First check whether this one already exists
    [exists,e_ptr,dir] = i_SubExprExists(op.ptrlist,ptr2,ptr1,'reverse');
    if ~exists
        % create new one - ensure unique name within dataset
        errname = i_uniquename(op.ptrlist,errname);
        e_ptr = xregpointer(cgsubexpr(errname,ptr2,ptr1));
    end
    created_flag = 1;
else
    % updating old equation
    [exists,e_ptr2,dir] = i_SubExprExists(op.ptrlist,ptr2,ptr1,'reverse');
    if exists & ~(e_ptr==e_ptr2)
        if dir==1
            warning(message('mbc:cgoppoint:InvalidExpression', ptr2.getname, ptr1.getname, e_ptr2.getname));
        elseif dir==-1
            warning(message('mbc:cgoppoint:InvalidExpression1', ptr1.getname, ptr2.getname, e_ptr2.getname));
        end
    end
    % name changed? Ensure it is unique
    if ~strcmp(errname,e_ptr.getname)
        errname = uniquename(op,errname);
    end
    e_ptr.info = set(e_ptr.info,...
        'left',ptr2, 'right', ptr1);
    e_ptr.info = e_ptr.setname(errname);
end

if addvec(3) & isempty(find(e_ptr==op.ptrlist))
    op = addfactor(op,e_ptr,'created_flag',created_flag,...
        'orig_name',{errname});
    op = eval_fill(op);
end

%-------------------------------------------------    
function [exists,e_ptr,dir] = i_SubExprExists(e,ptr2,ptr1,opt);
%-------------------------------------------------    

e_ptr = xregpointer; dir = 0; exists = 0;
ErrPtrs = [];
for i = 1:length(e)
    if isvalid(e(i))
        [iserr,l,r] = i_isErrorExpr(e(i).info);
        if iserr
            ErrPtrs = [ErrPtrs ; i double(l) double(r)];
        end
    end
end

if ~isempty(ErrPtrs)
    compare = double([ptr2 ptr1]);
    % find matching error
    cmat = repmat(compare,size(ErrPtrs,1),1);
    f = find(~any((ErrPtrs(:,2:3) - cmat)'));
    if ~isempty(f)
        ind = ErrPtrs(f(1),1);
        dir = 1;
        e_ptr = e(ind);
        exists = 1;
    elseif strcmp(lower(opt),'reverse')
        % check reverse order too
        f = find(~any((ErrPtrs(:,[3 2]) - cmat)'));
        if ~isempty(f)
            ind = ErrPtrs(f(1),1);
            dir = -1;
            e_ptr = e(ind);
            exists = 1;
        end
    end
end

%-------------------------------------------------    
function name=i_uniquename(l,name)
%-------------------------------------------------    

%exprList/uniqueName
%newName=uniquename(l,name);
% Given an inputname, this function suggests a unique name or returns the input
% name if it was unique in the list.
for i=1:length(l)
    if isvalid(l(i))
   currentName=l(i).getname;
   if strcmp(name,currentName)
      for j = 0:length(name)-1
         if isempty(str2num((name(end-j))))
            break;
         end
      end
      if j == 0
         num = 1;
      else
         num = str2num(name(end-j+1:end)) + 1;
      end
      name = [name(1:end-j) num2str(num)];
   end
end
end


%------------------------------------------------------------------
function [iserr,l,r] = i_isErrorExpr(obj)
%------------------------------------------------------------------
iserr = 0; l = []; r = [];
if isa(obj,'cgsubexpr')
    l = get(obj,'left');
    r = get(obj,'right');
    if length(l)==1 & isvalid(l) & length(r)==1 & isvalid(r)
        iserr = 1;
    end
end