Skip to main content

Fast multithreaded implementation for calculating Fisher's exact test for any RxC sized table

Project description

Fisher RxC

Fast multithreaded implementation of calculating Fisher's exact test for any RxC size table. Written in Rust using Maturin.

Installation

pip install fisher-rxc
import fisher

Usage

fisher.exact(table, workspace=None)

Calculate Fisher's exact test for 2D list according to Mehta & Patel's Network Algorithm. If workspace size is not provided, it will be "guessed" dynamically.

Workspace size of 2e8 takes at most 800MB of RAM.

fisher.sim(table, iterations)

Calculate Fisher's exact test for 2D list by multithreaded Monte Carlo simulation. A modern CPU can quickly do 10^7 iterations and get accurate results.

fisher.recursive(table)

[!WARNING] This is experimental and may not work on every CPU platform and generation. Any feedback is appreciated

Calculate Fisher's exact test by a multithreaded SIMD recursive algorithm. Despite extensive optimization efforts, this is still generally much slower than the fisher.exact function. Only use for small tables with low numbers.

Return values

0 <= x <= 1: p-value

x < 0: error code number, message printed to stdout

Performance

See benchmark.py

AMD Ryzen 5600X running Linux Mint 21.3

-- EXACT TEST --
fisher-rxc      0.2631  in 21.11s
rpy2            0.2631  in 26.15s
-----------
fisher-rxc      0.9981  in 4.95s
rpy2            0.9981  in 6.96s
-----------
-- MONTE-CARLO SIMULATION --
fisher-rxc      0.2631  in 0.60s
rpy2            0.2630  in 16.10s
-----------
fisher-rxc      0.9981  in 0.62s
rpy2            0.9981  in 19.38s
-----------

References

Contingency table generator (ASA159): https://people.sc.fsu.edu/~jburkardt/c_src/asa159/asa159.html

Fisher' exact test - network algorithm (ASA643): https://netlib.org/toms/643.gz

Fisher's exact test - recursive: https://stackoverflow.com/questions/25368284/fishers-exact-test-for-bigger-than-2-by-2-contingency-table

Fortran to C transpiler: https://www.netlib.org/f2c/

C to Rust transpiler: https://github.com/immunant/c2rust

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

fisher_rxc-0.14.0.tar.gz (24.8 kB view hashes)

Uploaded Source

Built Distributions

fisher_rxc-0.14.0-pp310-pypy310_pp73-musllinux_1_2_x86_64.whl (480.0 kB view hashes)

Uploaded PyPy musllinux: musl 1.2+ x86-64

fisher_rxc-0.14.0-pp310-pypy310_pp73-musllinux_1_2_i686.whl (494.7 kB view hashes)

Uploaded PyPy musllinux: musl 1.2+ i686

fisher_rxc-0.14.0-pp310-pypy310_pp73-musllinux_1_2_armv7l.whl (570.0 kB view hashes)

Uploaded PyPy musllinux: musl 1.2+ ARMv7l

fisher_rxc-0.14.0-pp310-pypy310_pp73-musllinux_1_2_aarch64.whl (480.9 kB view hashes)

Uploaded PyPy musllinux: musl 1.2+ ARM64

fisher_rxc-0.14.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (307.6 kB view hashes)

Uploaded PyPy manylinux: glibc 2.17+ x86-64

fisher_rxc-0.14.0-pp310-pypy310_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl (430.3 kB view hashes)

Uploaded PyPy manylinux: glibc 2.17+ s390x

fisher_rxc-0.14.0-pp310-pypy310_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl (340.9 kB view hashes)

Uploaded PyPy manylinux: glibc 2.17+ ppc64le

fisher_rxc-0.14.0-pp310-pypy310_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl (307.0 kB view hashes)

Uploaded PyPy manylinux: glibc 2.17+ ARMv7l

fisher_rxc-0.14.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (302.1 kB view hashes)

Uploaded PyPy manylinux: glibc 2.17+ ARM64

fisher_rxc-0.14.0-pp310-pypy310_pp73-manylinux_2_12_i686.manylinux2010_i686.whl (317.0 kB view hashes)

Uploaded PyPy manylinux: glibc 2.12+ i686

fisher_rxc-0.14.0-pp39-pypy39_pp73-musllinux_1_2_x86_64.whl (480.3 kB view hashes)

Uploaded PyPy musllinux: musl 1.2+ x86-64

fisher_rxc-0.14.0-pp39-pypy39_pp73-musllinux_1_2_i686.whl (494.9 kB view hashes)

Uploaded PyPy musllinux: musl 1.2+ i686

fisher_rxc-0.14.0-pp39-pypy39_pp73-musllinux_1_2_armv7l.whl (570.2 kB view hashes)

