diff --git a/code/classes/SCDclass_expcode.m b/code/classes/SCDclass_expcode.m index ba86b57a3d8f0e40e09ae3e473dbf557b6daac53..98e742d3b4e75484cd105298c6c789c806aaa76e 100644 --- a/code/classes/SCDclass_expcode.m +++ b/code/classes/SCDclass_expcode.m @@ -26,7 +26,7 @@ classdef SCDclass_expcode properties (SetAccess = private) name % Expcode main name - initobjlist % list of loaded algorithm objects with configured inits + algoobjlist % list of loaded algorithm objects with configured inits algonamelist % List of loaded algorithm names algoddlist % list of data dictionaries at algorithm level mdscontainer % container class for MDS+ interface objects @@ -219,17 +219,22 @@ classdef SCDclass_expcode % Set configuration settings sldd SCDconf_setConf('SIM') - % carry out any init tasks of algorithms - if ~isempty(obj.initobjlist) - for ii=1:numel(obj.initobjlist) - obj.initobjlist{ii}.init(); - - opendds = Simulink.data.dictionary.getOpenDictionaryPaths; - % check that tcv.sldd is not opened by some algorithm init - assert(~any(contains(opendds,obj.ddname)),... - 'init for %s leaves %s open - this should be avoided',... - obj.initobjlist{ii}.getname,obj.ddname) - end + if isempty(obj.algoobjlist) + fprintf(' no SCD inits to run, done ***\n'); return; + end + + % sort initobj list to respect dependencies in refdd parents + obj = obj.sortalgoobjlist; + + % Carry out any init tasks of algorithms + for ii=1:numel(obj.algoobjlist) + obj.algoobjlist{ii}.init(); + + opendds = Simulink.data.dictionary.getOpenDictionaryPaths; + % check that tcv.sldd is not opened by some algorithm init + assert(~any(contains(opendds,obj.ddname)),... + 'init for %s leaves %s open - this should be avoided',... + obj.algoobjlist{ii}.getname,obj.ddname) end fprintf('\n** DONE WITH ALL SCDINITS **\n'); end @@ -375,7 +380,7 @@ classdef SCDclass_expcode fprintf('* Configured MDS tunparams objects: %d (use printparameters method for details)\n', obj.mdscontainer.numparams); fprintf('* Configured MDS wavegens objects: %d (use printwavegens method for details)\n', obj.mdscontainer.numwavegens); fprintf('* Configured general purpose tasks: %d (use printtasks method for details)\n', obj.taskcontainer.numtasks); - fprintf('* Configured init scripts: %d (use printinits method for details)\n', numel(obj.initobjlist)); + fprintf('* Configured init scripts: %d (use printinits method for details)\n', numel(obj.algoobjlist)); end function printtasks(obj) @@ -387,9 +392,9 @@ classdef SCDclass_expcode % but only if fpinits will stay ... fprintf('* Configured std init scripts:\n'); - if(~isempty(obj.initobjlist)) - for ii=1:numel(obj.initobjlist) - [stdinitstmp,~]=obj.initobjlist{ii}.getinits; + if(~isempty(obj.algoobjlist)) + for ii=1:numel(obj.algoobjlist) + [stdinitstmp,~]=obj.algoobjlist{ii}.getinits; if ~isempty(stdinitstmp) for jj=1:numel(stdinitstmp) fprintf(' %s\n',char(stdinitstmp{jj})); @@ -520,10 +525,10 @@ classdef SCDclass_expcode % Importing inits [stdinitstmp,fpinitstmp]=algoObj.getinits; - if(numel(fpinitstmp)>0) + if numel(fpinitstmp)>0 toadd = ones(numel(fpinitstmp),1); for ii=1:numel(fpinitstmp) - if(~isempty(obj.fpinits)) + if ~isempty(obj.fpinits) for jj=1:numel(obj.fpinits) for kk=1:numel(obj.fpinits{jj}{2}) if(strcmp(char(obj.fpinits{jj}{2}{kk}),fpinitstmp{ii}{2})) @@ -541,11 +546,35 @@ classdef SCDclass_expcode end end if any(toadd) % if any inits from this algoobj were taken - obj.initobjlist{end+1}=algoObj; %% Add the full algorithm object here, to see if it is fine + obj.algoobjlist{end+1}=algoObj; %% Add the full algorithm object here, to see if it is fine end elseif(numel(stdinitstmp)>0) - obj.initobjlist{end+1}=algoObj; + obj.algoobjlist{end+1}=algoObj; + end + end + + function obj = sortalgoobjlist(obj) + % sort algoobj list such that ones without dependency on others + % (through parents of referenced data dictionaries) come first. + A = zeros(numel(obj.algoobjlist)); % init adiadency matrix + for ii=1:numel(obj.algoobjlist) + myalgoobj = obj.algoobjlist{ii}; + [~,refddparent] = myalgoobj.getrefdd; + if isempty(refddparent) || all(cellfun(@isempty,refddparent)) + A(:,ii) = 0; % no dependency + else + % populate dependencies + % indices of dependent algos + for iref = 1:numel(refddparent) + % index of this referenced parent algo in algoobjlist + jj = contains(obj.algonamelist,refddparent{iref}.getname); + A(jj,ii) = 1; + end + end end + D = digraph(A); % directed graph + isort = toposort(D); % topological sorting + obj.algoobjlist = obj.algoobjlist(isort); % sort the init obj list end function out = getexportedtps(obj)