Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
51 commits
Select commit Hold shift + click to select a range
953b5e2
Trigger lint on merge queue
benjeffery Mar 13, 2026
17bacda
remove consts from tsk_json_struct_metadata_get_blob (closes #3425)
petrelharp Mar 12, 2026
8d4ab2d
edits to dev docs
petrelharp Mar 12, 2026
2a02e7f
no detached head; closes #3431
petrelharp Mar 12, 2026
924c2f0
remove prompts from bash commands for copyability; closes #3430
petrelharp Mar 12, 2026
1656dc4
further clarify uv subdir; closes #3429
petrelharp Mar 12, 2026
01de523
installation on macos; closes #3432
petrelharp Mar 12, 2026
0071e2d
note about debug build; closes #3433
petrelharp Mar 12, 2026
afaf3b9
uv run gdb in dev docs
petrelharp Mar 16, 2026
2f26dc6
Add documentation for ts.ld_matrix()
apragsdale Mar 5, 2026
cc36ef7
initial stab at a general matrix (no normalisation)
lkirk Oct 26, 2025
1c086a2
added dimension dropping, but I think transposing is better -- we don…
lkirk Oct 26, 2025
1e30d0d
finalize and add tests for single and multipop
lkirk Dec 4, 2025
4b948a0
turns out, the general norm function needs to know the state_dims
lkirk Dec 4, 2025
7e8264a
fix up a bit of naming in general test funcs, remove unneeded branch,…
lkirk Dec 4, 2025
7ba6f74
flake8 does not like assigning lambdas to variables
lkirk Dec 4, 2025
25d4633
and black doesn't like that
lkirk Dec 4, 2025
49a4278
do not test equality, this was useful on my local machine but is prob…
lkirk Dec 7, 2025
c75e20a
lowlevel tests
lkirk Mar 9, 2026
58f3647
relax diff requirements (macos failure)
lkirk Mar 9, 2026
3f5bbbb
relax diff requirements (macos failure) -- previous commit fixed one
lkirk Mar 9, 2026
c89341d
new formatting tools, fix lint
lkirk Mar 9, 2026
23eed87
remove TODOs, old comment and tested elsewhere
lkirk Mar 10, 2026
b412ece
make testing more clear
petrelharp Mar 15, 2026
3bc699d
preserve native dimensions instead of expanding at the end
lkirk Mar 16, 2026
f172c3e
Update tests according to Peters's feedback
lkirk Mar 16, 2026
eaa6c11
msprime produces different trees on macos (same seed)
lkirk Mar 16, 2026
478681b
Clean up python C tests
lkirk Mar 17, 2026
3b61f67
Add/refine tests, draft docstring
lkirk Mar 17, 2026
1b1a58e
regain test coverage for default sample sets
lkirk Mar 17, 2026
51b358e
Revert "regain test coverage for default sample sets"
lkirk Mar 17, 2026
807bc30
update comment about result dimension
lkirk Mar 17, 2026
f5931ec
be more explicit about setting the default norm function
lkirk Mar 17, 2026
b723652
linting does not like assigning lambdas to variables
lkirk Mar 17, 2026
ea88f37
add an else statement to improve readability (review)
lkirk Mar 20, 2026
dfd5736
add a few more tests (review)
lkirk Mar 20, 2026
c9ad633
Add some minimal documentation about the purpose of the two entrypoints
lkirk Mar 20, 2026
b9384fc
Test explicitly that our internal data is read only
lkirk Mar 20, 2026
242734a
Fix memory leak; more readonly arrays
lkirk Mar 20, 2026
17182bd
Return on summary function error (bug)
lkirk Mar 21, 2026
2874058
Incorporate Peter's improvement to the test comments
lkirk Mar 22, 2026
555b679
Update docstring (feedback from Peter)
lkirk Mar 22, 2026
17e8d43
turns out the documentation build doesn't like ``result_dim``s changi…
lkirk Mar 22, 2026
dd8e8e8
make tsk_treeseq_two_locus_count_stat private
lkirk Mar 31, 2026
f27ee82
clarify comment a bit
lkirk Mar 31, 2026
44c5922
fix one C test that relied on tsk_treeseq_two_locus_count_stat
lkirk Mar 31, 2026
9bba0bf
use general stat function in C test
lkirk Mar 31, 2026
88fee03
clarify comment about norm func
lkirk Mar 31, 2026
9b581b7
remove superfluous docstrings (comments from peter)
lkirk Apr 7, 2026
b66dd86
incorporate Aaron's comments, add links to two-locus docs, a bit of
lkirk Apr 7, 2026
fbcedfe
add computational details section
lkirk Apr 7, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .github/workflows/lint.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ name: Lint

on:
pull_request:
merge_group:

jobs:
Lint:
Expand Down
16 changes: 8 additions & 8 deletions c/tests/test_core.c
Original file line number Diff line number Diff line change
Expand Up @@ -101,19 +101,19 @@ test_json_struct_metadata_get_blob(void)
{
int ret;
char metadata[128];
const char *json;
char *json;
tsk_size_t json_buffer_length;
const char *blob;
char *blob;
tsk_size_t blob_length;
uint8_t *bytes;
tsk_size_t metadata_length;
size_t header_length;
size_t json_length;
size_t payload_length;
size_t total_length;
const char json_payload[] = "{\"a\":1}";
const uint8_t binary_payload[] = { 0x01, 0x02, 0x03, 0x04 };
const uint8_t empty_payload[] = { 0 };
char json_payload[] = "{\"a\":1}";
uint8_t binary_payload[] = { 0x01, 0x02, 0x03, 0x04 };
uint8_t empty_payload[] = { 0 };

bytes = (uint8_t *) metadata;
header_length = 4 + 1 + 8 + 8;
Expand All @@ -135,7 +135,7 @@ test_json_struct_metadata_get_blob(void)
ret = tsk_json_struct_metadata_get_blob(
metadata, metadata_length, &json, &json_buffer_length, &blob, &blob_length);
CU_ASSERT_EQUAL(ret, 0);
CU_ASSERT_PTR_EQUAL(json, (const char *) bytes + header_length);
CU_ASSERT_PTR_EQUAL(json, (char *) bytes + header_length);
CU_ASSERT_EQUAL(json_buffer_length, (tsk_size_t) json_length);
if (json_length > 0) {
CU_ASSERT_EQUAL(memcmp(json, json_payload, json_length), 0);
Expand All @@ -152,7 +152,7 @@ test_json_struct_metadata_get_blob(void)
ret = tsk_json_struct_metadata_get_blob(
metadata, metadata_length, &json, &json_buffer_length, &blob, &blob_length);
CU_ASSERT_EQUAL(ret, 0);
CU_ASSERT_PTR_EQUAL(json, (const char *) bytes + header_length);
CU_ASSERT_PTR_EQUAL(json, (char *) bytes + header_length);
CU_ASSERT_EQUAL(json_buffer_length, (tsk_size_t) json_length);
CU_ASSERT_EQUAL(blob_length, (tsk_size_t) payload_length);
CU_ASSERT_PTR_EQUAL(blob, bytes + header_length + json_length);
Expand All @@ -168,7 +168,7 @@ test_json_struct_metadata_get_blob(void)
ret = tsk_json_struct_metadata_get_blob(
metadata, metadata_length, &json, &json_buffer_length, &blob, &blob_length);
CU_ASSERT_EQUAL(ret, 0);
CU_ASSERT_PTR_EQUAL(json, (const char *) bytes + header_length);
CU_ASSERT_PTR_EQUAL(json, (char *) bytes + header_length);
CU_ASSERT_EQUAL(json_buffer_length, (tsk_size_t) json_length);
CU_ASSERT_EQUAL(blob_length, (tsk_size_t) payload_length);
CU_ASSERT_PTR_EQUAL(blob, bytes + header_length + json_length);
Expand Down
6 changes: 3 additions & 3 deletions c/tests/test_stats.c
Original file line number Diff line number Diff line change
Expand Up @@ -3680,9 +3680,9 @@ test_two_locus_stat_input_errors(void)
row_sites, NULL, num_sites, col_sites, NULL, 0, result);
CU_ASSERT_EQUAL_FATAL(ret, 0);

ret = tsk_treeseq_two_locus_count_stat(&ts, num_sample_sets, sample_set_sizes,
sample_sets, 0, NULL, NULL, NULL, num_sites, row_sites, NULL, num_sites,
col_sites, NULL, 0, result);
ret = tsk_treeseq_two_locus_general_count_stat(&ts, num_sample_sets,
sample_set_sizes, sample_sets, 0, NULL, NULL, NULL, num_sites, row_sites, NULL,
num_sites, col_sites, NULL, 0, result);
CU_ASSERT_EQUAL_FATAL(ret, TSK_ERR_BAD_RESULT_DIMS);

ret = tsk_treeseq_r2(&ts, 1, sample_set_sizes, sample_sets, num_sites, row_sites,
Expand Down
17 changes: 8 additions & 9 deletions c/tskit/core.c
Original file line number Diff line number Diff line change
Expand Up @@ -142,26 +142,25 @@ tsk_generate_uuid(char *dest, int TSK_UNUSED(flags))
}

int
tsk_json_struct_metadata_get_blob(const char *metadata, tsk_size_t metadata_length,
const char **json, tsk_size_t *json_length, const char **blob,
tsk_size_t *blob_length)
tsk_json_struct_metadata_get_blob(char *metadata, tsk_size_t metadata_length,
char **json, tsk_size_t *json_length, char **blob, tsk_size_t *blob_length)
{
int ret;
uint8_t version;
uint64_t json_length_u64;
uint64_t binary_length_u64;
uint64_t header_and_json_length;
uint64_t total_length;
const uint8_t *bytes;
const char *blob_start;
const char *json_start;
uint8_t *bytes;
char *blob_start;
char *json_start;

if (metadata == NULL || json == NULL || json_length == NULL || blob == NULL
|| blob_length == NULL) {
ret = tsk_trace_error(TSK_ERR_BAD_PARAM_VALUE);
goto out;
}
bytes = (const uint8_t *) metadata;
bytes = (uint8_t *) metadata;
if (metadata_length < TSK_JSON_BINARY_HEADER_SIZE) {
ret = tsk_trace_error(TSK_ERR_JSON_STRUCT_METADATA_TRUNCATED);
goto out;
Expand Down Expand Up @@ -191,8 +190,8 @@ tsk_json_struct_metadata_get_blob(const char *metadata, tsk_size_t metadata_leng
ret = tsk_trace_error(TSK_ERR_JSON_STRUCT_METADATA_TRUNCATED);
goto out;
}
json_start = (const char *) bytes + TSK_JSON_BINARY_HEADER_SIZE;
blob_start = (const char *) bytes + TSK_JSON_BINARY_HEADER_SIZE + json_length_u64;
json_start = (char *) bytes + TSK_JSON_BINARY_HEADER_SIZE;
blob_start = (char *) bytes + TSK_JSON_BINARY_HEADER_SIZE + json_length_u64;
*json = json_start;
*json_length = (tsk_size_t) json_length_u64;
*blob = blob_start;
Expand Down
5 changes: 2 additions & 3 deletions c/tskit/core.h
Original file line number Diff line number Diff line change
Expand Up @@ -1153,9 +1153,8 @@ the original metadata buffer is alive.
@param[out] blob_length On success, set to the payload length in bytes.
@return Return 0 on success or a negative value on failure.
*/
int tsk_json_struct_metadata_get_blob(const char *metadata, tsk_size_t metadata_length,
const char **json, tsk_size_t *json_length, const char **blob,
tsk_size_t *blob_length);
int tsk_json_struct_metadata_get_blob(char *metadata, tsk_size_t metadata_length,
char **json, tsk_size_t *json_length, char **blob, tsk_size_t *blob_length);

/* TODO most of these can probably be macros so they compile out as no-ops.
* Lets do the 64 bit tsk_size_t switch first though. */
Expand Down
94 changes: 58 additions & 36 deletions c/tskit/trees.c
Original file line number Diff line number Diff line change
Expand Up @@ -2298,8 +2298,9 @@ get_allele_samples(const tsk_site_t *site, tsk_size_t site_offset,
}

static int
norm_hap_weighted(tsk_size_t result_dim, const double *hap_weights,
tsk_size_t TSK_UNUSED(n_a), tsk_size_t TSK_UNUSED(n_b), double *result, void *params)
norm_hap_weighted(tsk_size_t TSK_UNUSED(state_dim), const double *hap_weights,
tsk_size_t result_dim, tsk_size_t TSK_UNUSED(n_a), tsk_size_t TSK_UNUSED(n_b),
double *result, void *params)
{
sample_count_stat_params_t args = *(sample_count_stat_params_t *) params;
const double *weight_row;
Expand All @@ -2315,8 +2316,9 @@ norm_hap_weighted(tsk_size_t result_dim, const double *hap_weights,
}

static int
norm_hap_weighted_ij(tsk_size_t result_dim, const double *hap_weights,
tsk_size_t TSK_UNUSED(n_a), tsk_size_t TSK_UNUSED(n_b), double *result, void *params)
norm_hap_weighted_ij(tsk_size_t TSK_UNUSED(state_dim), const double *hap_weights,
tsk_size_t result_dim, tsk_size_t TSK_UNUSED(n_a), tsk_size_t TSK_UNUSED(n_b),
double *result, void *params)
{
sample_count_stat_params_t args = *(sample_count_stat_params_t *) params;
const double *weight_row;
Expand All @@ -2341,8 +2343,9 @@ norm_hap_weighted_ij(tsk_size_t result_dim, const double *hap_weights,
}

static int
norm_total_weighted(tsk_size_t result_dim, const double *TSK_UNUSED(hap_weights),
tsk_size_t n_a, tsk_size_t n_b, double *result, void *TSK_UNUSED(params))
norm_total_weighted(tsk_size_t TSK_UNUSED(state_dim),
const double *TSK_UNUSED(hap_weights), tsk_size_t result_dim, tsk_size_t n_a,
tsk_size_t n_b, double *result, void *TSK_UNUSED(params))
{
tsk_size_t k;
double norm = 1 / (double) (n_a * n_b);
Expand Down Expand Up @@ -2411,8 +2414,8 @@ static int
compute_general_normed_two_site_stat_result(const tsk_bitset_t *state,
const tsk_size_t *allele_counts, tsk_size_t a_off, tsk_size_t b_off,
tsk_size_t num_a_alleles, tsk_size_t num_b_alleles, tsk_size_t state_dim,
tsk_size_t result_dim, general_stat_func_t *f, sample_count_stat_params_t *f_params,
norm_func_t *norm_f, bool polarised, two_locus_work_t *restrict work, double *result)
tsk_size_t result_dim, general_stat_func_t *f, void *f_params, norm_func_t *norm_f,
bool polarised, two_locus_work_t *restrict work, double *result)
{
int ret = 0;
// Sample sets and b sites are rows, a sites are columns
Expand Down Expand Up @@ -2445,7 +2448,7 @@ compute_general_normed_two_site_stat_result(const tsk_bitset_t *state,
if (ret != 0) {
goto out;
}
ret = norm_f(result_dim, weights, num_a_alleles - is_polarised,
ret = norm_f(state_dim, weights, result_dim, num_a_alleles - is_polarised,
num_b_alleles - is_polarised, norm, f_params);
if (ret != 0) {
goto out;
Expand All @@ -2463,9 +2466,8 @@ compute_general_normed_two_site_stat_result(const tsk_bitset_t *state,
static int
compute_general_two_site_stat_result(const tsk_bitset_t *state,
const tsk_size_t *allele_counts, tsk_size_t a_off, tsk_size_t b_off,
tsk_size_t state_dim, tsk_size_t result_dim, general_stat_func_t *f,
sample_count_stat_params_t *f_params, two_locus_work_t *restrict work,
double *result)
tsk_size_t state_dim, tsk_size_t result_dim, general_stat_func_t *f, void *f_params,
two_locus_work_t *restrict work, double *result)
{
int ret = 0;
tsk_size_t k;
Expand Down Expand Up @@ -2653,9 +2655,8 @@ static int
tsk_treeseq_two_site_count_stat(const tsk_treeseq_t *self, tsk_size_t state_dim,
tsk_size_t num_sample_sets, const tsk_size_t *sample_set_sizes,
const tsk_id_t *sample_sets, tsk_size_t result_dim, general_stat_func_t *f,
sample_count_stat_params_t *f_params, norm_func_t *norm_f, tsk_size_t n_rows,
const tsk_id_t *row_sites, tsk_size_t n_cols, const tsk_id_t *col_sites,
tsk_flags_t options, double *result)
void *f_params, norm_func_t *norm_f, tsk_size_t n_rows, const tsk_id_t *row_sites,
tsk_size_t n_cols, const tsk_id_t *col_sites, tsk_flags_t options, double *result)
{
int ret = 0;
tsk_bitset_t allele_samples, allele_sample_sets;
Expand Down Expand Up @@ -3089,9 +3090,8 @@ advance_collect_edges(iter_state *s, tsk_id_t index)
static int
compute_two_tree_branch_state_update(const tsk_treeseq_t *ts, tsk_id_t c,
const iter_state *A_state, const iter_state *B_state, tsk_size_t state_dim,
tsk_size_t result_dim, int sign, general_stat_func_t *f,
sample_count_stat_params_t *f_params, two_locus_work_t *restrict work,
double *result)
tsk_size_t result_dim, int sign, general_stat_func_t *f, void *f_params,
two_locus_work_t *restrict work, double *result)
{
int ret = 0;
double a_len, b_len;
Expand Down Expand Up @@ -3141,8 +3141,8 @@ compute_two_tree_branch_state_update(const tsk_treeseq_t *ts, tsk_id_t c,

static int
compute_two_tree_branch_stat(const tsk_treeseq_t *ts, const iter_state *l_state,
iter_state *r_state, general_stat_func_t *f, sample_count_stat_params_t *f_params,
tsk_size_t result_dim, tsk_size_t state_dim, double *result)
iter_state *r_state, general_stat_func_t *f, void *f_params, tsk_size_t result_dim,
tsk_size_t state_dim, double *result)
{
int ret = 0;
tsk_id_t e, c, ec, p, *updated_nodes = NULL;
Expand Down Expand Up @@ -3188,8 +3188,11 @@ compute_two_tree_branch_stat(const tsk_treeseq_t *ts, const iter_state *l_state,
while (n_updates != 0) {
n_updates--;
c = updated_nodes[n_updates];
compute_two_tree_branch_state_update(ts, c, l_state, r_state, state_dim,
ret = compute_two_tree_branch_state_update(ts, c, l_state, r_state, state_dim,
result_dim, -1, f, f_params, &work, result);
if (ret != 0) {
goto out;
}
}
// Remove samples under nodes from removed edges to parent nodes
for (j = 0; j < r_state->n_edges_out; j++) {
Expand Down Expand Up @@ -3229,8 +3232,11 @@ compute_two_tree_branch_stat(const tsk_treeseq_t *ts, const iter_state *l_state,
while (n_updates != 0) {
n_updates--;
c = updated_nodes[n_updates];
compute_two_tree_branch_state_update(ts, c, l_state, r_state, state_dim,
ret = compute_two_tree_branch_state_update(ts, c, l_state, r_state, state_dim,
result_dim, +1, f, f_params, &work, result);
if (ret != 0) {
goto out;
}
}
out:
tsk_safe_free(updated_nodes);
Expand All @@ -3243,9 +3249,9 @@ static int
tsk_treeseq_two_branch_count_stat(const tsk_treeseq_t *self, tsk_size_t state_dim,
tsk_size_t num_sample_sets, const tsk_size_t *sample_set_sizes,
const tsk_id_t *sample_sets, tsk_size_t result_dim, general_stat_func_t *f,
sample_count_stat_params_t *f_params, norm_func_t *TSK_UNUSED(norm_f),
tsk_size_t n_rows, const double *row_positions, tsk_size_t n_cols,
const double *col_positions, tsk_flags_t TSK_UNUSED(options), double *result)
void *f_params, norm_func_t *TSK_UNUSED(norm_f), tsk_size_t n_rows,
const double *row_positions, tsk_size_t n_cols, const double *col_positions,
tsk_flags_t TSK_UNUSED(options), double *result)
{
int ret = 0;
int r, c;
Expand Down Expand Up @@ -3384,11 +3390,12 @@ check_sample_set_dups(tsk_size_t num_sample_sets, const tsk_size_t *sample_set_s
return ret;
}

/* Called directly by C python interface `two_locus_count_stat` */
int
tsk_treeseq_two_locus_count_stat(const tsk_treeseq_t *self, tsk_size_t num_sample_sets,
const tsk_size_t *sample_set_sizes, const tsk_id_t *sample_sets,
tsk_size_t result_dim, const tsk_id_t *set_indexes, general_stat_func_t *f,
norm_func_t *norm_f, tsk_size_t out_rows, const tsk_id_t *row_sites,
tsk_treeseq_two_locus_general_count_stat(const tsk_treeseq_t *self,
tsk_size_t num_sample_sets, const tsk_size_t *sample_set_sizes,
const tsk_id_t *sample_sets, tsk_size_t result_dim, general_stat_func_t *f,
void *f_params, norm_func_t *norm_f, tsk_size_t out_rows, const tsk_id_t *row_sites,
const double *row_positions, tsk_size_t out_cols, const tsk_id_t *col_sites,
const double *col_positions, tsk_flags_t options, double *result)
{
Expand All @@ -3398,10 +3405,6 @@ tsk_treeseq_two_locus_count_stat(const tsk_treeseq_t *self, tsk_size_t num_sampl
bool stat_site = !!(options & TSK_STAT_SITE);
bool stat_branch = !!(options & TSK_STAT_BRANCH);
tsk_size_t state_dim = num_sample_sets;
sample_count_stat_params_t f_params = { .sample_sets = sample_sets,
.num_sample_sets = num_sample_sets,
.sample_set_sizes = sample_set_sizes,
.set_indexes = set_indexes };

// We do not support two-locus node stats
if (!!(options & TSK_STAT_NODE)) {
Expand Down Expand Up @@ -3441,9 +3444,10 @@ tsk_treeseq_two_locus_count_stat(const tsk_treeseq_t *self, tsk_size_t num_sampl
goto out;
}
ret = tsk_treeseq_two_site_count_stat(self, state_dim, num_sample_sets,
sample_set_sizes, sample_sets, result_dim, f, &f_params, norm_f, out_rows,
sample_set_sizes, sample_sets, result_dim, f, f_params, norm_f, out_rows,
row_sites, out_cols, col_sites, options, result);
} else if (stat_branch) {
} else {
tsk_bug_assert(stat_branch);
ret = check_positions(
row_positions, out_rows, tsk_treeseq_get_sequence_length(self));
if (ret != 0) {
Expand All @@ -3455,13 +3459,31 @@ tsk_treeseq_two_locus_count_stat(const tsk_treeseq_t *self, tsk_size_t num_sampl
goto out;
}
ret = tsk_treeseq_two_branch_count_stat(self, state_dim, num_sample_sets,
sample_set_sizes, sample_sets, result_dim, f, &f_params, norm_f, out_rows,
sample_set_sizes, sample_sets, result_dim, f, f_params, norm_f, out_rows,
row_positions, out_cols, col_positions, options, result);
}
out:
return ret;
}

/* Wrapper of `tsk_treeseq_two_locus_general_count_stat` for C summary Functions */
static int
tsk_treeseq_two_locus_count_stat(const tsk_treeseq_t *self, tsk_size_t num_sample_sets,
const tsk_size_t *sample_set_sizes, const tsk_id_t *sample_sets,
tsk_size_t result_dim, const tsk_id_t *set_indexes, general_stat_func_t *f,
norm_func_t *norm_f, tsk_size_t out_rows, const tsk_id_t *row_sites,
const double *row_positions, tsk_size_t out_cols, const tsk_id_t *col_sites,
const double *col_positions, tsk_flags_t options, double *result)
{
sample_count_stat_params_t f_params = { .sample_sets = sample_sets,
.num_sample_sets = num_sample_sets,
.sample_set_sizes = sample_set_sizes,
.set_indexes = set_indexes };
return tsk_treeseq_two_locus_general_count_stat(self, num_sample_sets,
sample_set_sizes, sample_sets, result_dim, f, &f_params, norm_f, out_rows,
row_sites, row_positions, out_cols, col_sites, col_positions, options, result);
}

/***********************************
* Allele frequency spectrum
***********************************/
Expand Down
19 changes: 9 additions & 10 deletions c/tskit/trees.h
Original file line number Diff line number Diff line change
Expand Up @@ -1036,16 +1036,8 @@ int tsk_treeseq_general_stat(const tsk_treeseq_t *self, tsk_size_t K, const doub
tsk_size_t M, general_stat_func_t *f, void *f_params, tsk_size_t num_windows,
const double *windows, tsk_flags_t options, double *result);

typedef int norm_func_t(tsk_size_t result_dim, const double *hap_weights, tsk_size_t n_a,
tsk_size_t n_b, double *result, void *params);

int tsk_treeseq_two_locus_count_stat(const tsk_treeseq_t *self,
tsk_size_t num_sample_sets, const tsk_size_t *sample_set_sizes,
const tsk_id_t *sample_sets, tsk_size_t result_dim, const tsk_id_t *set_indexes,
general_stat_func_t *f, norm_func_t *norm_f, tsk_size_t out_rows,
const tsk_id_t *row_sites, const double *row_positions, tsk_size_t out_cols,
const tsk_id_t *col_sites, const double *col_positions, tsk_flags_t options,
double *result);
typedef int norm_func_t(tsk_size_t state_dim, const double *hap_weights,
tsk_size_t result_dim, tsk_size_t n_a, tsk_size_t n_b, double *result, void *params);

/* One way weighted stats */

Expand Down Expand Up @@ -1120,6 +1112,13 @@ typedef int general_sample_stat_method(const tsk_treeseq_t *self,
const tsk_id_t *sample_sets, tsk_size_t num_indexes, const tsk_id_t *indexes,
tsk_size_t num_windows, const double *windows, tsk_flags_t options, double *result);

int tsk_treeseq_two_locus_general_count_stat(const tsk_treeseq_t *self,
tsk_size_t num_sample_sets, const tsk_size_t *sample_set_sizes,
const tsk_id_t *sample_sets, tsk_size_t result_dim, general_stat_func_t *f,
void *f_params, norm_func_t *norm_f, tsk_size_t out_rows, const tsk_id_t *row_sites,
const double *row_positions, tsk_size_t out_cols, const tsk_id_t *col_sites,
const double *col_positions, tsk_flags_t options, double *result);

typedef int two_locus_count_stat_method(const tsk_treeseq_t *self,
tsk_size_t num_sample_sets, const tsk_size_t *sample_set_sizes,
const tsk_id_t *sample_sets, tsk_size_t num_rows, const tsk_id_t *row_sites,
Expand Down
Loading
Loading