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