Skip to content
Snippets Groups Projects
Commit 756f17e4 authored by Cristian Galperti's avatar Cristian Galperti Committed by Federico Felici
Browse files

addtunparamstruct method with permissivity switch

parent f9931473
No related branches found
No related tags found
No related merge requests found
......@@ -10,7 +10,7 @@ obj=obj.settiming(-1,1e-3,1.0);
obj=obj.addfpinitfcn('algo_template_loadfp','algo_template_fp');
%% Tunable parameters structure name
obj=obj.addtunparamstruct('algo_template_tp', @()algo_template_loadtp());
obj=obj.addtunparamstruct('algo_template_tp', @()algo_template_loadtp(), false);
%% Tunable parameters
obj=obj.addparameter(SCDclass_mdsparnumeric('ks1','gain' ,'srcsrv','spcpc171.epfl.ch','srctree','martetest'));
......
......@@ -21,7 +21,9 @@ classdef SCDclass_algo
fpinits % inits scripts for fixed parameters
timing % Timing info structure
exportedtpsdefaults % default tunable parameters defining functions
exportedtpspermiss % tunable parameters loading error permissivity rule
buslist % list of buses and their sources
defaulttunparampermissivity % default tunparams loading permissivity
end
properties
......@@ -42,6 +44,7 @@ classdef SCDclass_algo
obj.taskcontainer = SCDclass_taskcontainer;
obj.exportedtps = {};
obj.exportedtpsdefaults = {};
obj.exportedtpspermiss = {};
obj.stdinits = {};
obj.fpinits = {};
obj.datadictionary = '';
......@@ -50,6 +53,7 @@ classdef SCDclass_algo
obj.timing.t_stop = 1 ;
obj.timing.dt = 1e-3;
obj.buslist = [];
obj.defaulttunparampermissivity = true;
% Buses
obj.modelslx = [obj.modelname,'.slx'];
......@@ -366,29 +370,39 @@ classdef SCDclass_algo
out = obj.exportedtps;
end
function obj = addtunparamstruct(obj, structname, default_function)
function obj = addtunparamstruct(obj, structname, default_function, load_permissive)
% obj = addtunparamstruct(structname, varargin)
%
% adds a tunable parameter to the algo object
% inputs:
% structname: name of the tunable param (string)
% varargin{1}: a function handle to get
% default_function: a function handle to get
% its default value, this function takes no arguments
% and must return either a struct or a Simulink.Parameter
%
% load_permissive: a boolean value, if true any failing
% loading attemp to this structure (via a loading function)
% will return a warning, otherwise an error. Default: true.
%
% example: obj=obj.addtunparamstruct('SCDalgo_doublet_tp',
% @()SCDalgo_doublet_loadtp());
%
if(~ismember(structname, obj.exportedtps))
obj.exportedtps{end+1}=structname;
else
error('SCDclass_algo:addtunparamsstruct','Tunable parameter struct already present, cannot add!');
end
if nargin==3
if nargin>=3
assert(isa(default_function, 'function_handle'),'SCDclass_algo:addtunparamstruct', 'third argument, if present, must be a function handle');
obj.exportedtpsdefaults{end+1} = default_function; % add defaults to list
else
obj.exportedtpsdefaults{end+1} = []; % empty, no default assigned for this tp
end
if nargin==4
assert(isa(load_permissive,'logical'),'SCDclass_algo:addtunparamstruct','fourth argument, if present, must be boolean');
obj.exportedtpspermiss{end+1} = load_permissive;
else
obj.exportedtpspermiss{end+1} = true;
end
end
function obj = updatetemplatetp(obj)
......@@ -505,13 +519,38 @@ classdef SCDclass_algo
%% MDS container methods forwarders
function obj = addparameter(obj, params)
% assume this parameter is bound to last exported tp on the list
% obj = addparameter(obj, params)
%
% this method offers the way to add tunable
% parameters description to the object.
% params must resolve to a SCDDS loader class
% object
%
% assume this parameter is bound to last exported tp on the
%
% example:
%
% obj=obj.addtunparamstruct('algo_template_tp', @()algo_template_loadtp());
% obj=obj.addparameter(SCDclass_mdsparnumeric('ks1','gain' );
%
% the couples of lines before first add a tunable parameter
% structure and the a numeric type loader class.
% The final result is that this logical link between
% the source param and dest Simulink.Parameter object
% will be put in place:
%
% algo_template_tp.gain <-> ks1
if ~isempty(obj.exportedtps), tpname = obj.exportedtps{end};
else, tpname = '';
end
if ~isempty(obj.exportedtpspermiss), permiss = obj.exportedtpspermiss{end};
else, permiss = obj.defaulttunparampermissivity;
end
% bind parameter(s) to algoobj's name, dictionary and exportedtp
params = params.bind(obj.modelname, obj.datadictionary, tpname);
params = params.bind(obj.modelname, obj.datadictionary, tpname, permiss);
% add params to mdscontainer
obj.mdscontainer=obj.mdscontainer.addparameter(params);
......
......@@ -40,6 +40,8 @@ classdef SCDclass_mdspar < matlab.mixin.Heterogeneous
mdshelpstr % MDS help string used in tree autopopulation
mdsvalidationstr % MDS validation string used in autopopulation
loadpermissivity % true if load error shoudn't cause an error (warning only)
end
properties
......@@ -254,6 +256,11 @@ classdef SCDclass_mdspar < matlab.mixin.Heterogeneous
assert(nargout==1,'must set out argument for set method')
obj.datadictionary = ddname;
end
function obj = setloadpermissivity(obj, permissivity)
assert(nargout==1,'must set out argument for set method')
obj.loadpermissivity = permissivity;
end
end
methods(Sealed) % works for heterogeneous class arrays
......@@ -270,11 +277,12 @@ classdef SCDclass_mdspar < matlab.mixin.Heterogeneous
out = strrep(obj.modelparam, obj.matlabseparator, obj.marteseparator);
end
function obj = bind(obj,modelname,datadictionary,exportedtp)
function obj = bind(obj,modelname,datadictionary,exportedtp,load_permissivity)
for ii=1:numel(obj)
obj(ii) = obj(ii).setmodelname(modelname);
obj(ii) = obj(ii).setdatadictionary(datadictionary);
obj(ii) = obj(ii).setparamstructure(exportedtp);
obj(ii) = obj(ii).setloadpermissivity(load_permissivity);
end
end
end
......
......@@ -18,7 +18,14 @@ classdef SCDclass_mdsparnumeric < SCDclass_mdspar
function actualizedata(obj, shot)
obj=obj.preactualize(shot);
if ~obj.actualizable, return; end
if ~obj.actualizable
if obj.loadpermissivity
warning('SCDDScore:mdsparnumeric','%s: parameters not actualizable (preactualize fails), actualization skipped!',obj.modelparam);
else
error('SCDDScore:mdsparnumeric','%s: parameters not actualizable (preactualize fails), actualization skipped!',obj.modelparam);
end
return;
end
%%% Actualization checks %%%
% dimensions
......@@ -27,7 +34,11 @@ classdef SCDclass_mdsparnumeric < SCDclass_mdspar
actchk=true;
if numel(sourcedim)~=numel(targetdim)
warning('SCDDScore:mdsparnumeric','%s: number of dimensions not matching, actualization skipped!',obj.modelparam);
if obj.loadpermissivity
warning('SCDDScore:mdsparnumeric','%s: number of dimensions not matching, actualization skipped!',obj.modelparam);
else
error('SCDDScore:mdsparnumeric','%s: number of dimensions not matching, actualization skipped!',obj.modelparam);
end
sourcedim
targetdim
actchk=false;
......@@ -44,7 +55,11 @@ classdef SCDclass_mdsparnumeric < SCDclass_mdspar
end
end
if actchk && ~any(sourcedim == targetdim)
warning('SCDDScore:mdsparnumeric','%s: dimensions not matching, actualization skipped!',obj.modelparam);
if obj.loadpermissivity
warning('SCDDScore:mdsparnumeric','%s: dimensions not matching, actualization skipped!',obj.modelparam);
else
error('SCDDScore:mdsparnumeric','%s: dimensions not matching, actualization skipped!',obj.modelparam);
end
sourcedim
targetdim
actchk=false;
......@@ -54,7 +69,11 @@ classdef SCDclass_mdsparnumeric < SCDclass_mdspar
sourceclass=class(obj.value);
targetclass=Simulink.data.evalinGlobal(obj.modelname,sprintf('class(%s)',obj.assignvar));
if actchk && ~strcmp(sourceclass,targetclass)
warning('SCDDScore:mdsparnumeric','%s: Data types not matching, actualization skipped!',obj.modelparam);
if obj.loadpermissivity
warning('SCDDScore:mdsparnumeric','%s: Data types not matching, actualization skipped!',obj.modelparam);
else
error('SCDDScore:mdsparnumeric','%s: Data types not matching, actualization skipped!',obj.modelparam);
end
sourceclass
targetclass
actchk=false;
......
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