Uploaded PyPy musllinux: musl 1.2+ ARMv7l

fisher_rxc-0.14.0-pp39-pypy39_pp73-musllinux_1_2_aarch64.whl (481.1 kB view hashes)

Uploaded PyPy musllinux: musl 1.2+ ARM64

fisher_rxc-0.14.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (307.9 kB view hashes)

Uploaded PyPy manylinux: glibc 2.17+ x86-64

fisher_rxc-0.14.0-pp39-pypy39_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl (430.9 kB view hashes)

Uploaded PyPy manylinux: glibc 2.17+ s390x

fisher_rxc-0.14.0-pp39-pypy39_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl (341.2 kB view hashes)

Uploaded PyPy manylinux: glibc 2.17+ ppc64le

fisher_rxc-0.14.0-pp39-pypy39_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl (307.4 kB view hashes)

Uploaded PyPy manylinux: glibc 2.17+ ARMv7l

fisher_rxc-0.14.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (302.4 kB view hashes)

Uploaded PyPy manylinux: glibc 2.17+ ARM64

fisher_rxc-0.14.0-pp39-pypy39_pp73-manylinux_2_12_i686.manylinux2010_i686.whl (317.2 kB view hashes)

Uploaded PyPy manylinux: glibc 2.12+ i686

fisher_rxc-0.14.0-pp38-pypy38_pp73-musllinux_1_2_x86_64.whl (480.3 kB view hashes)

Uploaded PyPy musllinux: musl 1.2+ x86-64

fisher_rxc-0.14.0-pp38-pypy38_pp73-musllinux_1_2_i686.whl (494.9 kB view hashes)

Uploaded PyPy musllinux: musl 1.2+ i686

fisher_rxc-0.14.0-pp38-pypy38_pp73-musllinux_1_2_armv7l.whl (570.2 kB view hashes)

Uploaded PyPy musllinux: musl 1.2+ ARMv7l

fisher_rxc-0.14.0-pp38-pypy38_pp73-musllinux_1_2_aarch64.whl (481.1 kB view hashes)

Uploaded PyPy musllinux: musl 1.2+ ARM64

fisher_rxc-0.14.0-pp38-pypy38_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl (430.9 kB view hashes)

Uploaded PyPy manylinux: glibc 2.17+ s390x

fisher_rxc-0.14.0-pp38-pypy38_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl (341.2 kB view hashes)

Uploaded PyPy manylinux: glibc 2.17+ ppc64le

fisher_rxc-0.14.0-pp38-pypy38_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl (307.4 kB view hashes)

Uploaded PyPy manylinux: glibc 2.17+ ARMv7l

fisher_rxc-0.14.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (302.3 kB view hashes)

Uploaded PyPy manylinux: glibc 2.17+ ARM64

fisher_rxc-0.14.0-cp312-none-win_amd64.whl (184.3 kB view hashes)

Uploaded CPython 3.12 Windows x86-64

fisher_rxc-0.14.0-cp312-none-win32.whl (163.7 kB view hashes)

Uploaded CPython 3.12 Windows x86

fisher_rxc-0.14.0-cp312-cp312-musllinux_1_2_x86_64.whl (479.1 kB view hashes)

Uploaded CPython 3.12 musllinux: musl 1.2+ x86-64

fisher_rxc-0.14.0-cp312-cp312-musllinux_1_2_i686.whl (494.0 kB view hashes)

Uploaded CPython 3.12 musllinux: musl 1.2+ i686

fisher_rxc-0.14.0-cp312-cp312-musllinux_1_2_armv7l.whl (569.1 kB view hashes)

Uploaded CPython 3.12 musllinux: musl 1.2+ ARMv7l

fisher_rxc-0.14.0-cp312-cp312-musllinux_1_2_aarch64.whl (479.9 kB view hashes)

Uploaded CPython 3.12 musllinux: musl 1.2+ ARM64

fisher_rxc-0.14.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (306.6 kB view hashes)

Uploaded CPython 3.12 manylinux: glibc 2.17+ x86-64

fisher_rxc-0.14.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl (426.0 kB view hashes)

Uploaded CPython 3.12 manylinux: glibc 2.17+ s390x

fisher_rxc-0.14.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl (340.0 kB view hashes)

Uploaded CPython 3.12 manylinux: glibc 2.17+ ppc64le

fisher_rxc-0.14.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl (306.2 kB view hashes)

Uploaded CPython 3.12 manylinux: glibc 2.17+ ARMv7l

fisher_rxc-0.14.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (301.1 kB view hashes)

Uploaded CPython 3.12 manylinux: glibc 2.17+ ARM64

