www.gusucode.com > mbctools 工具箱 matlab 源码程序 > mbctools/+mbcmodelview/+local/ModelActions.m
classdef ModelActions < handle %ModelActions Model menu actions % Copyright 2005-2015 The MathWorks, Inc. and Ford Global Technologies, Inc. properties (SetAccess=private) %ModelEdit model setup dialog ModelEdit %Reset reset model to test plan model FitLocal %UpdateFit update fit for response features UpdateFit %Evaluate evaluate menu (has submenus) Evaluate %BuildModels create alternative models BuildModels %SelectModel open model selection figure SelectModel %AssignBest assign current model as best AssignBest %CreateTwoStage create two-stage model (MLE or two-stage) CreateTwoStage %DeleteAlternatives delete alternative models DeleteAlternatives end properties(Access=private) %MessageService MessageService handle MessageService %ModelEdit model edit group ModelEditGroup %ModelSelection model selection group ModelSelection end methods function obj = ModelActions(MessageService) %GlobalModel constructor obj.MessageService = MessageService; obj.ModelEdit = mbcgui.actions.StatefulAction(@obj.onEdit,... '&Edit Model...','Edit model definition',xregrespath('locreg.bmp')); obj.ModelEdit.TransparentColor = [255 0 255]; obj.FitLocal = mbcgui.actions.StatefulAction(@obj.onFitLocal,... '&Fit Local...','Refine fit for local model',[]); obj.UpdateFit = mbcgui.actions.StatefulAction(@obj.onUpdateFit,... '&Update Fit...','Update response feature models',xregrespath('refresh.bmp')); obj.CreateTwoStage = mbcgui.actions.StatefulAction(@obj.onCreateTwostage,... 'Create &Two-Stage...','Create two-stage model',xregrespath('mle2.bmp')); obj.CreateTwoStage.TransparentColor = [255 0 255]; % Model evaluation options obj.Evaluate = mbcgui.actions.ActionGroup('',... '&Evaluate','Evaluate current model response',[]); obj.Evaluate.MenuType = 'submenu'; obj.Evaluate.Actions = [mbcgui.actions.StatefulAction(@obj.onEvaluateFitData,'&Fit Data...') mbcgui.actions.StatefulAction(@obj.onEvaluateValData,'&Validation Data...') mbcgui.actions.StatefulAction(@obj.onEvaluateNoData,'&No Data...') mbcgui.actions.StatefulAction(@obj.onEvaluateOtherData,'&Other Data...')]; obj.ModelEditGroup = mbcgui.actions.ActionGroup([],'Model Edit'); obj.ModelEditGroup.Actions = [obj.ModelEdit,obj.FitLocal,obj.UpdateFit,obj.CreateTwoStage,obj.Evaluate]; obj.ModelEditGroup.MenuType = 'separate'; % model selection actions obj.BuildModels= mbcgui.actions.StatefulAction(@obj.onBuildModels,... '&Build Global Models...','Create alternative models',xregrespath('buildModels.bmp')); obj.BuildModels.TransparentColor = [0 255 0]; obj.SelectModel= mbcgui.actions.StatefulAction(@obj.onSelectModel,... 'Selection &Window...','Model selection window',[]); obj.AssignBest= mbcgui.actions.StatefulAction(@obj.onAssignBest,... '&Assign Best','Assign current model to best',xregrespath('best_tworeg.bmp')); obj.AssignBest.TransparentColor = [255 0 255]; obj.ModelSelection = mbcgui.actions.ActionGroup([],'Model Selection','Model selection functions',[]); obj.ModelSelection.Actions = [obj.BuildModels,obj.SelectModel,obj.AssignBest]; obj.ModelSelection.MenuType = 'separate'; obj.DeleteAlternatives = mbcgui.actions.StatefulAction(@obj.onDeleteAlternatives,... '&Delete Alternatives','Delete alternatives',xregrespath('dataimport_struct_notok.bmp')); end function createMenus(obj,Parent) %createMenus create model menus from actions hMenu = createMenuItem(obj.ModelEditGroup,Parent); set(hMenu(1),'Accelerator','M'); set(hMenu(:),{'Tag'},{'setup','fitlocal','updatefit','mle','evaluate','fitdata','valdata','nodata','otherdata'}'); hMenu = createMenuItem(obj.ModelSelection,Parent); set(hMenu(:),{'Tag'},{'build','select','assignBest'}'); end function createWorkflowItems(obj,hWorkflow) %createWorkflowItems AG = mbcgui.actions.ActionGroup([],'Workflow'); % could have New Model as well AG.Actions = [obj.ModelEdit,obj.BuildModels,obj.DeleteAlternatives,obj.CreateTwoStage]; AG.MenuType = 'separate'; createWorkflowItems(AG,hWorkflow); end function enable(obj) ms = obj.MessageService; supp= MBsupport(ms.ModelDev); obj.UpdateFit.Enabled = ms.NeedsUpdate~=0; obj.Evaluate.Enabled = ms.Status; % Evaluate with validation data obj.Evaluate.Actions(2).Enabled = ms.Status~=0 && ~isempty(ms.ValidationXData); obj.BuildModels.Enabled = supp.BuildModels; obj.SelectModel.Enabled = supp.validate; obj.CreateTwoStage.Enabled = supp.validate; obj.AssignBest.Enabled = supp.AssignBest; % can delete alternatives when you have more models than needed for % two-stage obj.DeleteAlternatives.Enabled = length(allchildren(ms.ModelDev))>numParams(ms.Model); end end methods(Access=private) function onEdit(obj,~,~) ms = obj.MessageService; OldModel= model(ms.ModelDev); xL= getdata(ms.ModelDev,'X'); [NewModel,OK]= gui_localmodsetup(OldModel,'figure',isEquiSpaced(xL)); if OK && ~isequal(NewModel,OldModel) % only required for two-stage resp= questdlg(['Changing the local model definition ',... 'results in losing all sweep notes,',... 'outliers and sub-model information. ',... 'Do you want to continue?'],'Local Model Change',... 'Yes','No','Yes'); if ~strcmp(resp,'Yes') return end busy(ms); mv_busy('Fitting local and global models'); setupModel(ms,NewModel); idle(ms); mv_busy('delete'); end end function onFitLocal(obj,~,~) ms = obj.MessageService; gui_fitsetup(ms.Model,'create',ms.Pointer,ms); end function onUpdateFit(obj,~,~) updateFit(obj.MessageService) end function onBuildModels(obj,~,~) %create alternative models ms = obj.MessageService; busy(ms); buildModels(ms); idle(ms); end function onSelectModel(obj,~,~) % open model selection figure % open model selection figure ms = obj.MessageService; busy(ms); msg = selectModelFigure(ms); if ~isempty(msg) errordlg(msg,'Model Selection','modal'); end idle(ms) end function onCreateTwostage(obj,~,~) %onCreateTwostage create two-stage model ms = obj.MessageService; % check all globals have a best model pbest= children(ms.ModelDev,@bestmdev); pbest=[pbest{:}]; if any(pbest==0) unvalmdev=children(ms.ModelDev,find(pbest==0),@name); msg = char('You must select a best model for ',... 'all sub-models before creating a two-stage model. ',... 'The following sub-models do not have a best model:',... unvalmdev{:}); xregerror('Two-stage error',msg); return end busy(ms); selrf= SelectRF(ms.Model); TS = ms.TwoStage; if (~isempty(TS) && canMLE(TS)) || (canMLE(ms.ModelDev) && size(selrf,1)==1) % mle directly if there is an mleable two-stage at present % or if there is exactly one that can be built % bring up the mle dialog msg = mle(ms); if ~isempty(msg) xregerror('MLE Error',msg); end elseif canGTS(ms.ModelDev) && size(selrf,1)==1 % only one two-stage model without MLE - just do it twostage(ms.ModelDev,selrf); BMInd= validate(ms.ModelDev); if ~isempty(BMInd) % select best model BestModel(ms.ModelDev,BMInd); update(ms) end else % go through model selection figure to select best combination % of response features msg = selectModelFigure(ms); if ~isempty(msg) errordlg(msg,'Model Selection','modal'); end end idle(ms) end function onAssignBest(obj,~,~) % assign current model to best assignBest(obj.MessageService); end % evaluate callbacks function onEvaluateFitData(obj,~,~) evaluateFitData(obj.MessageService); end function onEvaluateValData(obj,~,~) evaluateValData(obj.MessageService); end function onEvaluateNoData(obj,~,~) evaluateNoData(obj.MessageService); end function onEvaluateOtherData(obj,~,~) evaluateOtherData(obj.MessageService); end function onDeleteAlternatives(obj,~,~) ms = obj.MessageService; if ms.closeSubFigures resp= questdlg('Where best models have been selected all sub-models will be deleted. Do you want to continue?','Clean-up Tree','Yes','No','Yes'); if strcmp(resp,'Yes') % delete all alternatives and select the root node pNode = ms.Pointer; mbH = MBrowser; InBrowser = isBrowserProject(info(pNode)); if ~InBrowser || mbH.SelectNode(xregpointer); % delete all alternatives and select the root node tidytree(info(pNode)); end if InBrowser SelectNode(mbH,pNode); end end end end end end