diff --git a/code/classes/SCDclass_algo.m b/code/classes/SCDclass_algo.m index 87a80f63398c0b8650abd05aca37d735b6263eb7..8494c359fa919ffcb4dc9d081d2427c48841a5bc 100644 --- a/code/classes/SCDclass_algo.m +++ b/code/classes/SCDclass_algo.m @@ -11,6 +11,7 @@ classdef SCDclass_algo exportedtps % List of tunable parameters variable to be exported datadictionary % Name of the used data dictionary refdatadictionaries % Cell array of referenced data dictionaries + refddparentalgo % Parent algorithm of referenced data dictionaries stdinits % General initialization scripts fpinits % inits scripts for fixed parameters timing % Timing info structure @@ -18,7 +19,6 @@ classdef SCDclass_algo buslist % list of buses and their sources modelslx % slx model file name folder % folder containing algorithm - parentalgos % algorithms on which this algo depends end methods @@ -191,12 +191,6 @@ classdef SCDclass_algo fprintf('\n'); end - %% Parent algo getter and setter - function obj = addparentalgo(obj,parentalgo) - assert(isa(parentalgo,'SCDclass_algo'),'parent algorithm must be SCDclass_algo object') - obj.parentalgos{end+1} = parentalgo; - end - %% Data dictionary setter and getter function obj = setdatadictionary(obj, datadict) obj.datadictionary=datadict; @@ -206,10 +200,15 @@ classdef SCDclass_algo out = obj.datadictionary; end - function obj = setreferenceddatadictionaries(obj,refdd) - if ischar(refdd) && ~iscell(refdd); refdd={refdd}; end % to cell - assert(iscell(refdd) && isrow(refdd),'refdd must be a row cell array of data dictionary names') - obj.refdatadictionaries = refdd; + function obj = addrefdd(obj,refdd,parentalgo) + % refdd: name of referenced data dictionary + % parentalgo: (optional), SCDclass_algo object of algorithm + % generating this data dicationary. + if nargin<3, parentalgo=''; end + + assert(isequal(refdd(end-4:end),'.sldd'),'refdd must end in .sldd') + obj.refddparentalgo{end+1} = parentalgo; + obj.refdatadictionaries{end+1} = refdd; end function createdatadictionary(obj,varargin) @@ -238,7 +237,6 @@ classdef SCDclass_algo dictionaryObj = Simulink.data.dictionary.open(obj.getdatadictionary); designDataObj = getSection(dictionaryObj, 'Design Data'); - busList = obj.getbuslist; for ii=1:numel(busList) mybusSource = busList(ii).source; @@ -273,23 +271,43 @@ classdef SCDclass_algo if dictionaryObj.HasUnsavedChanges, dictionaryObj.saveChanges; end % Save if necessary end - - - function addrefdd(obj) + function addrefddtodd(obj) % add configurations.sldd as referenced data dictionary, plus % other optional data dictionaries (e.g. used by lower-level components of an algorithm) - for refdd = ['configurations.sldd',obj.refdatadictionaries] - dictionaryObj = Simulink.data.dictionary.open(obj.getdatadictionary); - if ~ismember(refdd{:},dictionaryObj.DataSources) - fprintf('adding referenced data dictionary %s to %s \n',refdd{:},obj.getdatadictionary) - refddpath = which(refdd{:}); - assert(~isempty(refddpath),'could not find %s',refdd{:}); - dictionaryObj.addDataSource(refdd{:}); + % specified in refdatadictionaries + + dictionaryObj = Simulink.data.dictionary.open(obj.getdatadictionary); + refddlist = [obj.refdatadictionaries,'configurations.sldd']; % list of referenced dds + + for ii=1:numel(refddlist) + refdd = refddlist{ii}; + + if ~ismember(refdd,dictionaryObj.DataSources) % does not exist, try to add + fprintf('adding referenced data dictionary %s to %s \n',refdd,obj.getdatadictionary) + refddpath = which(refdd); + if isempty(refddpath) % data dictionary to link does not exist, try to generate it + parentalgo = obj.refddparentalgo{ii}; + if isempty(parentalgo) + error('Data dictionary %s was not found but no parent algorithm is specified',refdd{ii}) + else + fprintf('Data dictionary %s was not found, running init of parent algorithm %s to create it\n',parentalgo.getname) + % run parent algo init + parentalgo.init; + % check expected dd now exists + refddpath = which(refdd); + assert(~isempty(refddpath),... + 'Data dictionary still not found despite running %s init, aborting',parentalgo.getname) + end + end + fprintf('Adding referenced data dictionary %s to %s\n',refdd,obj.getdatadictionary) + dictionaryObj.addDataSource(refdd); + else % already exists + fprintf('Data dictionary %s is already referenced in algo data dictionary, not adding',refdd); end end if dictionaryObj.HasUnsavedChanges, dictionaryObj.saveChanges; end end - + function replaceorcreateddentry(obj,designDataObj,entry,value) if designDataObj.exist(entry) oldEntry = designDataObj.getEntry(entry); @@ -512,25 +530,12 @@ classdef SCDclass_algo % populate with template tunable parameters obj.updatetemplatetp; + + % add referenced data dictionaries to obj data dictionary + obj.addrefddtodd % add buses obj.addbusestodd; - - % add referenced data dictionaries - obj.addrefdd - end - - function callparentinits(obj) - for ii=1:numel(obj.parentalgos) - parentalgo = obj.parentalgos{ii}; -% if ~isempty(which(parentalgo.getdatadictionary)) -% fprintf('%s is present, not rerunning %s init\n',... -% parentalgo.getdatadictionary,parentalgo.getname) -% else -% fprintf('running inits for parent algorithm %s\n',parentalgo.getname); - parentalgo.init; -% end - end end function callinits(obj) @@ -598,7 +603,6 @@ classdef SCDclass_algo %% generic operation methods function init(obj) SCDconf_setConf('SIM'); - obj.callparentinits; obj.callinits; % call generic algorithm init functions obj.initdd; % setup data dictionary end