www.gusucode.com > mbc 工具箱 matlab 源码程序 > mbc/@mbcmodel/@testplan/UpdateDesign.m

    function [D,Index] = UpdateDesign(T,Stage,D)
%UPDATEDESIGN update design or designs in test plan
%
% D = UpdateDesign(T,D);
% D = UpdateDesign(T,Level,D);
%   D:         Array of designs to be updated in test plan. If a design
%              does not exist in the test plan (matching design names) it is added. 
%   Level:     Test plan level. By default the level is the outer level
%              (i.e. Level 1 for One-stage, Level 2 for Two-stage)
%
% The design name is used to decide what to update. If no name match is
% found in the test plan, the design is added. Design names must be unique
% so any repeated names will be changed. The array of designs is an output.
%
%  See also mbcmodel.testplan.AddDesign, mbcmodel.testplan.RemoveDesign,
%           mbcmodel.testplan.FindDesign 

%  Copyright 2007-2013 The MathWorks, Inc.

pTP = T.Pointer;
ddev = pTP.designdev;

NumStages = length(ddev);
if ~isnumeric(Stage)
    D = Stage;
    Stage = T.Levels;
end

if ~isa(D,'mbcdoe.design')
    error(message('mbc:mdevtestplan:InvalidValue'))
end

dtree = ddev(Stage).DesignTree;

nf = T.InputsPerLevel(Stage);
Dold = T.Design{Stage};
[Matched,loc] = ismember(D,Dold);
if any(Matched) && all(size(Dold)==size(D)) && isequal(find(Matched),loc(Matched))
    % same size with rename
    Matched = true( size(Matched) );
    loc = 1:length(Matched);
end

Done = false(size(Dold));
m0 = getModel(ddev(Stage));
Index = zeros(1,numel(D));
for i=1:numel(D)
    d = D(i);
    if d.NumberOfInputs~=nf
        error(message('mbc:doe:InvalidValue24'))
    end

    des = dataobject(d);
    m = model(des);
    if ~hasSameInputs(m,m0)
        m = setInputs(m, getInputs(m0));
        des = safechange(des,@(des) model(des,m));
    end
    % need to check localmod and Stage
    if isa(m,'localmod') && Stage==NumStages
       des = globalmodel(des, m);
    elseif ~isa(m,'localmod') && Stage<NumStages
       des = localmodel(des, m);
    end

    
    if Matched(i) && ~Done(loc(i))
        % don't update more than once
        Done(loc(i)) = true;
        Index(i) = loc(i)+1;
        dtree.designs{Index(i)} = des;
    else
        % add a new design
        ddev(Stage).DesignTree = dtree;
        ddev = addDesign(ddev,des,Stage);
        dtree = ddev(Stage).DesignTree;
        des = dtree.designs{end};
        Index(i) = length(dtree.designs);
    end
    
    D(i) = mbcdoe.design(des);
end

ddev(Stage).DesignTree = dtree;

% update designdev
pTP.designdev(ddev);


function des = localmodel(des,m)

if DesignType(des)==1
    %optimal designs
    L = xregCreateModel(@localsurface,m);
    L = set(L,'model',m);
else
   % make multimodel
   L = xregCreateModel(@localmulti,m);
   L = set(L,'models',{m});
end
des=safechange(des,@(des) model(des,L));



function des = globalmodel(des,L)
% make global model
if isa(L,'localsurface') || isa(L,'localusermod')
    % get internal model
    m = get(L,'model');
elseif isa(L,'localmulti')
   % get model from multimodel
   m = get(L,'currentmodel');
else
    error(message('mbc:mbcmodel:testplan:InvalidModel2', getType( L )))
end
des=safechange(des,@(des) model(des,m));