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