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