fisher_rxc-0.14.0-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.whl (316.2 kB view hashes)

Uploaded CPython 3.12 manylinux: glibc 2.12+ i686

fisher_rxc-0.14.0-cp312-cp312-macosx_11_0_arm64.whl (267.0 kB view hashes)

Uploaded CPython 3.12 macOS 11.0+ ARM64

fisher_rxc-0.14.0-cp312-cp312-macosx_10_12_x86_64.whl (281.8 kB view hashes)

Uploaded CPython 3.12 macOS 10.12+ x86-64

fisher_rxc-0.14.0-cp311-none-win_amd64.whl (183.6 kB view hashes)

Uploaded CPython 3.11 Windows x86-64

fisher_rxc-0.14.0-cp311-none-win32.whl (163.1 kB view hashes)

Uploaded CPython 3.11 Windows x86

fisher_rxc-0.14.0-cp311-cp311-musllinux_1_2_x86_64.whl (479.3 kB view hashes)

Uploaded CPython 3.11 musllinux: musl 1.2+ x86-64

fisher_rxc-0.14.0-cp311-cp311-musllinux_1_2_i686.whl (494.1 kB view hashes)

Uploaded CPython 3.11 musllinux: musl 1.2+ i686

fisher_rxc-0.14.0-cp311-cp311-musllinux_1_2_armv7l.whl (569.5 kB view hashes)

Uploaded CPython 3.11 musllinux: musl 1.2+ ARMv7l

fisher_rxc-0.14.0-cp311-cp311-musllinux_1_2_aarch64.whl (480.3 kB view hashes)

Uploaded CPython 3.11 musllinux: musl 1.2+ ARM64

fisher_rxc-0.14.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (307.1 kB view hashes)

Uploaded CPython 3.11 manylinux: glibc 2.17+ x86-64

fisher_rxc-0.14.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl (429.2 kB view hashes)

Uploaded CPython 3.11 manylinux: glibc 2.17+ s390x

fisher_rxc-0.14.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl (340.2 kB view hashes)

Uploaded CPython 3.11 manylinux: glibc 2.17+ ppc64le

fisher_rxc-0.14.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl (306.6 kB view hashes)

Uploaded CPython 3.11 manylinux: glibc 2.17+ ARMv7l

fisher_rxc-0.14.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (301.6 kB view hashes)

Uploaded CPython 3.11 manylinux: glibc 2.17+ ARM64

fisher_rxc-0.14.0-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.whl (316.5 kB view hashes)

Uploaded CPython 3.11 manylinux: glibc 2.12+ i686

fisher_rxc-0.14.0-cp311-cp311-macosx_11_0_arm64.whl (267.4 kB view hashes)

Uploaded CPython 3.11 macOS 11.0+ ARM64

fisher_rxc-0.14.0-cp311-cp311-macosx_10_12_x86_64.whl (282.4 kB view hashes)

Uploaded CPython 3.11 macOS 10.12+ x86-64

fisher_rxc-0.14.0-cp310-none-win_amd64.whl (183.6 kB view hashes)

Uploaded CPython 3.10 Windows x86-64

fisher_rxc-0.14.0-cp310-none-win32.whl (163.1 kB view hashes)

Uploaded CPython 3.10 Windows x86

fisher_rxc-0.14.0-cp310-cp310-musllinux_1_2_x86_64.whl (479.5 kB view hashes)

Uploaded CPython 3.10 musllinux: musl 1.2+ x86-64

fisher_rxc-0.14.0-cp310-cp310-musllinux_1_2_i686.whl (494.3 kB view hashes)

Uploaded CPython 3.10 musllinux: musl 1.2+ i686

fisher_rxc-0.14.0-cp310-cp310-musllinux_1_2_armv7l.whl (569.6 kB view hashes)

Uploaded CPython 3.10 musllinux: musl 1.2+ ARMv7l

fisher_rxc-0.14.0-cp310-cp310-musllinux_1_2_aarch64.whl (480.4 kB view hashes)

Uploaded CPython 3.10 musllinux: musl 1.2+ ARM64

fisher_rxc-0.14.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (307.1 kB view hashes)

Uploaded CPython 3.10 manylinux: glibc 2.17+ x86-64

fisher_rxc-0.14.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl (429.6 kB view hashes)

Uploaded CPython 3.10 manylinux: glibc 2.17+ s390x

fisher_rxc-0.14.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl (340.1 kB view hashes)

Uploaded CPython 3.10 manylinux: glibc 2.17+ ppc64le

fisher_rxc-0.14.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl (306.7 kB view hashes)

Uploaded CPython 3.10 manylinux: glibc 2.17+ ARMv7l

