Skip to content

Commit 1e268c0

Browse files
prasad-sawantdesaiolivhoenen
authored andcommitted
fix issues in coordinate validation
1 parent d15fe1a commit 1e268c0

File tree

1 file changed

+101
-24
lines changed

1 file changed

+101
-24
lines changed

imas/test/test_helpers.py

Lines changed: 101 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)