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

    function R = CreateResponse(T, VarName, varargin)
%CREATERESPONSE Add a new response model to test plan.
% 
%   RESPONSE = CREATERESPONSE( TESTPLAN, VARNAME ) creates a model of VARNAME using the testplan's
%   default model(s).
%   RESPONSE = CREATERESPONSE( TESTPLAN, VARNAME, MODEL ) creates a one-stage model.
%
%   RESPONSE = CREATERESPONSE( TESTPLAN, VARNAME, LOCALMODEL, GLOBALMODEL) 
%   RESPONSE = CREATERESPONSE( TESTPLAN, VARNAME, LOCALMODEL, GLOBALMODEL, DATUMTYPE ) 
%   creates a two-stage model of VARNAME. DATUMTYPE can only be specified
%   if the local model type permits a datum model. Currently only
%   Polynomial Spline and Polynomial with Datum models permit datum models.
%   VARNAME     : name of variable for output
%   LOCALMODEL  : Local Model object (use default if empty)
%   GLOBALMODEL : Response Feature model object (use default if empty)
%   DATUMTYPE   : 'None', 'Maximum' , 'Minimum' ,'Linked'
%   MODEL       : One-stage model object (use default if empty)

%   Copyright 2004-2015 The MathWorks, Inc.

% Get the testplan
TP = T.Object;

if ~IsMatched(TP)
    error(message('mbc:mbcmodel:testplan:InvalidState1'));
end


% check signal
InputSizes = T.InputsPerLevel;
switch length(InputSizes)
    case 1
        if length(varargin)>1
            error(message('mbc:mbcmodel:testplan:InvalidArgument3'))
        end
        Args{1} = iCreateOneStageResponse(T.Object, varargin{:});
    case 2
        if length(varargin)>3
            error(message('mbc:mbcmodel:testplan:InvalidArgument4'))
        end
            
        [Args{1:3}] = iCreateTwoStageResponse(T.Object,varargin{:});
end

% Create the responses
pR = AddResponse(TP, VarName, Args{:});
R = pFindUddChildForPointer( T.Responses, pR );

function varargout = iCreateOneStageResponse(T, Model)
% iCreateOneStageResponse
InputSizes = nfactors(designdev(T));
if nargin<2 || isempty(Model)
    G = model(T);
elseif isa(Model,'mbcmodel.model') && ~isa(Model,'mbcmodel.localmodel') && Model.NumberOfInputs==InputSizes
    G = Model.Object;
else
    error('mbc:mbcmodel:testplan:InvalidArgument',...
        'Invalid global model for test plan')
end
varargout = {G};

function varargout = iCreateTwoStageResponse(T,LocalModel, GlobalModel, DatumType)
% iCreateTwoStageResponse

InputSizes = nfactors(designdev(T));
if nargin<2 || isempty(LocalModel)
    % get default model
    D = designdev(T);
    L = getModel(D(1));
elseif isa(LocalModel,'mbcmodel.localmodel') && LocalModel.NumberOfInputs==InputSizes(1)
    L = LocalModel.Object;
else
    error('mbc:mbcmodel:testplan:InvalidArgument1',...
        'Invalid local model for test plan')
end
if nargin<3 || isempty(GlobalModel)
    % default global model
    D = designdev(T);
    G = getModel(D(2));
elseif isa(GlobalModel,'mbcmodel.model') && ~isa(GlobalModel,'mbcmodel.localmodel') && GlobalModel.NumberOfInputs==InputSizes(2)
    G = GlobalModel.Object;
else
    error('mbc:mbcmodel:testplan:InvalidArgument',...
        'Invalid global model for test plan')
end

if nargin==4 
    if ~permitsDatum(L) && ~strcmpi(DatumType,'none')
        error('mbc:mbcmodel:testplan:InvalidValue',...
            'DatumType is not permited for models of type %s',getType(L))
    end
    % datum type
    enum = findtype('mbcmodel.localmodel.datumtype');
    dtype = find(strcmpi(DatumType,enum.Strings));
    if isempty(dtype)
        dstr = sprintf('%s,',enum.Strings{:});
        dstr = dstr(1:end-1);
        error(message('mbc:mbcmodel:testplan:InvalidValue1', dstr))
    end
    % datum type is 0:3
    dtype = dtype - 1;
    if dtype==3
       % check if linked datums are permitted
       R = children(T);
       if numChildren(T)==0 || R(1).dataptr('DATA')==0
           error(message('mbc:mbcmodel:testplan:InvalidValue2'))
       end
    end
else
    dtype = get(L,'DatumType');
end

varargout = {L,G,dtype};