@@ -117,27 +117,71 @@ def maybe_set_random_value(
117117 primitive .value = random_data (primitive .metadata .data_type , ndim )
118118 return
119119
120+ for dim , same_as in enumerate (primitive .metadata .coordinates_same_as ):
121+ if same_as .references :
122+ try :
123+ ref_elem = same_as .references [0 ].goto (primitive )
124+ if len (ref_elem .shape ) <= dim or ref_elem .shape [dim ] == 0 :
125+ return
126+ except (ValueError , AttributeError , IndexError , RuntimeError ):
127+ return
128+
129+ if primitive .metadata .name .endswith ("_error_upper" ):
130+ name = primitive .metadata .name [: - len ("_error_upper" )]
131+ try :
132+ data = primitive ._parent [name ]
133+ except (KeyError , AttributeError ):
134+ return
135+ if (
136+ not data .has_value
137+ or len (data .shape ) == 0
138+ or any (s == 0 for s in data .shape )
139+ ):
140+ return
141+ if any (
142+ same_as .references for same_as in primitive .metadata .coordinates_same_as
143+ ):
144+ return
145+ elif primitive .metadata .name .endswith ("_error_lower" ):
146+ name = primitive .metadata .name [: - len ("_error_lower" )] + "_error_upper"
147+ try :
148+ data = primitive ._parent [name ]
149+ except (KeyError , AttributeError ):
150+ return
151+ if (
152+ not data .has_value
153+ or len (data .shape ) == 0
154+ or any (s == 0 for s in data .shape )
155+ ):
156+ return
157+ if any (
158+ same_as .references for same_as in primitive .metadata .coordinates_same_as
159+ ):
160+ return
161+
120162 shape = []
121163 for dim , coordinate in enumerate (primitive .metadata .coordinates ):
122164 same_as = primitive .metadata .coordinates_same_as [dim ]
123- if not coordinate .has_validation and not same_as .has_validation :
124- if primitive .metadata .name .endswith ("_error_upper" ):
125- # <name>_error_upper should only be filled when <name> is
126- name = primitive .metadata .name [: - len ("_error_upper" )]
127- data = primitive ._parent [name ]
128- if not data .has_value :
129- return
130- size = data .shape [dim ]
131- elif primitive .metadata .name .endswith ("_error_lower" ):
132- # <name>_error_lower should only be filled when <name>_error_upper is
133- name = primitive .metadata .name [: - len ("_error_lower" )] + "_error_upper"
134- data = primitive ._parent [name ]
135- if not data .has_value :
136- return
137- size = data .shape [dim ]
138- else :
139- # we can independently choose a size for this dimension:
140- size = random .randint (1 , 6 )
165+
166+ if primitive .metadata .name .endswith ("_error_upper" ):
167+ name = primitive .metadata .name [: - len ("_error_upper" )]
168+ data = primitive ._parent [name ]
169+ if dim >= len (data .shape ):
170+ return
171+ size = data .shape [dim ]
172+ if size == 0 :
173+ return
174+ elif primitive .metadata .name .endswith ("_error_lower" ):
175+ name = primitive .metadata .name [: - len ("_error_lower" )] + "_error_upper"
176+ data = primitive ._parent [name ]
177+ if dim >= len (data .shape ):
178+ return
179+ size = data .shape [dim ]
180+ if size == 0 :
181+ return
182+ elif not coordinate .has_validation and not same_as .has_validation :
183+ # we can independently choose a size for this dimension:
184+ size = random .randint (1 , 6 )
141185 elif coordinate .references or same_as .references :
142186 try :
143187 if coordinate .references :
@@ -147,8 +191,8 @@ def maybe_set_random_value(
147191 coordinate_element = filled_refs [0 ] if filled_refs else refs [0 ]
148192 else :
149193 coordinate_element = same_as .references [0 ].goto (primitive )
150- except (ValueError , AttributeError ):
151- # Ignore invalid coordinate specs
194+ except (ValueError , AttributeError , IndexError ):
195+ # Ignore invalid coordinate specs or empty array references
152196 coordinate_element = np .ones ((1 ,) * 6 )
153197
154198 if len (coordinate_element ) == 0 :
@@ -269,10 +313,43 @@ def fill_consistent(
269313 elif any (len (coordinate .references ) > 1 for coordinate in coordinates ):
270314 exclusive_coordinates .append (child )
271315 else :
272- try :
273- maybe_set_random_value (child , leave_empty , skip_complex )
274- except (RuntimeError , ValueError ):
275- pass
316+ same_as_skip = False
317+ for dim , same_as in enumerate (child .metadata .coordinates_same_as ):
318+ if same_as .references :
319+ try :
320+ ref_elem = same_as .references [0 ].goto (child )
321+ if len (ref_elem .shape ) <= dim or ref_elem .shape [dim ] == 0 :
322+ same_as_skip = True
323+ break
324+ except (ValueError , AttributeError , IndexError , RuntimeError ):
325+ same_as_skip = True
326+ break
327+
328+ error_skip = False
329+ if child .metadata .name .endswith ("_error_upper" ):
330+ name = child .metadata .name [: - len ("_error_upper" )]
331+ data = child ._parent [name ]
332+ if (
333+ not data .has_value
334+ or len (data .shape ) == 0
335+ or any (s == 0 for s in data .shape )
336+ ):
337+ error_skip = True
338+ elif child .metadata .name .endswith ("_error_lower" ):
339+ name = child .metadata .name [: - len ("_error_lower" )] + "_error_upper"
340+ data = child ._parent [name ]
341+ if (
342+ not data .has_value
343+ or len (data .shape ) == 0
344+ or any (s == 0 for s in data .shape )
345+ ):
346+ error_skip = True
347+
348+ if not same_as_skip and not error_skip :
349+ try :
350+ maybe_set_random_value (child , leave_empty , skip_complex )
351+ except (RuntimeError , ValueError ):
352+ pass
276353
277354 if isinstance (structure , IDSToplevel ):
278355 # handle exclusive_coordinates
0 commit comments