@@ -22,9 +22,9 @@ def as_status_string(self) -> str:
2222 return f'{ self .count_free_parameters () + self .count_fixed_parameters ()} ({ self .count_free_parameters ()} free, { self .count_fixed_parameters ()} fixed)' # noqa: E501
2323
2424 @property
25- def parameters (self ) -> List [ str ]:
25+ def parameters (self ) -> list [ dict [ str , Any ] ]:
2626 return _from_parameters_to_list_of_dicts (
27- self ._project_lib .parameters , self ._project_lib ._models [ self . _project_lib . current_model_index ]. unique_name
27+ self ._project_lib .parameters , self ._project_lib ._models
2828 )
2929
3030 def constraint_context (self ) -> list [dict [str , Any ]]:
@@ -160,10 +160,18 @@ def add_constraint(
160160
161161 print (f'{ dependent_idx } , { relational_operator } , { value } , { arithmetic_operator } , { independent_idx } ' )
162162
163- def _from_parameters_to_list_of_dicts (parameters : List [Parameter ], model_unique_name : str ) -> list [dict [str , Any ]]:
164- """Convert parameters to list of dictionaries with simplified logic."""
163+ def _from_parameters_to_list_of_dicts (parameters : List [Parameter ], models ) -> list [dict [str , Any ]]:
164+ """Convert parameters to list of dictionaries with simplified logic.
165+
166+ Layer parameters (thickness, roughness) are prefixed with model identifier (e.g., M1, M2).
167+ Material parameters and model parameters (scale, background) are not prefixed to avoid duplication.
168+ """
165169
166170 alias_registry : set [str ] = set ()
171+ processed_unique_names : set [str ] = set () # Track processed parameters to avoid duplicates
172+
173+ # Layer parameter names that need model prefix
174+ LAYER_PARAMS = {'thickness' , 'roughness' }
167175
168176 def _make_alias (name : str ) -> str :
169177 base = re .sub (r'[^0-9A-Za-z]+' , '_' , name ).strip ('_' ).lower ()
@@ -179,7 +187,7 @@ def _make_alias(name: str) -> str:
179187 alias_registry .add (alias )
180188 return alias
181189
182- def _get_parameter_display_data (param : Parameter ) -> Tuple [str , str ]:
190+ def _get_parameter_display_data (param : Parameter , model_unique_name : str ) -> Tuple [str , str ]:
183191 """Extract display name and group from parameter path."""
184192 path = global_object .map .find_path (model_unique_name , param .unique_name )
185193 if len (path ) >= 2 :
@@ -188,7 +196,7 @@ def _get_parameter_display_data(param: Parameter) -> Tuple[str, str]:
188196 return f'{ parent_name } { param_name } ' , parent_name
189197 return param .name , '' # Fallback to parameter name without group
190198
191- def _get_dependency_expression (param : Parameter ) -> str :
199+ def _get_dependency_expression (param : Parameter , model_unique_name : str ) -> str :
192200 """Get simplified dependency expression."""
193201 if param .independent :
194202 return ''
@@ -197,38 +205,62 @@ def _get_dependency_expression(param: Parameter) -> str:
197205 if hasattr (param , 'dependency_map' ) and 'a' in param .dependency_map :
198206 dependent_param = param .dependency_map ['a' ]
199207 if isinstance (dependent_param , Parameter ):
200- dep_name , _ = _get_parameter_display_data (dependent_param )
208+ dep_name , _ = _get_parameter_display_data (dependent_param , model_unique_name )
201209 else :
202210 dep_name = str (dependent_param )
203211 return param .dependency_expression .replace ('a' , dep_name )
204212
205213 # Simple numerical dependency
206214 return f'= { param .value } '
207215
216+ def _is_layer_parameter (param : Parameter ) -> bool :
217+ """Check if parameter is a layer parameter (thickness or roughness)."""
218+ return param .name .lower () in LAYER_PARAMS
219+
208220 parameter_list = []
209- for parameter in parameters :
210- # Skip parameters not in the current model path
211- if not global_object .map .find_path (model_unique_name , parameter .unique_name ):
212- continue
213-
214- display_name , group_name = _get_parameter_display_data (parameter )
215- alias = _make_alias (display_name or parameter .name )
216- parameter_list .append ({
217- 'name' : display_name ,
218- 'display_name' : display_name ,
219- 'group' : group_name ,
220- 'alias' : alias ,
221- 'unique_name' : parameter .unique_name ,
222- 'value' : float (parameter .value ),
223- 'error' : float (parameter .variance ),
224- 'max' : float (parameter .max ),
225- 'min' : float (parameter .min ),
226- 'units' : parameter .unit ,
227- 'fit' : parameter .free ,
228- 'independent' : parameter .independent ,
229- 'dependency' : _get_dependency_expression (parameter ),
230- 'enabled' : parameter .enabled if hasattr (parameter , 'enabled' ) else True ,
231- 'object' : parameter , # Direct reference to the Parameter object
232- })
221+
222+ # Process parameters for each model
223+ for model_idx , model in enumerate (models ):
224+ model_unique_name = model .unique_name
225+ model_prefix = f'M{ model_idx + 1 } '
226+
227+ for parameter in parameters :
228+ # Skip parameters not in this model's path
229+ if not global_object .map .find_path (model_unique_name , parameter .unique_name ):
230+ continue
231+
232+ # For non-layer parameters, skip if already processed (they're shared across models)
233+ is_layer_param = _is_layer_parameter (parameter )
234+ if not is_layer_param :
235+ if parameter .unique_name in processed_unique_names :
236+ continue
237+ processed_unique_names .add (parameter .unique_name )
238+
239+ display_name , group_name = _get_parameter_display_data (parameter , model_unique_name )
240+
241+ # Add model prefix only to layer parameters (thickness, roughness)
242+ if is_layer_param :
243+ prefixed_display_name = f'{ model_prefix } { display_name } '
244+ else :
245+ prefixed_display_name = display_name
246+
247+ alias = _make_alias (prefixed_display_name or parameter .name )
248+ parameter_list .append ({
249+ 'name' : prefixed_display_name ,
250+ 'display_name' : prefixed_display_name ,
251+ 'group' : group_name ,
252+ 'alias' : alias ,
253+ 'unique_name' : parameter .unique_name ,
254+ 'value' : float (parameter .value ),
255+ 'error' : float (parameter .variance ),
256+ 'max' : float (parameter .max ),
257+ 'min' : float (parameter .min ),
258+ 'units' : parameter .unit ,
259+ 'fit' : parameter .free ,
260+ 'independent' : parameter .independent ,
261+ 'dependency' : _get_dependency_expression (parameter , model_unique_name ),
262+ 'enabled' : parameter .enabled if hasattr (parameter , 'enabled' ) else True ,
263+ 'object' : parameter , # Direct reference to the Parameter object
264+ })
233265
234266 return parameter_list
0 commit comments