www.gusucode.com > mbcview 工具箱matlab源码程序 > mbcview/+cgcalsetup/OptimData.m
classdef OptimData < cgcalsetup.ModelData %OptimData data object for creating an optimization from a model % % C = cgcalsetup.OptimData(pNode,MakeTables); % Copyright 2009 The MathWorks, Inc. and Ford Global Technologies, Inc. properties %Type 'Minimize' or 'Maximize' ObjectiveType = 'Minimize'; %Algorithm MBC optimization algorithm Algorithm = 'foptcon'; %IsSumOptim use sum or point objective IsSumOptim = false; %IsFree logical array indicating which inputs are free variables in %the optimization IsFree %BoundaryConstraint create a boundary constraint in optimization BoundaryConstraint = false; %DATATYPE data type for current model DataType %DataSource data source (table or data set) for optimization data DataSource end properties (Dependent,SetAccess=protected) %DATASETS list of data sets that could be used to initialize %optimization data Datasets %TABLES list of tables that could be used to initialize optimization data Tables %DATATYPELIST list of different data types for the current model DataTypeList end methods function OPT = OptimData(varargin) OPT@cgcalsetup.ModelData(varargin{:}); %set up various error messages for wziard OPT.Title = 'Optimization'; OPT.Description = 'Select a model to minimize or maximize.'; OPT.ErrorMessage = 'You must have models in the CAGE project before you can create an optimization from a model.'; end function D = get.Datasets(OPT) A = getConnections(OPT.Project.info); Indices = find(A,'Type','Dataset'); D = A.pData(Indices); % data sets that have model inputs dok = false(size(D)); IsSwitch = OPT.isSwitchModel; if IsSwitch pFacs = OPT.pSwitchInputs; OpPoints = getSwitchPoints(getSwitchModel(OPT.Model)); end for i=1:length(D) pDSinputs = D(i).get('ptrlist'); Data = D(i).get('data'); dok(i) = any(ismember(pDSinputs,OPT.pInputs)) && ~isempty(Data); if dok(i) && IsSwitch % data set has all switch inputs and the values must % match the model operating points [OK,loc] = ismember(pFacs,pDSinputs); dok(i) = all(OK) && all(ismember(Data(:,loc),OpPoints,'rows')); end end D = D(dok); end function T = get.Tables(OPT) A = getConnections(OPT.Project.info); Indices = find(A,'Type','Table'); T = A.pData(Indices); tok = false(size(T)); % tables that are simple and that only have model inputs pTabInps = pveceval(T,@getinports); IsSimple= pveceval(T,@issimpletable); for i=1:length(T) tok(i) = IsSimple{i} && ... all(ismember(pTabInps{i},OPT.pInputs)) && ... length(pTabInps{i})<length(OPT.pInputs); end T = T(tok); end function List = get.DataTypeList(C) if isMultiModal(C.Model) % if more than one operating point variable mdl = getSwitchModel(C.Model); if length(getSwitchFactors(mdl))>1 %can only use model operating points for point-by-point List = {'Unique operating points','Model operating points'}; else List = {'Set point','Model operating points'}; if ~isempty(C.Tables) %tables available List = [List {'Table grid'}]; end end elseif isSwitchModel(C) %can only use model operating points for point-by-point List = {'Model operating points'}; else List = {'Set point'}; if ~isempty(C.Tables) %tables available List = [List {'Table grid'}]; end end if ~isempty(C.Datasets) %Data sets available List = [List {'Data set'}]; end end function createItems(C) %createItems create all items set up by wizard createItems@cgcalsetup.ModelData(C); createOptim(C); end function f = getModelNextPage(W) %#ok<MANU> %getModelNextPage wizard page to follow model selection page f = @cgcalsetup.OptimPage.createPage; end end methods (Access=protected) function reportNewItems(C) % just go to new optimization pOpt= C.getCreatedItems; gotonode(cgbrowser,pOpt(end)); end function createOptim(OPT) OptimName = [getname(OPT.Model), '_Optimization']; pFree = OPT.pInputs(OPT.IsFree); %main creation is done in cgmodexpr/createOptim pOptNode = createOptim(OPT.Model,OPT.Project,OPT.ObjectiveType,OptimName,pFree,... OPT.Algorithm,OPT.BoundaryConstraint,OPT.IsSumOptim); pOpt = pOptNode.getdata; optim = info(pOpt); pData = OPT.DataSource; switch OPT.DataType case 'Data set' %import data from data set pDataset = get(pData.info,'ptrlist'); [pfacs,ia] = intersect(pDataset,OPT.pInputs); optim = setNumRuns(optim, size(pData.get('data'),1)); optim = setinitialvaluedatafromdataset(optim, pData, {pfacs,ia}, 'point'); case 'Table grid' %initialize with table grid pTableInputs = pData.getinports; isIndep = cgisindependentvars(pTableInputs, [pFree, getfixedvalues(optim)]); if ~any(isIndep) nRunsTable = prod(getTableSize(pData.info)); optim = setNumRuns(optim, nRunsTable); optim = setinitialvaluedatafromtablegrid(optim, pData, false); end case {'Model operating points','Unique operating points'} %initialize with model operating points for %point-by-point models optim = initializeSwitchData(optim,OPT.DataType); case 'Set point' % initialized by default otherwise error(message('mbc:cgcalsetup:OptimData:InvalidState')) end if OPT.IsSumOptim && getNumRuns(optim)>1 % have to convert to a multivalue optimization after setting % data optim = convertinitialvaluedata(optim, 'multivalue'); end pOpt.info = optim; addCreatedItems(OPT,pOptNode); end function [pItems,pExpr] = getCreatedItems(C) %getCreatedItems list of created items and associated expressions % % [pItems,pExpr] = getCreatedItems(C) [pItems,pExpr] = getCreatedItems@cgcalsetup.ModelData(C); pExpr = [pExpr,address(C.Model)]; end function setModelNode(C) %setModelNode reset object when model selection is changed setModelNode@cgcalsetup.ModelData(C); C.IsFree = true(size(C.pInputs)); if C.isSwitchModel %remove switch factors C.IsFree = ~ismember(C.pInputs,C.pSwitchInputs); end C.BoundaryConstraint = concheck(C.Model); % defaults C.Algorithm = 'foptcon'; C.ObjectiveType = 'Minimize'; C.IsSumOptim = false; C.DataType = C.DataTypeList{1}; C.DataSource = []; end end methods (Static) function [AlgorithmOptions,optimlist] = getOptimAlgorithms %getOptimAlgorithms list of optimization algorithms optimFuncs = initfrommbc(cgoptimfuncs); optimlist = [makeoptim(optimFuncs) makeoptim(cgoptimfuncs)]; KeepAlg = false(size(optimlist)); for i=1:length(optimlist) opts = getSetup((optimlist{i})); % need to be able to change free variables KeepAlg(i) = ~strcmp(getFreeVariablesMode(opts),'fixed') && numVariables(opts)==1; % don't try and create optimizations with dataset variables required for j=1:getNumOppoints( optimlist{i} ) KeepAlg(i) = KeepAlg(i) && isempty(getOperatingPointSetVarLabels(opts,j)); end end optimlist = optimlist(KeepAlg); AlgorithmOptions = cellfun(@(opt) getName(getSetup(opt)), optimlist,'UniformOutput',false); end end end