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