www.gusucode.com > mbctools 工具箱 matlab 源码程序 > mbctools/@mdevtestplan/MakeResponseModels.m

    function T= MakeResponseModels(T,mbH)
%MAKERESPONSEMODELS Create models in test plan for response variables
%
%  MAKERESPONSEMODELS(T, MBH) creates modeldev nodes for each response model
%  defined in the test plan T.

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

if  isBrowserProject(T);
    Progress.mbH = MBrowser;
    View = GetViewData(Progress.mbH);
    Progress.MessageService = View.MessageService; 
else
    Progress = [];
end
    

if ~isempty(T.Responses)

    Progress = iInitialiseProgress(Progress,T);
    
    [px,py]= dataptr(T);
    YTP= py.info;

    NStages= length(T.DesignDev);
    DefModel= HSModel(T.DesignDev);
    tpType = type(T);
    switch NStages
        case 1
            GUID= 'global';
            ModelStageSetting = 1;
            fMake = @iMakeOneStage;
        case 2
            GUID= 'twostage';
            ModelStageSetting= 0;
            fMake = @iMakeTwoStage;
    end


    ValSSF= valdata(T);
    hasValData= ~isempty(ValSSF);
    typeChanged = false;
    
    for i=1:length(T.Responses);

        m= T.Responses{i};
        yi= getOutput(T.Responses{i});

        if nfactors(m)~=nfactors(DefModel);
            % use default model if number of factors has changed
            m= DefModel;
        else
            % copy model info
            m= copymodel(DefModel,m);
        end
        m= setOutput(m,yi);

        % add variable to testplan data
        if ~any(strcmp(yi.Name,get(YTP,'Name')))
            YTP= setVarsFilter(YTP,[get(YTP,'Name'); {yi.Name} ]);
        end
        % update cache and assign back on heap
        YTP= setCacheState(YTP,true);
        py.info= YTP;
        
        if hasValData
            dpVal= dataptr(ValSSF);
            if ~isempty(find(dpVal.info,yi.Name)) 
                if ~any(strcmp(yi.Name,get(YTP,'Name')))
                    % add validation data if channel exists
                    ValSSF= setVarsFilter(ValSSF,[get(YTP,'Name'); {yi.Name} ]);
                end
            else
                % delete validation data
                hasValData= false;
                ValSSF= [];
            end

        end
        
        % response data
        ssf= sweepsetfilter(py);
        YS= setVarsFilter(ssf,{yi.Name});
        % set output units for model
        u= get(YS,'Units');
        yi.Units= u{1};
        m= setOutput(m,yi);

        % make new node
        if ModelStageSetting==0 && isa(get(m,'local'),'localmulti')
            mdev = mdev_local(yi.Name,{get(m,'local'),px(1),YS,'ptbypt'});
            mdev = modelstage(mdev,1);
            
            typeChanged = ~strcmpi('Point-By-Point',tpType);
        else
            mdev = modeldev(yi.Name,{m,px(1),YS,GUID});
            mdev = modelstage(mdev,ModelStageSetting);
            typeChanged = ~strcmpi(GUID,'global') && ~strcmpi('Two-Stage',tpType);

        end
        % add to tree
        T= AddChild(T,mdev);
        % this makes sure that the names are unique
        mdev= name(info(mdev),name(mdev));

        presp= address(mdev);

        % show progress if appropriate
        Progress = iUpdateProgress(Progress,yi.Name,i);
        
        % make the response node
        presp = fMake(T,presp);
        
        % update tree in browser
        Progress = iUpdateTree(Progress,presp);

        % make sure we have the dynamic testplan
        T= info(T);
    end % for i= 1:length(T.Responses)

    if typeChanged
        % change testplan local model
       DefModel = set(DefModel,'Local', get(T.Responses{1},'Local'));
       T.DesignDev = HSModel(T.DesignDev,DefModel);
    end    
    
    % close progress 
    iFinishProgress(Progress,T);
    
    % update validation data
    T= valdata(T,ValSSF);
    % clear the response models because of space considerations
    T.Responses=[];
    xregpointer(T);
    
    


else
    if ~isempty(Progress)
        % stay at the test plan node but refresh
        change(Progress.MessageService)
        T= info(T);
    end
end



function presp = iMakeTwoStage(T,presp)
% iMakeTwoStage

mdev = info(presp);
if strcmp(presp.guid,'twostage')
    m = model(mdev);
    DatumType= get(m,'datumtype');
    if DatumType==3
        % link to R1 datum
        R1= children(T,1);
        pdatum= R1.dataptr('data');
        mdev= AssignData(mdev,'data',pdatum);
    end
    plocal= modeldev(m,address(mdev));
    mdev = info(mdev);
    switch DatumType
        case {1,2}
            % connect datum link
            pdatum= plocal.children(1);
            AssignData(mdev,'data',pdatum);
    end
else
    % make some empty response feature data
    X = presp.getdata('fit');
    pD=xregpointer(X{2}(:,~1));
    presp.RFData(pD);
    % point-by-point models
    presp.fitmodel;
end


function presp = iMakeOneStage(T,presp)
%iMakeOneStage


% fit onestage model
try
    % fit onestage model
    presp.fitmodel;
end

function Progress = iInitialiseProgress(Progress,T)
%iInitialiseProgress

if ~isempty(Progress)
    % lock model browser and make waitbar
    mbH = Progress.mbH;
    mbH.GUILocked= true;
    ms = Progress.MessageService;
    busy(ms)
    Progress.hWB= xregGui.waitdlg('parent',mbH.Figure);
    set(Progress.hWB.waitbar,'Min',1,'Max',length(T.Responses)+1);
    Progress.OldPtr= get(mbH.Figure,'Pointer');
else
    Progress = [];
end

function Progress = iUpdateProgress(Progress,Name,Value)
%iUpdateProgress

if ~isempty(Progress)
    hWB = Progress.hWB;
    hWB.message= ['Fitting model for ',Name,' ...'];
    hWB.waitbar.value= Value;
end

function Progress = iUpdateTree(Progress,presp)
%iUpdateTree

if ~isempty(Progress)
    if presp~=0
        % add to treeview
        ms = Progress.MessageService;
        changeTree(ms,presp,[])
    end
end

function Progress = iFinishProgress(Progress,T)
%iFinishProgress

if ~isempty(Progress)
    mbH = Progress.mbH;
    delete(Progress.hWB);
    
    mbH.GUILocked= false;
    
    node = mbH.treeview('current');
    ms = Progress.MessageService;
    
    if isequal(node,address(T))
        if isscalar(T.Responses)
            % select model node
            pDisp = children(T);
            pDisp = pDisp(end);
            if numstages(T)>1 && pDisp.numChildren>0
                % select local node for two-stage models
                pDisp = pDisp.children;
            end
            mbH.SelectNode(pDisp(1));
        else
            % stay at the test plan node but refresh
            change(ms)
        end
    end
    idle(ms)
end