www.gusucode.com > mbctools 工具箱 matlab 源码程序 > mbctools/@mdev_local/mledialog.m
function mdev = mledialog(mdev,Message) %MLEDIALOG dialog to run mle % % hFig= mledialog(mdev,Message) % Copyright 2000-2015 The MathWorks, Inc. and Ford Global Technologies, Inc. if nargin==1 Message=''; end dlg = mbcgui.container.Dialog('Name', 'Maximum Likelihood Estimation', ... 'Size', [450 450], ... 'Buttons','OK_CANCEL_HELP',... 'HelpCode', 'xreg_MLEsetup', ... 'DefaultAction', 'OK'); dlg.disableButtons('OK'); hFig = dlg.Figure; dlgMessage = uicontrol('Parent',hFig,... 'Style','text',... 'HorizontalAlignment','left',... 'String',Message); udh=dlgMessage; algs= {'Quasi-Newton','Expectation-Maximization'}; algFrame = mbcgui.container.layoutpanel(... 'Parent', hFig,... 'BorderType', 'etchedin', ... 'Title','Algorithm'); algCtrl = cell(4,1); MLEObj.CovAlg=uicontrol('Parent',algFrame,... 'Style','popup',... 'Value',2,... 'BackgroundColor','w',... 'HorizontalAlignment','left',... 'String',algs,... 'Callback',{@i_ChangeAlg,udh}); algCtrl{1} = xregGui.labelcontrol('Parent', algFrame, ... 'LabelSizeMode', 'absolute', ... 'LabelSize', 170, ... 'ControlSize', 200, ... 'String', 'Covariance estimation algorithm:', ... 'Control', MLEObj.CovAlg); MLEObj.TolFun=uicontrol('Parent',algFrame,... 'Style','edit',... 'BackgroundColor','w',... 'HorizontalAlignment','left',... 'String',1e-3,... 'UserData',1e-3,... 'Callback',@(s,e) xregCheckIsNum(s)); algCtrl{2} = xregGui.labelcontrol('Parent', algFrame, ... 'LabelSizeMode', 'absolute', ... 'LabelSize', 170, ... 'ControlSize', 75, ... 'String', 'Tolerance:', ... 'Control', MLEObj.TolFun); MLEObj.InitVal=uicontrol('Parent',algFrame,... 'Style','checkbox',... 'String','Initialize with previous estimate'); algCtrl{3} = MLEObj.InitVal; MLEObj.PredMode=uicontrol('Parent',algFrame,... 'Style','checkbox',... 'String', 'Predict missing values'); algCtrl{4} = MLEObj.PredMode; MLEObj.AlgCtrl = [MLEObj.CovAlg MLEObj.TolFun MLEObj.InitVal MLEObj.PredMode]; galg= xreggridbaglayout(algFrame,... 'packstatus', 'off', ... 'dimension',[4 1],... 'rowsizes', [20 20 20 20], ... 'gap', 5, ... 'border', [10 10 10 5], ... 'elements',algCtrl); set(algFrame, 'LayoutComponent', {galg}); progFrame = mbcgui.container.layoutpanel(... 'Parent', hFig,... 'BorderType', 'etchedin', ... 'Title','Progress'); MLEObj.ProgAxes= axes('Parent',progFrame,... 'Box','on',... 'Units','pixels'); axPanel = mbcgui.widget.AxesPanel(... 'AxesHandle', MLEObj.ProgAxes, ... 'Border', [30 20 10 20]); btns{1}= uicontrol('Parent',progFrame,... 'Style','pushbutton',... 'String','Start',... 'Interruptible','on',... 'Callback',{@i_Start,udh}); btns{2}= uicontrol('Parent',progFrame,... 'Style','pushbutton',... 'String','Stop',... 'Enable','off',... 'Callback',@i_Stop); MLEObj.Ctrls= btns; MLEObj.info= uicontrol('Parent',progFrame,... 'Style','text',... 'HorizontalAlignment','left',... 'String','MLE progress message'); gProg = xreggridbaglayout(progFrame, ... 'dimension', [6 2], ... 'gap', 10, ... 'rowsizes', [10 25 25 -1 10 40], ... 'colsizes', [-1 65], ... 'border', [10 10 10 5], ... 'mergeblock', {[1 4], [1 1]}, ... 'elements', {axPanel, [], [], [], [],MLEObj.info, [], btns{1}, btns{2},[],[],[]}); set(progFrame, 'LayoutComponent', {gProg}); fmain= xreggridlayout(hFig,... 'dimension',[3 1],... 'correctalg','on',... 'rowsizes',[30 140 -1],... 'gap',7, ... 'elements', {dlgMessage, algFrame, progFrame}); set(fmain,'Visible','on'); dlg.Content=fmain; MLEObj.OldMdev= mdev; MLEObj.node= address(mdev); MLEObj.hasRun=0; MLEObj.Dialog = dlg; set(udh,'UserData',MLEObj); setValues(mdev,MLEObj); CloseMode = dlg.showDialog; % Get updated data mdev = info(mdev); MLEObj= get(udh,'UserData'); if MLEObj.hasRun if strcmp(CloseMode, 'CANCEL') % Rollback to the previous object mdev= MLEObj.OldMdev; BestModelIndex = BMIndex(mdev); [mdev,msg]= mle_best(mdev,BestModelIndex==2); if ~isempty(msg) hFig= msgbox(msg,... 'Model Selection','modal'); uiwait(hFig); end end % Update browser if necessary mbH = MBrowser; if isBrowserProject(mdev,mbH) % update of the view is done by mbcmodelview.local.TwostageMessageService if MLEObj.node==mbH.CurrentNode mbH.doEnableStatus; listview(mbH); end mbH.doDrawTree(MLEObj.node); mbH.doDrawText; mbH.doDrawIcons; end end delete(dlg); function setValues(mdev,MLEObj) TS= BestModel(mdev); modes= mle_modes(mdev); if isempty(modes) || length(modes)==2 || modes(3)>2 modes(2)= 1; Y= getdata(mdev,'Y'); if ngfactors(TS)>5 || size(Y,3)>100 % Expectation Maximimisation modes(3)= 2; modes(4)= 1e-3; else % Quasi Newton modes(3)= 1; modes(4)= 1e-6; end mdev.MLE.Modes= modes; pointer(mdev); end % Initial Value if ismle(TS) set(MLEObj.InitVal,'Value',1); else set(MLEObj.InitVal,'Value',0,'Enable','off'); end set(MLEObj.PredMode,'Value',modes(2)); set(MLEObj.CovAlg,'Value',modes(3)); set(MLEObj.TolFun,'String',modes(4),'UserData',modes(4)); function i_Start(h,evt,udh) MLEObj= get(udh,'UserData'); fh= get(udh,'Parent'); set(fh,'Pointer','custom','PointerShapeCData',backbusyptr); global status status=0; p= MLEObj.node; mdev= p.info; set(MLEObj.info,'String','Calculating MLE'); CovAlg= get(MLEObj.CovAlg,'Value'); TolFun= get(MLEObj.TolFun,'UserData'); PredMode= get(MLEObj.PredMode,'Value'); InitVal= get(MLEObj.InitVal,'Value'); mdev.MLE.Modes= [InitVal PredMode CovAlg TolFun]; delete(get(MLEObj.ProgAxes,'Children')) % Disable most controls btns = [MLEObj.Ctrls{1} MLEObj.AlgCtrl]; set(btns,'Enable','off'); % Enable stop button set(MLEObj.Ctrls{2},'Enable','on'); MLEObj.Dialog.disableButtons('OK', 'CANCEL'); %Start MLE process warn_status=warning; warning('off','all'); switch CovAlg case 1 CovAlg= 'mlelin'; case 2 CovAlg= 'mle_ExpMaxim'; end if InitVal InitVal= 'mle'; else InitVal= 'univariate'; end try mdev=mle(mdev,InitVal,CovAlg,TolFun,{MLEObj.ProgAxes,MLEObj.info},PredMode); MLEObj.hasRun=1; end if MLEObj.hasRun s=statistics(mdev); set(MLEObj.info,'String',sprintf('Two-Stage RMSE= %g',s(2))); end set(udh,'UserData',MLEObj) warning(warn_status); % MLE has now stopped set(btns,'Enable','on'); MLEObj.Dialog.enableButtons('OK', 'CANCEL'); set(MLEObj.Ctrls{2},'Enable','off'); set(fh,'Pointer',get(0,'DefaultFigurePointer')); %-------------------------------------------------------------- % Stop MLE Optimisation half way through %-------------------------------------------------------------- function i_Stop(src,null) global status OPT_STOP status=1; OPT_STOP=1; %-------------------------------------------------------------- % i_TolFun - changes default tolerances when algorithms change %-------------------------------------------------------------- function i_ChangeAlg(h,evt,udh) MLEObj= get(udh,'UserData'); delete(get(MLEObj.ProgAxes,'Children')) switch get(MLEObj.CovAlg,'Value') case 1 % QN set(MLEObj.TolFun,'String',1e-6,'UserData',1e-6); case 2 % Expectation Maximisation set(MLEObj.TolFun,'String',1e-3,'UserData',1e-3); end