Skip to content
Snippets Groups Projects
Commit 20999856 authored by Federico Felici's avatar Federico Felici
Browse files

Add algorithm topological sorting and change property name

parent 6d731478
No related branches found
No related tags found
No related merge requests found
......@@ -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)
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment