www.gusucode.com > mbctools 工具箱 matlab 源码程序 > mbctools/+mbcmodelview/+global/ModelActions.m

    classdef ModelActions < handle
    %ModelActions Model menu actions
    
    %  Copyright 2005-2016 The MathWorks, Inc. and Ford Global Technologies, Inc.

    properties (SetAccess=private)
        %ModelEdit model setup dialog
        ModelEdit 
        %NewAlternative new alternative model
        NewAlternative
        %Reset reset model to test plan model
        Reset   
        %SummaryStatistics open summary statistics dialog
        SummaryStatistics 
        %Evaluate evaluate menu (has submenus)
        Evaluate 
        %BoxCox Box-Cox transforms
        BoxCox 
        %Utilities utilties (dynamic group) for model-specific actions
        Utilities 
        %MakeTemplate make a template from sub models
        MakeTemplate
        %BuildModels create alternative models
        BuildModels
        %SelectModel open model selection figure
        SelectModel
        %AssignBest assign current model as best
        AssignBest
        %DeleteAlternatives delete alternative models
        DeleteAlternatives
    end
    
    properties(Access=private)
        %MessageService MessageService handle
        MessageService
        %ModelEditGroup 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('gloreg.bmp'));
        obj.ModelEdit.TransparentColor = [255 0 255];
        
        obj.NewAlternative = mbcgui.actions.StatefulAction(@obj.onNewAlternative,...
            '&Add Model...','Add alternative model',xregrespath('newglobalmod.bmp'));  
        
        obj.Reset   = mbcgui.actions.StatefulAction(@obj.onReset,...
            '&Reset','Reset model to test plan default',[]);
        obj.SummaryStatistics = mbcgui.actions.StatefulAction(@obj.onSummaryStats,...
            'Summar&y Statistics...','Define summary statistics',[]);
        obj.BoxCox = mbcgui.actions.StatefulAction(@obj.onBoxCox,...
            '&Box-Cox Transform...','Define Box-Cox transform',xregrespath('boxcox.bmp'));

        % 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...')];
        
        % model specific utilities
        obj.Utilities = mbcgui.actions.DynamicActionGroup([],...
            '&Utilities','Model specific functions',[]);
        obj.Utilities.MenuType = 'submenu';

        obj.ModelEditGroup = mbcgui.actions.ActionGroup([],'Model Edit');
        obj.ModelEditGroup.Actions = [obj.ModelEdit,obj.Reset,obj.SummaryStatistics,obj.BoxCox,obj.Evaluate];
        obj.ModelEditGroup.MenuType = 'separate';
        
        % model selection actions
        obj.MakeTemplate= mbcgui.actions.StatefulAction(@obj.onMakeTemplate,...
            'Create &Template...','Create model template',[]);
        obj.BuildModels= mbcgui.actions.StatefulAction(@obj.onBuildModels,...
            '&Create Alternatives...','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_gloreg.bmp'));
        obj.AssignBest.TransparentColor = [255 0 255];
        
        obj.ModelSelection = mbcgui.actions.ActionGroup([],'Model Selection','Model selection functions',[]);
        obj.ModelSelection.Actions = [obj.MakeTemplate,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','reset','stats','Ytranstool','evaluate','fitdata','valdata','nodata','otherdata'}');
        createMenuItem(obj.Utilities,Parent);
        hMenu = createMenuItem(obj.ModelSelection,Parent);
        set(hMenu(:),{'Tag'},{'template','build','select','assignBest'}');
        end
        
        
        function createUtilityFunctions(obj,hToolbar)
        %createUtilityFunctions create model specific utilities from actions
        
        % get actions for model
        actions = modelactions(obj.MessageService.ModelDev,obj.MessageService);
        % Changing actions for a DynamicActionGroup causes menus to be
        % updated
        if ~isempty(actions)
            % make an action group with a separator at the beginning
            AG =mbcgui.actions.ActionGroup('','Utilities');
            AG.Actions = actions;
            AG.MenuType = 'separate';
            
            if ~obj.MessageService.Status
                % disable utility actions if not fitted
                AG.Enabled = false;
            end
            
        else
            AG = actions;
        end
        
        obj.Utilities.Actions = AG;
        
        % have to create toolbar items explicitly
        createToolbutton(obj.Utilities,hToolbar);
        
        end
        
        function createWorkflowItems(obj,hWorkflow)
        %createWorkflowItems create workflow items in workflow panel
        
        AG = mbcgui.actions.ActionGroup([],'Workflow');
        % could have New Model as well
        AG.Actions = [obj.ModelEdit,obj.NewAlternative,obj.BuildModels,obj.DeleteAlternatives];
        AG.MenuType = 'separate';
        createWorkflowItems(AG,hWorkflow);
        
        end
        
        function enable(obj)
        %enable enable actions based on state of MessageService
        
        ms = obj.MessageService;
        if isa(ms.ModelDev,'mdevmlerf')
            % MLE model node
            set(obj.ModelEditGroup,'Enabled',false);
            set(obj.ModelSelection,'Enabled',false);
            obj.NewAlternative.Enabled = false;
            obj.Evaluate.Enabled = true;
            obj.Utilities.Enabled = true;
            obj.DeleteAlternatives.Enabled = ms.CurrentNode.numChildren>0;
            
        else
            
            set(obj.ModelEditGroup,'Enabled',true);
            set(obj.ModelSelection,'Enabled',true);
            obj.NewAlternative.Enabled = true;

            % Turn on actions depending on whether model is fitted
            StatusActions = [obj.Reset,obj.SummaryStatistics,obj.BoxCox,obj.Evaluate,obj.Utilities,obj.AssignBest];
            
            set(StatusActions,'Enabled',ms.Status~=0)
            
            obj.BoxCox.Enabled = ms.Status~=0 && (islinear(ms.Model) && ~isa(ms.Model,'xregunispline'));
            par = Parent(ms.ModelDev);
            obj.AssignBest.Enabled = (strcmp(par.class,'modeldev') && hasBest(ms.ModelDev) && ms.Status~=0);

            % require children to select model or make a template
            HasKidsActions = [obj.MakeTemplate, obj.SelectModel];
            if ms.CurrentNode.numChildren>0
                set(HasKidsActions,'Enabled',true);
            else
                set(HasKidsActions,'Enabled',false);
            end
            % can clean up if there are alternatives and a best model is
            % assigned
            obj.DeleteAlternatives.Enabled = ms.CurrentNode.numChildren>0 && ms.CurrentNode.hasBest;
        end
        % Evaluate with validation data
        obj.Evaluate.Actions(2).Enabled  = ms.Status~=0 && ~isempty(ms.ValidationXData);
        
        end

        
    end
    
    methods(Access=private)
        function onEdit(obj,~,~)
        %onSetup setup model definition 
        
        ms = obj.MessageService;
        
        if ms.closeSubFigures
            % have to close sub figures to set up a new model
            
            OldModel= reset(model(ms.ModelDev));
            % open dialog
            [NewModel,OK] = gui_ModelSetup(OldModel,'boxcox',true);
            
            if OK && ~isequal(NewModel,OldModel)
                % only need to update model if OK pressed and model is
                % different
                busy(ms);
                setupModel(ms,NewModel);
                idle(ms);
            end
        end
        end
        
        function onNewAlternative(obj,~,~)
        %onNewAlternative create a new alternative
        
        ms = obj.MessageService;
        busy(ms)
        if ms.NumChildren==0
            % make a copy of current model
            pCopy = modeldev(ms.Model,ms.CurrentNode,false,false);
            copyCreated = true;
        else
            copyCreated = false;
        end
        % create a new model with dialog
        pNew= modeldev(ms.Model,ms.CurrentNode,true);
        if ~isnull(pNew)
            if isBrowserProject(ms.ModelDev)
                % update tree
                if copyCreated
                    treeview(MBrowser,info(pCopy),'add')
                end
                treeview(MBrowser,info(pNew),'add')
            end
            % select new node
            selectAlternative(ms,ms.NumChildren)
        elseif copyCreated
            % delete copy if user cancelled
            delete(info(pCopy));
        end
        idle(ms);
        end
        
        function onReset(obj,~,~)
        %onReset reset model to default model for test plan
        
        resp = questdlg('The model will be reset to the default model definition for the test plan and all data will be restored. Do you want to continue?',...
            'Reset Model','Yes','No','Yes');
        if strcmp(resp,'Yes')
            ms = obj.MessageService;
            ResetModel(ms.ModelDev);
            update(ms);
        end
        
        end
        
        function onSummaryStats(obj,~,~)
        %onSummaryStats setup summary statistics for model and children
        
        ms = obj.MessageService;
        % apply to top level modeldev
        mdev= info(ms.CurrentNode);
        if ms.Status
            [m,OK]= gui_SummaryStats(ms.Model);
            
            if OK
                List=StatsList(m);
                
                % update the model statistics
                mdev= addSummaryStats(mdev,List);
                children(mdev,@addSummaryStats,List);
                % view the updated node
                update(ms)
            end
        end
        
        end
        
        function onBoxCox(obj,~,~)
        % Box-Cox GUI is modal
        ms = obj.MessageService;
        xregMdlGui.boxcox(ms.Pointer,@ms.update);
        end
        
        function onMakeTemplate(obj,~,~)
        % make a model template
        
        [fname,pth] = uiputfile(mbcGetPath('mbcmodel', 'Designs', '*.mbm'),'Model Template');
        if isnumeric(fname)
            return
        end

        [p,f,~] = fileparts(fullfile(pth,fname));
        fname = fullfile(p,[f,'.mbm']);
        
        ms = obj.MessageService;
        mlist = children(info(ms.CurrentNode),@model); %#ok<NASGU>
        save('-mat', fname, 'mlist');
        
        end
        
        function onBuildModels(obj,~,~)
        %create alternative models
        if closeSubFigures(obj.MessageService)
            buildModels(obj.MessageService);
        end
        end
        
        function onSelectModel(obj,~,~)
        % open model selection figure
        
        msg = selectModelFigure(obj.MessageService);
        if ~isempty(msg)
            errordlg(msg,'Model Selection','modal');
        end
        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,~,~)
        %onDeleteAlternatives delete alternative models
        ms = obj.MessageService;
        if ms.closeSubFigures
            % close any sub figures before performing this task
            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
                pCurrentNode = ms.CurrentNode;
                InBrowser = isBrowserProject(info(pCurrentNode));
                if ~InBrowser || SelectNode(MBrowser,xregpointer);
                    % delete all alternatives and select the root node
                    tidytree(info(pCurrentNode));
                end
                if InBrowser
                    SelectNode(MBrowser,pCurrentNode);
                end
            end
        end
        
        end
        
        
    end
end