### pyhegp --- Homomorphic encryption of genotypes and phenotypes ### Copyright © 2025 Arun Isaac ### ### This file is part of pyhegp. ### ### pyhegp is free software: you can redistribute it and/or modify it ### under the terms of the GNU General Public License as published by ### the Free Software Foundation, either version 3 of the License, or ### (at your option) any later version. ### ### pyhegp is distributed in the hope that it will be useful, but ### WITHOUT ANY WARRANTY; without even the implied warranty of ### MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ### General Public License for more details. ### ### You should have received a copy of the GNU General Public License ### along with pyhegp. If not, see . from hypothesis import given, settings, strategies as st from hypothesis.extra.numpy import arrays, array_shapes import numpy as np from pytest import approx from pyhegp.pyhegp import Stats, hegp_encrypt, hegp_decrypt, random_key, pool_stats @given(st.lists(st.lists(arrays("float64", st.shared(array_shapes(min_dims=1, max_dims=1), key="pool-vector-length"), elements=st.floats(min_value=-100, max_value=100)), min_size=2), min_size=1)) def test_pool_stats(pools): combined_pool = sum(pools, []) pooled_stats = pool_stats([Stats(len(pool), np.mean(pool, axis=0), np.std(pool, axis=0, ddof=1)) for pool in pools]) assert (pooled_stats.n == len(combined_pool) and pooled_stats.mean == approx(np.mean(combined_pool, axis=0)) and pooled_stats.std == approx(np.std(combined_pool, axis=0, ddof=1))) @given(st.one_of( arrays("int32", array_shapes(min_dims=2, max_dims=2), elements=st.integers(min_value=0, max_value=2)), # The array above is the only realistic input, but we test more # kinds of inputs for good measure. arrays("int32", array_shapes(min_dims=2, max_dims=2), elements=st.integers(min_value=0, max_value=100)), arrays("float64", array_shapes(min_dims=2, max_dims=2), elements=st.floats(min_value=0, max_value=100))) ) def test_hegp_encryption_decryption_are_inverses(plaintext): rng = np.random.default_rng() key = random_key(rng, len(plaintext)) # FIXME: We don't use maf at the moment. maf = None assert hegp_decrypt(hegp_encrypt(plaintext, maf, key), key) == approx(plaintext)