88from cppmega_mlx .data .parquet_dataset import TokenParquetDataset
99from cppmega_mlx .data .nanochat_pipeline .platform_vocab import MAX_PLATFORM_IDS
1010from cppmega_mlx .data .nanochat_pipeline .tokenized_enriched_schema import (
11+ CHANGED_CHUNK_IDS_COLUMN ,
12+ CHANGED_CHUNK_SPANS_COLUMN ,
1113 PLATFORM_IDS_COLUMN ,
1214 TOKEN_AST_DEPTH_COLUMN ,
1315 TOKEN_CALL_EDGES_COLUMN ,
1820 TOKEN_DEP_LEVELS_COLUMN ,
1921 TOKEN_IDS_COLUMN ,
2022 TOKEN_STRUCTURE_IDS_COLUMN ,
23+ TOKEN_TYPE_EDGES_COLUMN ,
2124)
2225from scripts .nanochat_data .pack_enriched_rows import (
2326 DOC_IDS_COLUMN ,
@@ -50,6 +53,9 @@ def _doc(
5053 token_chunk_kinds : list [int ] | None = None ,
5154 token_chunk_dep_levels : list [int ] | None = None ,
5255 token_call_edges : list [dict [str , int ]] | None = None ,
56+ token_type_edges : list [dict [str , int ]] | None = None ,
57+ changed_chunk_ids : list [int ] | None = None ,
58+ changed_chunk_spans : list [dict [str , int ]] | None = None ,
5359) -> dict [str , object ]:
5460 return {
5561 TOKEN_IDS_COLUMN : list (token_ids ),
@@ -62,6 +68,9 @@ def _doc(
6268 TOKEN_CHUNK_KINDS_COLUMN : list (token_chunk_kinds or []),
6369 TOKEN_CHUNK_DEP_LEVELS_COLUMN : list (token_chunk_dep_levels or []),
6470 TOKEN_CALL_EDGES_COLUMN : list (token_call_edges or []),
71+ TOKEN_TYPE_EDGES_COLUMN : list (token_type_edges or []),
72+ CHANGED_CHUNK_IDS_COLUMN : list (changed_chunk_ids or []),
73+ CHANGED_CHUNK_SPANS_COLUMN : list (changed_chunk_spans or []),
6574 }
6675
6776
@@ -147,6 +156,8 @@ def test_pack_documents_carries_token_and_chunk_metadata_with_offsets() -> None:
147156 token_chunk_ends = [2 ],
148157 token_chunk_kinds = [4 ],
149158 token_chunk_dep_levels = [1 ],
159+ changed_chunk_ids = [0 ],
160+ changed_chunk_spans = [{"start" : 0 , "end" : 2 }],
150161 ),
151162 _doc (
152163 [10 , 11 , 12 ],
@@ -159,6 +170,9 @@ def test_pack_documents_carries_token_and_chunk_metadata_with_offsets() -> None:
159170 token_chunk_kinds = [1 , 2 ],
160171 token_chunk_dep_levels = [0 , 2 ],
161172 token_call_edges = [{"from" : 1 , "to" : 0 }],
173+ token_type_edges = [{"from" : 0 , "to" : 1 }],
174+ changed_chunk_ids = [1 ],
175+ changed_chunk_spans = [{"start" : 1 , "end" : 3 }],
162176 ),
163177 ]
164178 )
@@ -176,6 +190,80 @@ def test_pack_documents_carries_token_and_chunk_metadata_with_offsets() -> None:
176190 assert row [TOKEN_CHUNK_KINDS_COLUMN ] == [4 , 1 , 2 ]
177191 assert row [TOKEN_CHUNK_DEP_LEVELS_COLUMN ] == [1 , 0 , 2 ]
178192 assert row [TOKEN_CALL_EDGES_COLUMN ] == [{"from" : 2 , "to" : 1 }]
193+ assert row [TOKEN_TYPE_EDGES_COLUMN ] == [{"from" : 1 , "to" : 2 }]
194+ assert row [CHANGED_CHUNK_IDS_COLUMN ] == [0 , 2 ]
195+ assert row [CHANGED_CHUNK_SPANS_COLUMN ] == [
196+ {"start" : 0 , "end" : 2 },
197+ {"start" : 3 , "end" : 5 },
198+ ]
199+
200+
201+ @pytest .mark .parametrize (
202+ ("edge_column" , "edge" ),
203+ [
204+ (TOKEN_CALL_EDGES_COLUMN , {"from" : 0 , "to" : 1 }),
205+ (TOKEN_TYPE_EDGES_COLUMN , {"from" : 1 , "to" : 0 }),
206+ ],
207+ )
208+ def test_normalize_document_record_rejects_graph_edges_without_chunk_layout (
209+ edge_column : str ,
210+ edge : dict [str , int ],
211+ ) -> None :
212+ record = _doc ([1 , 2 , 3 ])
213+ record [edge_column ] = [edge ]
214+
215+ with pytest .raises (ValueError , match = "requires non-empty token_chunk" ):
216+ normalize_document_record (record , source_doc_index = 0 )
217+
218+
219+ @pytest .mark .parametrize (
220+ ("edge_column" , "edge" ),
221+ [
222+ (TOKEN_CALL_EDGES_COLUMN , {"from" : 0 , "to" : 2 }),
223+ (TOKEN_TYPE_EDGES_COLUMN , {"from" : - 1 , "to" : 0 }),
224+ ],
225+ )
226+ def test_normalize_document_record_rejects_graph_edges_out_of_chunk_range (
227+ edge_column : str ,
228+ edge : dict [str , int ],
229+ ) -> None :
230+ record = _doc (
231+ [1 , 2 , 3 ],
232+ token_chunk_starts = [0 ],
233+ token_chunk_ends = [3 ],
234+ token_chunk_kinds = [1 ],
235+ token_chunk_dep_levels = [0 ],
236+ )
237+ record [edge_column ] = [edge ]
238+
239+ with pytest .raises (ValueError , match = f"{ edge_column } edge out of range" ):
240+ normalize_document_record (record , source_doc_index = 0 )
241+
242+
243+ def test_normalize_document_record_rejects_changed_chunk_ids_without_chunk_layout () -> None :
244+ record = _doc (
245+ [1 , 2 , 3 ],
246+ changed_chunk_ids = [0 ],
247+ changed_chunk_spans = [{"start" : 0 , "end" : 1 }],
248+ )
249+
250+ with pytest .raises (ValueError , match = "requires non-empty token_chunk" ):
251+ normalize_document_record (record , source_doc_index = 0 )
252+
253+
254+ def test_normalize_document_record_rejects_changed_chunk_ids_out_of_range () -> None :
255+ record = _doc (
256+ [1 , 2 , 3 ],
257+ token_chunk_starts = [0 ],
258+ token_chunk_ends = [3 ],
259+ token_chunk_kinds = [1 ],
260+ token_chunk_dep_levels = [0 ],
261+ changed_chunk_ids = [1 ],
262+ changed_chunk_spans = [{"start" : 0 , "end" : 1 }],
263+ )
264+
265+ with pytest .raises (ValueError , match = f"{ CHANGED_CHUNK_IDS_COLUMN } out of range" ):
266+ normalize_document_record (record , source_doc_index = 0 )
179267
180268
181269def test_pack_documents_merges_mixed_platform_ids_for_packed_row () -> None :
0 commit comments