209
209
tsk_ls_hmm_free (tsk_ls_hmm_t * self )
210
210
{
211
211
tsk_tree_free (& self -> tree );
212
- tsk_diff_iter_free (& self -> diffs );
212
+ tsk_tree_position_free (& self -> tree_pos );
213
213
tsk_safe_free (self -> recombination_rate );
214
214
tsk_safe_free (self -> mutation_rate );
215
215
tsk_safe_free (self -> recombination_rate );
@@ -248,9 +248,8 @@ tsk_ls_hmm_reset(tsk_ls_hmm_t *self)
248
248
tsk_memset (self -> transition_parent , 0xff ,
249
249
self -> max_transitions * sizeof (* self -> transition_parent ));
250
250
251
- /* This is safe because we've already zero'd out the memory. */
252
- tsk_diff_iter_free (& self -> diffs );
253
- ret = tsk_diff_iter_init_from_ts (& self -> diffs , self -> tree_sequence , false);
251
+ tsk_tree_position_free (& self -> tree_pos );
252
+ ret = tsk_tree_position_init (& self -> tree_pos , self -> tree_sequence , 0 );
254
253
if (ret != 0 ) {
255
254
goto out ;
256
255
}
@@ -306,47 +305,48 @@ tsk_ls_hmm_update_tree(tsk_ls_hmm_t *self)
306
305
int ret = 0 ;
307
306
tsk_id_t * restrict parent = self -> parent ;
308
307
tsk_id_t * restrict T_index = self -> transition_index ;
308
+ const tsk_id_t * restrict edges_child = self -> tree_sequence -> tables -> edges .child ;
309
+ const tsk_id_t * restrict edges_parent = self -> tree_sequence -> tables -> edges .parent ;
309
310
tsk_value_transition_t * restrict T = self -> transitions ;
310
- tsk_edge_list_node_t * record ;
311
- tsk_edge_list_t records_out , records_in ;
312
- tsk_edge_t edge ;
313
- double left , right ;
314
- tsk_id_t u ;
311
+ tsk_id_t u , c , p , j , e ;
315
312
tsk_value_transition_t * vt ;
316
313
317
- ret = tsk_diff_iter_next (& self -> diffs , & left , & right , & records_out , & records_in );
318
- if (ret < 0 ) {
319
- goto out ;
320
- }
314
+ tsk_tree_position_next (& self -> tree_pos );
315
+ tsk_bug_assert (self -> tree_pos .index != -1 );
316
+ tsk_bug_assert (self -> tree_pos .index == self -> tree .index );
321
317
322
- for (record = records_out .head ; record != NULL ; record = record -> next ) {
323
- u = record -> edge .child ;
318
+ for (j = self -> tree_pos .out .start ; j < self -> tree_pos .out .stop ; j ++ ) {
319
+ e = self -> tree_pos .out .order [j ];
320
+ c = edges_child [e ];
321
+ u = c ;
324
322
if (T_index [u ] == TSK_NULL ) {
325
323
/* Ensure the subtree we're detaching has a transition at the root */
326
324
while (T_index [u ] == TSK_NULL ) {
327
325
u = parent [u ];
328
326
tsk_bug_assert (u != TSK_NULL );
329
327
}
330
328
tsk_bug_assert (self -> num_transitions < self -> max_transitions );
331
- T_index [record -> edge . child ] = (tsk_id_t ) self -> num_transitions ;
332
- T [self -> num_transitions ].tree_node = record -> edge . child ;
329
+ T_index [c ] = (tsk_id_t ) self -> num_transitions ;
330
+ T [self -> num_transitions ].tree_node = c ;
333
331
T [self -> num_transitions ].value = T [T_index [u ]].value ;
334
332
self -> num_transitions ++ ;
335
333
}
336
- parent [record -> edge . child ] = TSK_NULL ;
334
+ parent [c ] = TSK_NULL ;
337
335
}
338
336
339
- for (record = records_in .head ; record != NULL ; record = record -> next ) {
340
- edge = record -> edge ;
341
- parent [edge .child ] = edge .parent ;
342
- u = edge .parent ;
343
- if (parent [edge .parent ] == TSK_NULL ) {
337
+ for (j = self -> tree_pos .in .start ; j < self -> tree_pos .in .stop ; j ++ ) {
338
+ e = self -> tree_pos .in .order [j ];
339
+ c = edges_child [e ];
340
+ p = edges_parent [e ];
341
+ parent [c ] = p ;
342
+ u = p ;
343
+ if (parent [p ] == TSK_NULL ) {
344
344
/* Grafting onto a new root. */
345
- if (T_index [record -> edge . parent ] == TSK_NULL ) {
346
- T_index [edge . parent ] = (tsk_id_t ) self -> num_transitions ;
345
+ if (T_index [p ] == TSK_NULL ) {
346
+ T_index [p ] = (tsk_id_t ) self -> num_transitions ;
347
347
tsk_bug_assert (self -> num_transitions < self -> max_transitions );
348
- T [self -> num_transitions ].tree_node = edge . parent ;
349
- T [self -> num_transitions ].value = T [T_index [edge . child ]].value ;
348
+ T [self -> num_transitions ].tree_node = p ;
349
+ T [self -> num_transitions ].value = T [T_index [c ]].value ;
350
350
self -> num_transitions ++ ;
351
351
}
352
352
} else {
@@ -356,18 +356,17 @@ tsk_ls_hmm_update_tree(tsk_ls_hmm_t *self)
356
356
}
357
357
tsk_bug_assert (u != TSK_NULL );
358
358
}
359
- tsk_bug_assert (T_index [u ] != -1 && T_index [edge . child ] != -1 );
360
- if (T [T_index [u ]].value == T [T_index [edge . child ]].value ) {
361
- vt = & T [T_index [edge . child ]];
359
+ tsk_bug_assert (T_index [u ] != -1 && T_index [c ] != -1 );
360
+ if (T [T_index [u ]].value == T [T_index [c ]].value ) {
361
+ vt = & T [T_index [c ]];
362
362
/* Mark the value transition as unusued */
363
363
vt -> value = -1 ;
364
364
vt -> tree_node = TSK_NULL ;
365
- T_index [edge . child ] = TSK_NULL ;
365
+ T_index [c ] = TSK_NULL ;
366
366
}
367
367
}
368
368
369
369
ret = tsk_ls_hmm_remove_dead_roots (self );
370
- out :
371
370
return ret ;
372
371
}
373
372
0 commit comments