@@ -5491,3 +5491,96 @@ def test_error_if_no_schema(self, table_name):
54915491 ts = msprime .simulate (10 )
54925492 with pytest .raises (NotImplementedError ):
54935493 getattr (ts , f"{ table_name } _metadata" )
5494+
5495+
5496+ class TestIndividualsNodes :
5497+ def test_basic_individuals_nodes (self , tmp_path ):
5498+ # Create a basic tree sequence with two individuals
5499+ tables = tskit .TableCollection (sequence_length = 100 )
5500+ tables .individuals .add_row (flags = 0 , location = (0 , 0 ), metadata = b"" )
5501+ tables .individuals .add_row (flags = 0 , location = (0 , 0 ), metadata = b"" )
5502+ tables .nodes .add_row (flags = tskit .NODE_IS_SAMPLE , time = 0 , individual = 0 )
5503+ tables .nodes .add_row (flags = tskit .NODE_IS_SAMPLE , time = 0 , individual = 0 )
5504+ tables .nodes .add_row (flags = tskit .NODE_IS_SAMPLE , time = 0 , individual = 1 )
5505+ tables .nodes .add_row (flags = tskit .NODE_IS_SAMPLE , time = 0 , individual = 1 )
5506+ ts = tables .tree_sequence ()
5507+
5508+ result = ts .individuals_nodes
5509+ assert result .shape == (2 , 2 )
5510+ assert_array_equal (result , [[0 , 1 ], [2 , 3 ]])
5511+
5512+ def test_variable_ploidy (self , tmp_path ):
5513+ tables = tskit .TableCollection (sequence_length = 100 )
5514+ tables .individuals .add_row (flags = 0 , location = (0 , 0 ), metadata = b"" ) # Diploid
5515+ tables .individuals .add_row (flags = 0 , location = (0 , 0 ), metadata = b"" ) # Haploid
5516+ tables .individuals .add_row (flags = 0 , location = (0 , 0 ), metadata = b"" ) # Triploid
5517+
5518+ # Diploid individual
5519+ tables .nodes .add_row (flags = tskit .NODE_IS_SAMPLE , time = 0 , individual = 0 )
5520+ tables .nodes .add_row (flags = tskit .NODE_IS_SAMPLE , time = 0 , individual = 0 )
5521+
5522+ # Haploid individual
5523+ tables .nodes .add_row (flags = tskit .NODE_IS_SAMPLE , time = 0 , individual = 1 )
5524+
5525+ # Triploid individual
5526+ tables .nodes .add_row (flags = tskit .NODE_IS_SAMPLE , time = 0 , individual = 2 )
5527+ tables .nodes .add_row (flags = tskit .NODE_IS_SAMPLE , time = 0 , individual = 2 )
5528+ tables .nodes .add_row (flags = tskit .NODE_IS_SAMPLE , time = 0 , individual = 2 )
5529+
5530+ ts = tables .tree_sequence ()
5531+
5532+ result = ts .individuals_nodes
5533+
5534+ assert result .shape == (3 , 3 )
5535+
5536+ expected = np .array (
5537+ [[0 , 1 , - 1 ], [2 , - 1 , - 1 ], [3 , 4 , 5 ]] # Diploid # Haploid # Triploid
5538+ )
5539+ assert_array_equal (result , expected )
5540+
5541+ def test_no_individuals (self ):
5542+ tables = tskit .TableCollection (sequence_length = 100 )
5543+ tables .nodes .add_row (flags = tskit .NODE_IS_SAMPLE , time = 0 )
5544+ ts = tables .tree_sequence ()
5545+
5546+ result = ts .individuals_nodes
5547+ expected = np .array ([], dtype = np .int32 ).reshape (0 , 0 )
5548+ assert result .shape == (0 , 0 )
5549+ assert_array_equal (result , expected )
5550+
5551+ def test_no_nodes_with_individuals (self ):
5552+ tables = tskit .TableCollection (sequence_length = 100 )
5553+ tables .individuals .add_row (flags = 0 , location = (0 , 0 ), metadata = b"" )
5554+ # Node without individual reference
5555+ tables .nodes .add_row (flags = tskit .NODE_IS_SAMPLE , time = 0 )
5556+ ts = tables .tree_sequence ()
5557+
5558+ result = ts .individuals_nodes
5559+ expected = np .array ([[]])
5560+ assert result .shape == (1 , 0 )
5561+ assert_array_equal (result , expected )
5562+
5563+ def test_individual_with_no_nodes (self ):
5564+ tables = tskit .TableCollection (sequence_length = 100 )
5565+ tables .individuals .add_row (flags = 0 , location = (0 , 0 ), metadata = b"" )
5566+ tables .individuals .add_row (flags = 0 , location = (0 , 0 ), metadata = b"" )
5567+ # Only add nodes for first individual
5568+ tables .nodes .add_row (flags = tskit .NODE_IS_SAMPLE , time = 0 , individual = 0 )
5569+ ts = tables .tree_sequence ()
5570+
5571+ result = ts .individuals_nodes
5572+ expected = np .array ([[0 ], [- 1 ]])
5573+ assert result .shape == (2 , 1 )
5574+ assert_array_equal (result , expected )
5575+
5576+ def test_mixed_sample_status (self ):
5577+ tables = tskit .TableCollection (sequence_length = 100 )
5578+ tables .individuals .add_row (flags = 0 , location = (0 , 0 ), metadata = b"" )
5579+ tables .nodes .add_row (flags = tskit .NODE_IS_SAMPLE , time = 0 , individual = 0 )
5580+ tables .nodes .add_row (flags = 0 , time = 0 , individual = 0 )
5581+ ts = tables .tree_sequence ()
5582+
5583+ result = ts .individuals_nodes
5584+ expected = np .array ([[0 , 1 ]])
5585+ assert result .shape == (1 , 2 )
5586+ assert_array_equal (result , expected )
0 commit comments