11import logging
22import os
3- from typing import Iterator , List , Optional , Tuple
3+ from typing import Optional
44
55import netCDF4
66import numpy as np
77
88from imas .backends .netcdf import ids2nc
99from imas .backends .netcdf .nc_metadata import NCMetadata
10+ from imas .backends .netcdf .iterators import indexed_tree_iter
1011from imas .exception import InvalidNetCDFEntry
11- from imas .ids_base import IDSBase
1212from imas .ids_convert import NBCPathMap
1313from imas .ids_data_type import IDSDataType
1414from imas .ids_defs import IDS_TIME_MODE_HOMOGENEOUS
1515from imas .ids_metadata import IDSMetadata
16- from imas .ids_structure import IDSStructure
1716from imas .ids_toplevel import IDSToplevel
1817
1918logger = logging .getLogger (__name__ )
@@ -26,49 +25,6 @@ def variable_error(var, issue, value, expected=None) -> InvalidNetCDFEntry:
2625 )
2726
2827
29- def split_on_aos (metadata : IDSMetadata ):
30- paths = []
31- curpath = metadata .name
32-
33- item = metadata
34- while item ._parent .data_type is not None :
35- item = item ._parent
36- if item .data_type is IDSDataType .STRUCT_ARRAY :
37- paths .append (curpath )
38- curpath = item .name
39- else :
40- curpath = f"{ item .name } /{ curpath } "
41- paths .append (curpath )
42- return paths [::- 1 ]
43-
44-
45- IndexedNode = Tuple [Tuple [int , ...], IDSBase ]
46-
47-
48- def tree_iter (structure : IDSStructure , metadata : IDSMetadata ) -> Iterator [IndexedNode ]:
49- paths = split_on_aos (metadata )
50- if len (paths ) == 1 :
51- yield (), structure [paths [0 ]]
52- else :
53- yield from _tree_iter (structure , paths , ())
54-
55-
56- def _tree_iter (
57- structure : IDSStructure , paths : List [str ], curindex : Tuple [int , ...]
58- ) -> Iterator [IndexedNode ]:
59- aos_path , * paths = paths
60- aos = structure [aos_path ]
61-
62- if len (paths ) == 1 :
63- path = paths [0 ]
64- for i , node in enumerate (aos ):
65- yield curindex + (i ,), node [path ]
66-
67- else :
68- for i , node in enumerate (aos ):
69- yield from _tree_iter (node , paths , curindex + (i ,))
70-
71-
7228class NC2IDS :
7329 """Class responsible for reading an IDS from a NetCDF group."""
7430
@@ -169,7 +125,7 @@ def run(self, lazy: bool) -> None:
169125 if metadata .data_type is IDSDataType .STRUCT_ARRAY :
170126 if "sparse" in var .ncattrs ():
171127 shapes = self .group [var_name + ":shape" ][()]
172- for index , node in tree_iter (self .ids , target_metadata ):
128+ for index , node in indexed_tree_iter (self .ids , target_metadata ):
173129 node .resize (shapes [index ][0 ])
174130
175131 else :
@@ -178,7 +134,7 @@ def run(self, lazy: bool) -> None:
178134 metadata .path_string , self .homogeneous_time
179135 )[- 1 ]
180136 size = self .group .dimensions [dim ].size
181- for _ , node in tree_iter (self .ids , target_metadata ):
137+ for _ , node in indexed_tree_iter (self .ids , target_metadata ):
182138 node .resize (size )
183139
184140 continue
@@ -190,15 +146,15 @@ def run(self, lazy: bool) -> None:
190146 if "sparse" in var .ncattrs ():
191147 if metadata .ndim :
192148 shapes = self .group [var_name + ":shape" ][()]
193- for index , node in tree_iter (self .ids , target_metadata ):
149+ for index , node in indexed_tree_iter (self .ids , target_metadata ):
194150 shape = shapes [index ]
195151 if shape .all ():
196152 # NOTE: bypassing IDSPrimitive.value.setter logic
197153 node ._IDSPrimitive__value = data [
198154 index + tuple (map (slice , shape ))
199155 ]
200156 else :
201- for index , node in tree_iter (self .ids , target_metadata ):
157+ for index , node in indexed_tree_iter (self .ids , target_metadata ):
202158 value = data [index ]
203159 if value != getattr (var , "_FillValue" , None ):
204160 # NOTE: bypassing IDSPrimitive.value.setter logic
@@ -211,7 +167,7 @@ def run(self, lazy: bool) -> None:
211167 self .ids [target_metadata .path ].value = data
212168
213169 else :
214- for index , node in tree_iter (self .ids , target_metadata ):
170+ for index , node in indexed_tree_iter (self .ids , target_metadata ):
215171 # NOTE: bypassing IDSPrimitive.value.setter logic
216172 node ._IDSPrimitive__value = data [index ]
217173
0 commit comments