From 66ccf4d05046c14a39650a76bc347200a14195f2 Mon Sep 17 00:00:00 2001
From: Federico Felici <federico.felici@epfl.ch>
Date: Wed, 24 Nov 2021 13:24:12 +0100
Subject: [PATCH] Also vectorize wavegen addition and improve binding

---
 code/classes/SCDclass_algo.m            | 18 +++++++++---------
 code/classes/SCDclass_expcode.m         |  2 +-
 code/classes/SCDclass_mdsobjcontainer.m |  8 --------
 code/classes/SCDclass_mdspar.m          | 14 ++++++++------
 code/classes/SCDclass_mdswg.m           | 13 ++++++++++++-
 5 files changed, 30 insertions(+), 25 deletions(-)

diff --git a/code/classes/SCDclass_algo.m b/code/classes/SCDclass_algo.m
index 8a72158..7e24487 100644
--- a/code/classes/SCDclass_algo.m
+++ b/code/classes/SCDclass_algo.m
@@ -474,19 +474,17 @@ classdef SCDclass_algo
         
         %% MDS container methods forwarders
         
-        function obj = addparameter(obj, param)
-          % bind parameter(s) to algoobj's name, dictionary and last
-          % exported tp
-          
+        function obj = addparameter(obj, params)
           % assume this parameter is bound to last exported tp on the list
           if ~isempty(obj.exportedtps), tpname = obj.exportedtps{end};
           else, tpname = '';
           end
           
-          for ii=1:numel(param)
-            param(ii) = param(ii).bind(obj.modelname, obj.datadictionary, tpname);
-          end
-          obj.mdscontainer=obj.mdscontainer.addparameter(param);
+          % bind parameter(s) to algoobj's name, dictionary and exportedtp
+          params = params.bind(obj.modelname, obj.datadictionary, tpname);
+          
+          % add params to mdscontainer
+          obj.mdscontainer=obj.mdscontainer.addparameter(params);
         end
         
         function obj = printparameters(obj)
@@ -498,8 +496,10 @@ classdef SCDclass_algo
         end
         
         function obj = addwavegen(obj, wavegen)
+            for ii=1:numel(wavegen)
+              wavegen(ii) = wavegen(ii).bind(obj.modelname,obj.datadictionary,obj.timing);
+            end
             obj.mdscontainer=obj.mdscontainer.addwavegen(wavegen);
-            obj.mdscontainer=obj.mdscontainer.bindlastwavegen(obj.modelname, obj.datadictionary, obj.timing);
         end
         
         function obj = printwavegens(obj)
diff --git a/code/classes/SCDclass_expcode.m b/code/classes/SCDclass_expcode.m
index 55baaa0..4a371a3 100644
--- a/code/classes/SCDclass_expcode.m
+++ b/code/classes/SCDclass_expcode.m
@@ -379,7 +379,7 @@ classdef SCDclass_expcode
             for ii=1:numel(obj.exportedtps), fprintf('  ''%s''\n', char(obj.exportedtps{ii})); end
           end
           fprintf('* Configured MDS tunparams objects: %d (use printparameters method for details)\n', obj.mdscontainer.getnumparams);
-          fprintf('* Configured MDS wavegens objects: %d (use printwavegens method for details)\n', obj.mdscontainer.numwavegens);
+          fprintf('* Configured MDS wavegens objects: %d (use printwavegens method for details)\n', obj.mdscontainer.getnumwavegens);
           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.algoobjlist));
         end
diff --git a/code/classes/SCDclass_mdsobjcontainer.m b/code/classes/SCDclass_mdsobjcontainer.m
index 9198a32..904efe4 100644
--- a/code/classes/SCDclass_mdsobjcontainer.m
+++ b/code/classes/SCDclass_mdsobjcontainer.m
@@ -59,14 +59,6 @@ classdef SCDclass_mdsobjcontainer
             obj.mdswavegens=[obj.mdswavegens; wavegen];
         end
         
-        function obj = bindlastwavegen(obj, modelname, datadictionary, timingsrc)
-            if obj.getnumwavegens>0
-                obj.mdswavegens(end)=obj.mdswavegens(end).setmodelname(modelname);
-                obj.mdswavegens(end)=obj.mdswavegens(end).setdatadictionary(datadictionary);
-                obj.mdswavegens(end)=obj.mdswavegens(end).settiminginfo(timingsrc);                
-            end    
-        end
-        
         function obj = setwavegenbasestruct(obj, basestruct)
             if obj.getnumwavegens>0
                 for ii=1:obj.getnumwavegens
diff --git a/code/classes/SCDclass_mdspar.m b/code/classes/SCDclass_mdspar.m
index 9797b84..484bc29 100644
--- a/code/classes/SCDclass_mdspar.m
+++ b/code/classes/SCDclass_mdspar.m
@@ -226,12 +226,6 @@ classdef SCDclass_mdspar < matlab.mixin.Heterogeneous
             
         end
         
-        function obj = bind(obj,modelname,datadictionary,exportedtp)
-          obj = obj.setmodelname(modelname);
-          obj = obj.setdatadictionary(datadictionary);
-          obj = obj.setparamstructure(exportedtp);
-        end
-        
         function [mdsserver] = getMDSserver(obj)
           mdsserver = obj.mdsserver;
         end
@@ -278,6 +272,14 @@ classdef SCDclass_mdspar < matlab.mixin.Heterogeneous
             out = {obj.modelparammarte}';
           end
         end
+             
+        function obj = bind(obj,modelname,datadictionary,exportedtp)
+          for ii=1:numel(obj)
+            obj(ii) = obj.setmodelname(modelname);
+            obj(ii) = obj.setdatadictionary(datadictionary);
+            obj(ii) = obj.setparamstructure(exportedtp);
+          end
+        end
     end
     
     methods 
diff --git a/code/classes/SCDclass_mdswg.m b/code/classes/SCDclass_mdswg.m
index 8ed0d10..6fd2072 100644
--- a/code/classes/SCDclass_mdswg.m
+++ b/code/classes/SCDclass_mdswg.m
@@ -62,6 +62,17 @@ classdef SCDclass_mdswg < matlab.mixin.Heterogeneous
         
     end
     
+    % Sealed methods for heterogeneous arrays
+    methods(Sealed)
+      function obj = bind(obj,modelname,datadictionary,timingsrc)
+        for ii=1:numel(obj)
+          obj(ii) = obj(ii).setmodelname(modelname);
+          obj(ii) = obj(ii).setdatadictionary(datadictionary);
+          obj(ii) = obj(ii).settiminginfo(timingsrc);
+        end
+      end
+    end
+    
     % Not abstract methods common to all child classes
     methods
         function mdsconnect(obj, shot)
@@ -77,7 +88,7 @@ classdef SCDclass_mdswg < matlab.mixin.Heterogeneous
             fprintf('  MDS+ source server: ''%s'', Tree: ''%s''\n', obj.mdsserver, obj.mdstree);
             fprintf('  MDS+ TDI expression: ''%s''\n',obj.tdiexpr);
         end
-        
+               
         function obj = settiminginfo(obj, timeinfo)
             obj.timebasestart=timeinfo.t_start;
             obj.timebasedt=timeinfo.dt;
-- 
GitLab