diff --git a/dagflow/bundles/load_parameters.py b/dagflow/bundles/load_parameters.py index dda5f272a7d712d0bdac89b996f604dadb601246..f0b496af620c2b73c650b1bca1d25b19f785db3a 100644 --- a/dagflow/bundles/load_parameters.py +++ b/dagflow/bundles/load_parameters.py @@ -64,12 +64,15 @@ def IsFormatOk(format): return f1 in ('value', 'central') IsFormat = Schema(IsFormatOk, error='Invalid parameter format "{}".') +IsStrSeq = (str,) +IsStrSeqOrStr = Or(IsStrSeq, And(str, Use(lambda s: (s,)))) IsParsCfgDict = Schema({ 'parameters': IsValuesDict, 'labels': IsLabelsDict, 'format': IsFormat, 'state': Or('fixed', 'variable', error='Invalid parameters state: {}'), - Optional('path', default=''): str + Optional('path', default=''): str, + Optional('replicate', default=((),)): (IsStrSeqOrStr,), }, # error = 'Invalid parameters configuration: {}' ) @@ -197,22 +200,26 @@ def load_parameters(acfg): sep='.' ) + subkeys = cfg['replicate'] + normpars = [] - for key, varcfg in iterate_varcfgs(cfg): - skey = '.'.join(key) - label = varcfg['label'] - label['key'] = skey - label.setdefault('text', skey) - - varcfg.setdefault(state, True) - - par = Parameters.from_numbers(**varcfg) - if par.is_constrained: - target = ('constrained', path) - elif par.is_fixed: - target = ('constant', path) - else: - target = ('free', path) + for key_general, varcfg in iterate_varcfgs(cfg): + for subkey in subkeys: + key = key_general + subkey + key_str = '.'.join(key) + label = varcfg['label'] + label['key'] = key_str + label.setdefault('text', key_str) + + varcfg.setdefault(state, True) + + par = Parameters.from_numbers(**varcfg) + if par.is_constrained: + target = ('constrained', path) + elif par.is_fixed: + target = ('constant', path) + else: + target = ('free', path) ret[('parameter_node',)+target+key] = par diff --git a/subtrees/gindex/gindex/gnindex.py b/subtrees/gindex/gindex/gnindex.py index 3a4e95586b5ea7a8b4ccf3284d0e38b342fa87db..adf7e6689946e56f279ca97ae6badad542a09917 100644 --- a/subtrees/gindex/gindex/gnindex.py +++ b/subtrees/gindex/gindex/gnindex.py @@ -503,6 +503,10 @@ class GNIndex: """Returns the dimension of the index (size of the indices list)""" return len(self._indices) + @property + def values(self) -> Tuple[Tuple[str]]: + return tuple(n.values for n in self) + def instances(self) -> Tuple[Tuple[GNIndexInstance, ...], ...]: """Returns a tuple of the indices instances tuples (2D version)""" return tuple(ind.instances() for ind in self._indices)