Skip to content

Commit 0b2bd1c

Browse files
First outline of column takeset
1 parent 6f80cf2 commit 0b2bd1c

File tree

2 files changed

+223
-27
lines changed

2 files changed

+223
-27
lines changed

c/tskit/tables.c

Lines changed: 214 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -626,6 +626,72 @@ takeset_string(char **str, tsk_size_t *len, char *new_str, const tsk_size_t new_
626626
return 0;
627627
}
628628

629+
static int
630+
alloc_empty_ragged_column(tsk_size_t num_rows, void **data_col, tsk_size_t **offset_col)
631+
{
632+
int ret = 0;
633+
634+
*data_col = tsk_malloc(1);
635+
*offset_col = tsk_calloc(num_rows + 1, sizeof(tsk_size_t));
636+
if (*data_col == NULL || *offset_col == NULL) {
637+
ret = TSK_ERR_NO_MEMORY;
638+
goto out;
639+
}
640+
out:
641+
return ret;
642+
}
643+
644+
static int
645+
takeset_metadata_column(tsk_size_t num_rows, char *metadata, tsk_size_t *metadata_offset,
646+
char **metadata_dest, tsk_size_t **metadata_offset_dest)
647+
{
648+
int ret = 0;
649+
650+
if ((metadata == NULL) != (metadata_offset == NULL)) {
651+
ret = TSK_ERR_BAD_PARAM_VALUE;
652+
goto out;
653+
}
654+
if (metadata == NULL) {
655+
ret = alloc_empty_ragged_column(
656+
num_rows, (void *) metadata_dest, metadata_offset_dest);
657+
if (ret != 0) {
658+
goto out;
659+
}
660+
} else {
661+
ret = check_offsets(num_rows, metadata_offset, 0, false);
662+
if (ret != 0) {
663+
goto out;
664+
}
665+
*metadata_dest = metadata;
666+
*metadata_offset_dest = metadata_offset;
667+
}
668+
out:
669+
return ret;
670+
}
671+
672+
static int
673+
takeset_optional_id_column(tsk_size_t num_rows, tsk_id_t *input, tsk_id_t **dest)
674+
{
675+
int ret = 0;
676+
tsk_size_t buffsize;
677+
tsk_id_t *buff;
678+
679+
if (input == NULL) {
680+
buffsize = num_rows * sizeof(*buff);
681+
buff = tsk_malloc(buffsize);
682+
if (buff == NULL) {
683+
ret = TSK_ERR_NO_MEMORY;
684+
goto out;
685+
}
686+
*dest = buff;
687+
memset(buff, 0xff, buffsize);
688+
} else {
689+
*dest = input;
690+
}
691+
out:
692+
return ret;
693+
}
694+
629695
static int
630696
write_metadata_schema_header(
631697
FILE *out, const char *metadata_schema, tsk_size_t metadata_schema_length)
@@ -792,6 +858,33 @@ tsk_reference_sequence_takeset_metadata_schema(tsk_reference_sequence_t *self,
792858
* individual table
793859
*************************/
794860

861+
static void
862+
tsk_individual_table_free_columns(tsk_individual_table_t *self)
863+
{
864+
tsk_safe_free(self->flags);
865+
self->flags = NULL;
866+
tsk_safe_free(self->location);
867+
self->location = NULL;
868+
tsk_safe_free(self->location_offset);
869+
self->location_offset = NULL;
870+
tsk_safe_free(self->parents);
871+
self->parents = NULL;
872+
tsk_safe_free(self->parents_offset);
873+
self->parents_offset = NULL;
874+
tsk_safe_free(self->metadata);
875+
self->metadata = NULL;
876+
tsk_safe_free(self->metadata_offset);
877+
self->metadata_offset = NULL;
878+
}
879+
880+
int
881+
tsk_individual_table_free(tsk_individual_table_t *self)
882+
{
883+
tsk_individual_table_free_columns(self);
884+
tsk_safe_free(self->metadata_schema);
885+
return 0;
886+
}
887+
795888
static int
796889
tsk_individual_table_expand_main_columns(
797890
tsk_individual_table_t *self, tsk_size_t additional_rows)
@@ -971,6 +1064,76 @@ tsk_individual_table_set_columns(tsk_individual_table_t *self, tsk_size_t num_ro
9711064
return ret;
9721065
}
9731066

1067+
int TSK_WARN_UNUSED
1068+
tsk_individual_table_takeset_columns(tsk_individual_table_t *self, tsk_size_t num_rows,
1069+
tsk_flags_t *flags, double *location, tsk_size_t *location_offset, tsk_id_t *parents,
1070+
tsk_size_t *parents_offset, char *metadata, tsk_size_t *metadata_offset)
1071+
{
1072+
int ret = 0;
1073+
1074+
tsk_individual_table_free_columns(self);
1075+
self->num_rows = num_rows;
1076+
self->max_rows = num_rows;
1077+
1078+
if (flags == NULL) {
1079+
/* Flags defaults to all zeros if not specified. The column is often
1080+
* unused so this is a worthwhile optimisation. */
1081+
self->flags = tsk_calloc(num_rows, sizeof(*self->flags));
1082+
if (self->flags == NULL) {
1083+
ret = TSK_ERR_NO_MEMORY;
1084+
goto out;
1085+
}
1086+
} else {
1087+
self->flags = flags;
1088+
}
1089+
1090+
if ((location == NULL) != (location_offset == NULL)) {
1091+
ret = TSK_ERR_BAD_PARAM_VALUE;
1092+
goto out;
1093+
}
1094+
if (location == NULL) {
1095+
ret = alloc_empty_ragged_column(
1096+
num_rows, (void *) &self->location, &self->location_offset);
1097+
if (ret != 0) {
1098+
goto out;
1099+
}
1100+
} else {
1101+
ret = check_offsets(num_rows, location_offset, 0, false);
1102+
if (ret != 0) {
1103+
goto out;
1104+
}
1105+
self->location = location;
1106+
self->location_offset = location_offset;
1107+
}
1108+
1109+
if ((parents == NULL) != (parents_offset == NULL)) {
1110+
ret = TSK_ERR_BAD_PARAM_VALUE;
1111+
goto out;
1112+
}
1113+
if (parents == NULL) {
1114+
ret = alloc_empty_ragged_column(
1115+
num_rows, (void *) &self->parents, &self->parents_offset);
1116+
if (ret != 0) {
1117+
goto out;
1118+
}
1119+
} else {
1120+
ret = check_offsets(num_rows, parents_offset, 0, false);
1121+
if (ret != 0) {
1122+
goto out;
1123+
}
1124+
self->parents = parents;
1125+
self->parents_offset = parents_offset;
1126+
}
1127+
1128+
ret = takeset_metadata_column(
1129+
num_rows, metadata, metadata_offset, &self->metadata, &self->metadata_offset);
1130+
if (ret != 0) {
1131+
goto out;
1132+
}
1133+
out:
1134+
return ret;
1135+
}
1136+
9741137
int
9751138
tsk_individual_table_append_columns(tsk_individual_table_t *self, tsk_size_t num_rows,
9761139
const tsk_flags_t *flags, const double *location, const tsk_size_t *location_offset,
@@ -1276,20 +1439,6 @@ tsk_individual_table_extend(tsk_individual_table_t *self,
12761439
return ret;
12771440
}
12781441

1279-
int
1280-
tsk_individual_table_free(tsk_individual_table_t *self)
1281-
{
1282-
tsk_safe_free(self->flags);
1283-
tsk_safe_free(self->location);
1284-
tsk_safe_free(self->location_offset);
1285-
tsk_safe_free(self->parents);
1286-
tsk_safe_free(self->parents_offset);
1287-
tsk_safe_free(self->metadata);
1288-
tsk_safe_free(self->metadata_offset);
1289-
tsk_safe_free(self->metadata_schema);
1290-
return 0;
1291-
}
1292-
12931442
void
12941443
tsk_individual_table_print_state(const tsk_individual_table_t *self, FILE *out)
12951444
{
@@ -1558,6 +1707,25 @@ tsk_individual_table_load(tsk_individual_table_t *self, kastore_t *store)
15581707
* node table
15591708
*************************/
15601709

1710+
static void
1711+
tsk_node_table_free_columns(tsk_node_table_t *self)
1712+
{
1713+
tsk_safe_free(self->flags);
1714+
tsk_safe_free(self->time);
1715+
tsk_safe_free(self->population);
1716+
tsk_safe_free(self->individual);
1717+
tsk_safe_free(self->metadata);
1718+
tsk_safe_free(self->metadata_offset);
1719+
}
1720+
1721+
int
1722+
tsk_node_table_free(tsk_node_table_t *self)
1723+
{
1724+
tsk_node_table_free_columns(self);
1725+
tsk_safe_free(self->metadata_schema);
1726+
return 0;
1727+
}
1728+
15611729
static int
15621730
tsk_node_table_expand_main_columns(tsk_node_table_t *self, tsk_size_t additional_rows)
15631731
{
@@ -1671,6 +1839,38 @@ tsk_node_table_copy(
16711839
return ret;
16721840
}
16731841

1842+
int TSK_WARN_UNUSED
1843+
tsk_node_table_takeset_columns(tsk_node_table_t *self, tsk_size_t num_rows,
1844+
tsk_flags_t *flags, double *time, tsk_id_t *population, tsk_id_t *individual,
1845+
char *metadata, tsk_size_t *metadata_offset)
1846+
{
1847+
int ret;
1848+
1849+
tsk_node_table_free_columns(self);
1850+
1851+
/* Check the mandatory columns */
1852+
if (flags == NULL || time == NULL) {
1853+
/* TODO TSK_ERR_MANDATORY_COLUMN_MISSING */
1854+
ret = TSK_ERR_BAD_PARAM_VALUE;
1855+
goto out;
1856+
}
1857+
ret = takeset_optional_id_column(num_rows, population, &self->population);
1858+
if (ret != 0) {
1859+
goto out;
1860+
}
1861+
ret = takeset_optional_id_column(num_rows, individual, &self->individual);
1862+
if (ret != 0) {
1863+
goto out;
1864+
}
1865+
ret = takeset_metadata_column(
1866+
num_rows, metadata, metadata_offset, &self->metadata, &self->metadata_offset);
1867+
if (ret != 0) {
1868+
goto out;
1869+
}
1870+
out:
1871+
return ret;
1872+
}
1873+
16741874
int TSK_WARN_UNUSED
16751875
tsk_node_table_set_columns(tsk_node_table_t *self, tsk_size_t num_rows,
16761876
const tsk_flags_t *flags, const double *time, const tsk_id_t *population,
@@ -1925,19 +2125,6 @@ tsk_node_table_extend(tsk_node_table_t *self, const tsk_node_table_t *other,
19252125
return ret;
19262126
}
19272127

1928-
int
1929-
tsk_node_table_free(tsk_node_table_t *self)
1930-
{
1931-
tsk_safe_free(self->flags);
1932-
tsk_safe_free(self->time);
1933-
tsk_safe_free(self->population);
1934-
tsk_safe_free(self->individual);
1935-
tsk_safe_free(self->metadata);
1936-
tsk_safe_free(self->metadata_offset);
1937-
tsk_safe_free(self->metadata_schema);
1938-
return 0;
1939-
}
1940-
19412128
void
19422129
tsk_node_table_print_state(const tsk_node_table_t *self, FILE *out)
19432130
{

c/tskit/tables.h

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1019,6 +1019,11 @@ int tsk_individual_table_set_columns(tsk_individual_table_t *self, tsk_size_t nu
10191019
const tsk_id_t *parents, const tsk_size_t *parents_offset, const char *metadata,
10201020
const tsk_size_t *metadata_offset);
10211021

1022+
int tsk_individual_table_takeset_columns(tsk_individual_table_t *self,
1023+
tsk_size_t num_rows, tsk_flags_t *flags, double *location,
1024+
tsk_size_t *location_offset, tsk_id_t *parents, tsk_size_t *parents_offset,
1025+
char *metadata, tsk_size_t *metadata_offset);
1026+
10221027
/**
10231028
@brief Extends this table by copying from a set of column arrays
10241029
@@ -1361,6 +1366,10 @@ int tsk_node_table_set_columns(tsk_node_table_t *self, tsk_size_t num_rows,
13611366
const tsk_flags_t *flags, const double *time, const tsk_id_t *population,
13621367
const tsk_id_t *individual, const char *metadata, const tsk_size_t *metadata_offset);
13631368

1369+
int tsk_node_table_takeset_columns(tsk_node_table_t *self, tsk_size_t num_rows,
1370+
tsk_flags_t *flags, double *time, tsk_id_t *population, tsk_id_t *individual,
1371+
char *metadata, tsk_size_t *metadata_offset);
1372+
13641373
/**
13651374
@brief Extends this table by copying from a set of column arrays
13661375

0 commit comments

Comments
 (0)