fisher_rxc-0.14.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (301.7 kB view hashes)

Uploaded CPython 3.10 manylinux: glibc 2.17+ ARM64

fisher_rxc-0.14.0-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl (316.5 kB view hashes)

Uploaded CPython 3.10 manylinux: glibc 2.12+ i686

fisher_rxc-0.14.0-cp310-cp310-macosx_11_0_arm64.whl (267.6 kB view hashes)

Uploaded CPython 3.10 macOS 11.0+ ARM64

fisher_rxc-0.14.0-cp39-none-win_amd64.whl (183.8 kB view hashes)

Uploaded CPython 3.9 Windows x86-64

fisher_rxc-0.14.0-cp39-none-win32.whl (163.3 kB view hashes)

Uploaded CPython 3.9 Windows x86

fisher_rxc-0.14.0-cp39-cp39-musllinux_1_2_x86_64.whl (479.7 kB view hashes)

Uploaded CPython 3.9 musllinux: musl 1.2+ x86-64

fisher_rxc-0.14.0-cp39-cp39-musllinux_1_2_i686.whl (494.6 kB view hashes)

Uploaded CPython 3.9 musllinux: musl 1.2+ i686

fisher_rxc-0.14.0-cp39-cp39-musllinux_1_2_armv7l.whl (570.0 kB view hashes)

Uploaded CPython 3.9 musllinux: musl 1.2+ ARMv7l

fisher_rxc-0.14.0-cp39-cp39-musllinux_1_2_aarch64.whl (480.7 kB view hashes)

Uploaded CPython 3.9 musllinux: musl 1.2+ ARM64

fisher_rxc-0.14.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (307.4 kB view hashes)

Uploaded CPython 3.9 manylinux: glibc 2.17+ x86-64

fisher_rxc-0.14.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl (430.0 kB view hashes)

Uploaded CPython 3.9 manylinux: glibc 2.17+ s390x

fisher_rxc-0.14.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl (340.5 kB view hashes)

Uploaded CPython 3.9 manylinux: glibc 2.17+ ppc64le

fisher_rxc-0.14.0-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl (307.0 kB view hashes)

Uploaded CPython 3.9 manylinux: glibc 2.17+ ARMv7l

fisher_rxc-0.14.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (302.0 kB view hashes)

Uploaded CPython 3.9 manylinux: glibc 2.17+ ARM64

fisher_rxc-0.14.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl (316.7 kB view hashes)

Uploaded CPython 3.9 manylinux: glibc 2.12+ i686

fisher_rxc-0.14.0-cp39-cp39-macosx_11_0_arm64.whl (267.8 kB view hashes)

Uploaded CPython 3.9 macOS 11.0+ ARM64

fisher_rxc-0.14.0-cp38-none-win_amd64.whl (183.7 kB view hashes)

Uploaded CPython 3.8 Windows x86-64

fisher_rxc-0.14.0-cp38-none-win32.whl (163.1 kB view hashes)

Uploaded CPython 3.8 Windows x86

fisher_rxc-0.14.0-cp38-cp38-musllinux_1_2_x86_64.whl (479.6 kB view hashes)

Uploaded CPython 3.8 musllinux: musl 1.2+ x86-64

fisher_rxc-0.14.0-cp38-cp38-musllinux_1_2_i686.whl (494.4 kB view hashes)

Uploaded CPython 3.8 musllinux: musl 1.2+ i686

fisher_rxc-0.14.0-cp38-cp38-musllinux_1_2_armv7l.whl (569.6 kB view hashes)

Uploaded CPython 3.8 musllinux: musl 1.2+ ARMv7l

fisher_rxc-0.14.0-cp38-cp38-musllinux_1_2_aarch64.whl (480.5 kB view hashes)

Uploaded CPython 3.8 musllinux: musl 1.2+ ARM64

fisher_rxc-0.14.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (307.2 kB view hashes)

Uploaded CPython 3.8 manylinux: glibc 2.17+ x86-64

fisher_rxc-0.14.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl (429.7 kB view hashes)

Uploaded CPython 3.8 manylinux: glibc 2.17+ s390x

fisher_rxc-0.14.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl (340.3 kB view hashes)

Uploaded CPython 3.8 manylinux: glibc 2.17+ ppc64le

fisher_rxc-0.14.0-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl (306.7 kB view hashes)

Uploaded CPython 3.8 manylinux: glibc 2.17+ ARMv7l

fisher_rxc-0.14.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (301.7 kB view hashes)

Uploaded CPython 3.8 manylinux: glibc 2.17+ ARM64

fisher_rxc-0.14.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl (316.5 kB view hashes)

Uploaded CPython 3.8 manylinux: glibc 2.12+ i686

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page