www.gusucode.com > mbcdata 工具箱 matlab 源码程序 > mbcdata/@cgoptimrunner/private/pRunv3.m

    function [mainOK, mainmsg, OK, freevals, msg, stats,selectedsol] = ...
                                    pRunv3(obj, DOWAITBAR, waitH)
%PRUNV3 Run the optimization using version 3 interface.
%
%   [MAINOK, MAINMSG, OK, FREEVALS, MSG, STATS] = PRUNV3(OBJ) runs the
%   optimization assuming the user-function is written for MBC version 3
%   optimization interfaces.

%   Copyright 2006-2010 The MathWorks, Inc.


NRuns = length(obj.RunIndices);

mainOK = true;
mainmsg = '';

% Set up waitbar correctly
if DOWAITBAR
    if NRuns>1
        waitH.waitbar.min = 0;
        waitH.waitbar.max = NRuns;
    else
        % turn off waitbar
        waitH.waitbar.visible = 'off';
    end
end

freevalcell = cell(1, NRuns);
OK = cell(1, NRuns);
msg = cell(1, NRuns);
statcell = cell(1, NRuns);
selectedsol = cell(1, NRuns);
for n = 1:NRuns
    obj = nextRun(obj);
    cos = cgoptimstore(obj);
    if ~getStopState(cos)
        if DOWAITBAR && NRuns > 1
            waitH.message = sprintf('Computing optimal settings for run %d',...
                obj.RunIndices(n));
        end
        try
            % Evaluate function
            cos = feval(obj.FunctionName, 'evaluate', cos);
        catch ME
            mainOK = false;
            mainmsg = sprintf('%s\n\n%s', ...
                'An error occurred while running the optimization function:', ...
                ME.message);
        end
        
        % Retrieve results
        [OK{n}, msg{n}, statcell{n}] = getOutputInfo(cos);
        [freevalcell{n},selectedsol{n}] = getFreeVariables(cos);
            
            
        % Increment waitbar
        if DOWAITBAR && NRuns > 1
            waitH.waitbar.value = n;
        end

    else
        if DOWAITBAR
            waitH.Message = 'Stopping optimization...';
        end
        OK{n} = -1;
        msg{n} = 'Optimization terminated by user. The algorithm was not run.';
        statcell{n} = [];
        freevalcell{n} = getInitFreeVal(cos);
    end
    
    if ~mainOK
        break
    end
end


freevals = cell(1, length(obj.FreeVariableIndices));
stats = [];
if mainOK
    % expand solutions to the same size
    [freevalcell,OK,msg]= pSquareUpMultiSolns(freevalcell,OK,msg);

    stats = pStatsCell2Struct(statcell); 
    freevals = pRunCell2VarCell(obj, freevalcell);
end