From b06431a722fdd620a237e6f52456ffd31984c304 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Cl=C3=A9ment=20Elvira?= <clement.elvira@centralesupelec.fr>
Date: Thu, 10 Nov 2022 11:18:53 +0100
Subject: [PATCH] new namespace + missing information in setup.py

---
 experiments/SIAM/increasingball.py            |   2 +-
 experiments/SIAM/slopepb.py                   |   4 +-
 .../SIAM/xp_1_balls/xp_a_accuracy_sol.py      |  12 +-
 experiments/SIAM/xp_1_balls/xp_b_screening.py |  12 +-
 .../SIAM/xp_2_bench_time/get_algs_params.py   |   6 +-
 .../SIAM/xp_2_bench_time/xp_a_get_state.py    |   2 +-
 .../SIAM/xp_2_bench_time/xp_b_get_budget.py   |  12 +-
 .../SIAM/xp_2_bench_time/xp_c_results_time.py |  10 +-
 experiments/utils/increasingball.py           |   2 +-
 experiments/utils/slopepb.py                  |   4 +-
 requirements.txt                              |  19 +-
 setup.py                                      |  11 +-
 slopescreening/__init__.py                    |   3 +
 {src => slopescreening}/__version.py          |   0
 {src => slopescreening}/dictionaries.py       |   0
 {src => slopescreening}/screening/__init__.py |   0
 .../screening/ascreening.py                   |   0
 .../screening/gap_test_all.c                  | 851 +++++++++++-------
 .../screening/gap_test_all.pyx                |   2 +-
 .../screening/gap_test_p_1.c                  | 825 ++++++++++-------
 .../screening/gap_test_p_1.pyx                |   2 +-
 .../screening/gap_test_p_q.py                 |   2 +-
 {src => slopescreening}/screening/utils.c     | 748 +++++++++------
 {src => slopescreening}/screening/utils.pyx   |   0
 {src => slopescreening}/solver/parameters.py  |   2 +-
 {src => slopescreening}/solver/prox.py        |   0
 {src => slopescreening}/solver/slope.py       |   4 +-
 {src => slopescreening}/utils.py              |   0
 src/__init__.py                               |   3 -
 tests/test_solver.py                          |   8 +-
 tests/test_utils.py                           |   6 +-
 31 files changed, 1589 insertions(+), 963 deletions(-)
 create mode 100755 slopescreening/__init__.py
 rename {src => slopescreening}/__version.py (100%)
 rename {src => slopescreening}/dictionaries.py (100%)
 rename {src => slopescreening}/screening/__init__.py (100%)
 rename {src => slopescreening}/screening/ascreening.py (100%)
 rename {src => slopescreening}/screening/gap_test_all.c (90%)
 rename {src => slopescreening}/screening/gap_test_all.pyx (98%)
 rename {src => slopescreening}/screening/gap_test_p_1.c (89%)
 rename {src => slopescreening}/screening/gap_test_p_1.pyx (98%)
 rename {src => slopescreening}/screening/gap_test_p_q.py (95%)
 rename {src => slopescreening}/screening/utils.c (91%)
 rename {src => slopescreening}/screening/utils.pyx (100%)
 rename {src => slopescreening}/solver/parameters.py (94%)
 rename {src => slopescreening}/solver/prox.py (100%)
 rename {src => slopescreening}/solver/slope.py (98%)
 rename {src => slopescreening}/utils.py (100%)
 delete mode 100755 src/__init__.py

diff --git a/experiments/SIAM/increasingball.py b/experiments/SIAM/increasingball.py
index fdbc7d0..ba797c4 100644
--- a/experiments/SIAM/increasingball.py
+++ b/experiments/SIAM/increasingball.py
@@ -2,7 +2,7 @@ import time
 
 import numpy as np
 
-from src.utils import get_lambda_max
+from slopescreening.utils import get_lambda_max
 
 
 def test_increasing_ball(list_tests, vec_offsets, slopepb, vecx):
diff --git a/experiments/SIAM/slopepb.py b/experiments/SIAM/slopepb.py
index c301bd6..d902d87 100644
--- a/experiments/SIAM/slopepb.py
+++ b/experiments/SIAM/slopepb.py
@@ -1,7 +1,7 @@
 import numpy as np
 
-from src.solver.slope import primal_func, dual_func
-from src.utils import get_lambda_max
+from slopescreening.solver.slope import primal_func, dual_func
+from slopescreening.utils import get_lambda_max
 
 
 class SlopePb(object):
diff --git a/experiments/SIAM/xp_1_balls/xp_a_accuracy_sol.py b/experiments/SIAM/xp_1_balls/xp_a_accuracy_sol.py
index aba6721..1bbd67c 100755
--- a/experiments/SIAM/xp_1_balls/xp_a_accuracy_sol.py
+++ b/experiments/SIAM/xp_1_balls/xp_a_accuracy_sol.py
@@ -5,16 +5,16 @@ from pathlib import Path
 import numpy as np
 
 # Algorithm import
-from src import __version__
-from src.solver.parameters import SlopeParameters, EnumLipchitzOptions
-from src.solver.slope import primal_func, dual_func, slope_gp
+from slopescreening import __version__
+from slopescreening.solver.parameters import SlopeParameters, EnumLipchitzOptions
+from slopescreening.solver.slope import primal_func, dual_func, slope_gp
 
 # Generative models
-from src.utils import get_lambda_max, gamma_sequence_generator
-from src.dictionaries import generate_dic
+from slopescreening.utils import get_lambda_max, gamma_sequence_generator
+from slopescreening.dictionaries import generate_dic
 
 # Screening
-from src.screening.gap_test_all import GapTestAll
+from slopescreening.screening.gap_test_all import GapTestAll
 
 # XP import
 from experiments.SIAM.slopepb import SlopePb
diff --git a/experiments/SIAM/xp_1_balls/xp_b_screening.py b/experiments/SIAM/xp_1_balls/xp_b_screening.py
index 5d24334..574fa28 100644
--- a/experiments/SIAM/xp_1_balls/xp_b_screening.py
+++ b/experiments/SIAM/xp_1_balls/xp_b_screening.py
@@ -4,14 +4,14 @@ import argparse
 import numpy as np
 
 # Algorithm import
-from src import __version__
-from src.dictionaries import generate_dic
-from src.utils import get_lambda_max, gamma_sequence_generator
+from slopescreening import __version__
+from slopescreening.dictionaries import generate_dic
+from slopescreening.utils import get_lambda_max, gamma_sequence_generator
 
 # Screening
-from src.screening.gap_test_p_1 import GapTestPequalOne
-from src.screening.gap_test_p_q import GapTestPequalQ
-from src.screening.gap_test_all import GapTestAll
+from slopescreening.screening.gap_test_p_1 import GapTestPequalOne
+from slopescreening.screening.gap_test_p_q import GapTestPequalQ
+from slopescreening.screening.gap_test_all import GapTestAll
 
 # XP import
 from experiments.SIAM.slopepb import SlopePb
diff --git a/experiments/SIAM/xp_2_bench_time/get_algs_params.py b/experiments/SIAM/xp_2_bench_time/get_algs_params.py
index 1602fbd..028fb9c 100644
--- a/experiments/SIAM/xp_2_bench_time/get_algs_params.py
+++ b/experiments/SIAM/xp_2_bench_time/get_algs_params.py
@@ -1,9 +1,9 @@
 import numpy as np
 
-from src.solver.parameters import SlopeParameters, EnumLipchitzOptions, DualScalingOptions
+from slopescreening.solver.parameters import SlopeParameters, EnumLipchitzOptions, DualScalingOptions
 
-from src.screening.gap_test_p_q import GapTestPequalQ
-from src.screening.gap_test_all import GapTestAll
+from slopescreening.screening.gap_test_p_q import GapTestPequalQ
+from slopescreening.screening.gap_test_all import GapTestAll
 
 
 nb_algs = 4
diff --git a/experiments/SIAM/xp_2_bench_time/xp_a_get_state.py b/experiments/SIAM/xp_2_bench_time/xp_a_get_state.py
index e037bf5..9fd3f09 100644
--- a/experiments/SIAM/xp_2_bench_time/xp_a_get_state.py
+++ b/experiments/SIAM/xp_2_bench_time/xp_a_get_state.py
@@ -3,7 +3,7 @@ import argparse, sys
 from pathlib import Path
 import numpy as np
 
-from src import __version__
+from slopescreening import __version__
 
 from experiments.SIAM.setup import Setup
 from get_algs_params import get_alg_params, get_nb_algs
diff --git a/experiments/SIAM/xp_2_bench_time/xp_b_get_budget.py b/experiments/SIAM/xp_2_bench_time/xp_b_get_budget.py
index 4207b54..8fa0f86 100755
--- a/experiments/SIAM/xp_2_bench_time/xp_b_get_budget.py
+++ b/experiments/SIAM/xp_2_bench_time/xp_b_get_budget.py
@@ -3,13 +3,13 @@ import argparse, sys
 
 import numpy as np
 
-from src import __version__
-from src.solver.slope import slope_gp
-from src.utils import get_lambda_max, gamma_sequence_generator
-from src.dictionaries import generate_dic
+from slopescreening import __version__
+from slopescreening.solver.slope import slope_gp
+from slopescreening.utils import get_lambda_max, gamma_sequence_generator
+from slopescreening.dictionaries import generate_dic
 
-from src.solver.parameters import SlopeParameters, EnumLipchitzOptions
-from src.screening.gap_test_all import GapTestAll
+from slopescreening.solver.parameters import SlopeParameters, EnumLipchitzOptions
+from slopescreening.screening.gap_test_all import GapTestAll
 
 from experiments.SIAM.setup import Setup
 
diff --git a/experiments/SIAM/xp_2_bench_time/xp_c_results_time.py b/experiments/SIAM/xp_2_bench_time/xp_c_results_time.py
index 8921d7a..1c58aca 100644
--- a/experiments/SIAM/xp_2_bench_time/xp_c_results_time.py
+++ b/experiments/SIAM/xp_2_bench_time/xp_c_results_time.py
@@ -3,11 +3,11 @@ import argparse, sys
 
 import numpy as np
 
-from src import __version__
-from src.solver.slope import slope_gp
-from src.solver.parameters import SlopeParameters, EnumLipchitzOptions
-from src.utils import get_lambda_max, gamma_sequence_generator
-from src.dictionaries import generate_dic
+from slopescreening import __version__
+from slopescreening.solver.slope import slope_gp
+from slopescreening.solver.parameters import SlopeParameters, EnumLipchitzOptions
+from slopescreening.utils import get_lambda_max, gamma_sequence_generator
+from slopescreening.dictionaries import generate_dic
 
 from experiments.SIAM.setup import Setup
 from experiments.SIAM.slopepb import SlopePb
diff --git a/experiments/utils/increasingball.py b/experiments/utils/increasingball.py
index fdbc7d0..ba797c4 100644
--- a/experiments/utils/increasingball.py
+++ b/experiments/utils/increasingball.py
@@ -2,7 +2,7 @@ import time
 
 import numpy as np
 
-from src.utils import get_lambda_max
+from slopescreening.utils import get_lambda_max
 
 
 def test_increasing_ball(list_tests, vec_offsets, slopepb, vecx):
diff --git a/experiments/utils/slopepb.py b/experiments/utils/slopepb.py
index 55f6562..ff3de6a 100644
--- a/experiments/utils/slopepb.py
+++ b/experiments/utils/slopepb.py
@@ -1,7 +1,7 @@
 import numpy as np
 
-from src.slope import primal_func, dual_func
-from src.utils import get_lambda_max
+from slopescreening.slope import primal_func, dual_func
+from slopescreening.utils import get_lambda_max
 
 
 class SlopePb(object):
diff --git a/requirements.txt b/requirements.txt
index e29e904..900f6ea 100755
--- a/requirements.txt
+++ b/requirements.txt
@@ -1,16 +1,7 @@
-coverage==5.5
-cycler==0.10.0
-Cython==0.29.24
-joblib==1.0.1
-kiwisolver==1.3.2
-matplotlib==3.4.3
-numpy==1.21.2
-Pillow==8.3.2
-pybind11==2.7.1
+numpy>=1.21.2
+scipy>=1.7.1
+matplotlib>=3.4.3
+Cython>=0.29.24
 pyparsing==2.4.7
 python-dateutil==2.8.2
-scikit-learn==0.24.2
-scipy==1.7.1
-six==1.16.0
-sklearn==0.0
-threadpoolctl==2.2.0
+scikit-learn>=0.24.2
diff --git a/setup.py b/setup.py
index 1e4fe3a..64551fc 100755
--- a/setup.py
+++ b/setup.py
@@ -2,8 +2,9 @@
 from setuptools import setup, find_packages
 from Cython.Build import cythonize
 
+import numpy as np
 
-from src import __version__
+from slopescreening import __version__
 
 with open('README.md') as f:
     readme = f.read()
@@ -22,9 +23,9 @@ setup(
     license=license,
     packages=find_packages(exclude=('tests', 'docs')),
     ext_modules=cythonize([
-        "src/screening/utils.pyx", 
-        "src/screening/gap_test_all.pyx",
-        "src/screening/gap_test_p_1.pyx",
+        "slopescreening/screening/utils.pyx", 
+        "slopescreening/screening/gap_test_all.pyx",
+        "slopescreening/screening/gap_test_p_1.pyx",
     ]),
+    include_dirs=[np.get_include()],
 )
-
diff --git a/slopescreening/__init__.py b/slopescreening/__init__.py
new file mode 100755
index 0000000..dd651f8
--- /dev/null
+++ b/slopescreening/__init__.py
@@ -0,0 +1,3 @@
+# -*- coding: utf-8 -*-
+
+from slopescreening.__version import __version__
\ No newline at end of file
diff --git a/src/__version.py b/slopescreening/__version.py
similarity index 100%
rename from src/__version.py
rename to slopescreening/__version.py
diff --git a/src/dictionaries.py b/slopescreening/dictionaries.py
similarity index 100%
rename from src/dictionaries.py
rename to slopescreening/dictionaries.py
diff --git a/src/screening/__init__.py b/slopescreening/screening/__init__.py
similarity index 100%
rename from src/screening/__init__.py
rename to slopescreening/screening/__init__.py
diff --git a/src/screening/ascreening.py b/slopescreening/screening/ascreening.py
similarity index 100%
rename from src/screening/ascreening.py
rename to slopescreening/screening/ascreening.py
diff --git a/src/screening/gap_test_all.c b/slopescreening/screening/gap_test_all.c
similarity index 90%
rename from src/screening/gap_test_all.c
rename to slopescreening/screening/gap_test_all.c
index df03365..f883f34 100644
--- a/src/screening/gap_test_all.c
+++ b/slopescreening/screening/gap_test_all.c
@@ -1,15 +1,15 @@
-/* Generated by Cython 0.29.24 */
+/* Generated by Cython 0.29.32 */
 
 /* BEGIN: Cython Metadata
 {
     "distutils": {
         "depends": [],
-        "name": "src.screening.gap_test_all",
+        "name": "slopescreening.screening.gap_test_all",
         "sources": [
-            "src/screening/gap_test_all.pyx"
+            "slopescreening/screening/gap_test_all.pyx"
         ]
     },
-    "module_name": "src.screening.gap_test_all"
+    "module_name": "slopescreening.screening.gap_test_all"
 }
 END: Cython Metadata */
 
@@ -22,8 +22,8 @@ END: Cython Metadata */
 #elif PY_VERSION_HEX < 0x02060000 || (0x03000000 <= PY_VERSION_HEX && PY_VERSION_HEX < 0x03030000)
     #error Cython requires Python 2.6+ or Python 3.3+.
 #else
-#define CYTHON_ABI "0_29_24"
-#define CYTHON_HEX_VERSION 0x001D18F0
+#define CYTHON_ABI "0_29_32"
+#define CYTHON_HEX_VERSION 0x001D20F0
 #define CYTHON_FUTURE_DIVISION 0
 #include <stddef.h>
 #ifndef offsetof
@@ -62,6 +62,7 @@ END: Cython Metadata */
   #define CYTHON_COMPILING_IN_PYPY 1
   #define CYTHON_COMPILING_IN_PYSTON 0
   #define CYTHON_COMPILING_IN_CPYTHON 0
+  #define CYTHON_COMPILING_IN_NOGIL 0
   #undef CYTHON_USE_TYPE_SLOTS
   #define CYTHON_USE_TYPE_SLOTS 0
   #undef CYTHON_USE_PYTYPE_LOOKUP
@@ -98,10 +99,14 @@ END: Cython Metadata */
   #define CYTHON_USE_DICT_VERSIONS 0
   #undef CYTHON_USE_EXC_INFO_STACK
   #define CYTHON_USE_EXC_INFO_STACK 0
+  #ifndef CYTHON_UPDATE_DESCRIPTOR_DOC
+    #define CYTHON_UPDATE_DESCRIPTOR_DOC (PYPY_VERSION_HEX >= 0x07030900)
+  #endif
 #elif defined(PYSTON_VERSION)
   #define CYTHON_COMPILING_IN_PYPY 0
   #define CYTHON_COMPILING_IN_PYSTON 1
   #define CYTHON_COMPILING_IN_CPYTHON 0
+  #define CYTHON_COMPILING_IN_NOGIL 0
   #ifndef CYTHON_USE_TYPE_SLOTS
     #define CYTHON_USE_TYPE_SLOTS 1
   #endif
@@ -139,10 +144,59 @@ END: Cython Metadata */
   #define CYTHON_USE_DICT_VERSIONS 0
   #undef CYTHON_USE_EXC_INFO_STACK
   #define CYTHON_USE_EXC_INFO_STACK 0
+  #ifndef CYTHON_UPDATE_DESCRIPTOR_DOC
+    #define CYTHON_UPDATE_DESCRIPTOR_DOC 0
+  #endif
+#elif defined(PY_NOGIL)
+  #define CYTHON_COMPILING_IN_PYPY 0
+  #define CYTHON_COMPILING_IN_PYSTON 0
+  #define CYTHON_COMPILING_IN_CPYTHON 0
+  #define CYTHON_COMPILING_IN_NOGIL 1
+  #ifndef CYTHON_USE_TYPE_SLOTS
+    #define CYTHON_USE_TYPE_SLOTS 1
+  #endif
+  #undef CYTHON_USE_PYTYPE_LOOKUP
+  #define CYTHON_USE_PYTYPE_LOOKUP 0
+  #ifndef CYTHON_USE_ASYNC_SLOTS
+    #define CYTHON_USE_ASYNC_SLOTS 1
+  #endif
+  #undef CYTHON_USE_PYLIST_INTERNALS
+  #define CYTHON_USE_PYLIST_INTERNALS 0
+  #ifndef CYTHON_USE_UNICODE_INTERNALS
+    #define CYTHON_USE_UNICODE_INTERNALS 1
+  #endif
+  #undef CYTHON_USE_UNICODE_WRITER
+  #define CYTHON_USE_UNICODE_WRITER 0
+  #undef CYTHON_USE_PYLONG_INTERNALS
+  #define CYTHON_USE_PYLONG_INTERNALS 0
+  #ifndef CYTHON_AVOID_BORROWED_REFS
+    #define CYTHON_AVOID_BORROWED_REFS 0
+  #endif
+  #ifndef CYTHON_ASSUME_SAFE_MACROS
+    #define CYTHON_ASSUME_SAFE_MACROS 1
+  #endif
+  #ifndef CYTHON_UNPACK_METHODS
+    #define CYTHON_UNPACK_METHODS 1
+  #endif
+  #undef CYTHON_FAST_THREAD_STATE
+  #define CYTHON_FAST_THREAD_STATE 0
+  #undef CYTHON_FAST_PYCALL
+  #define CYTHON_FAST_PYCALL 0
+  #ifndef CYTHON_PEP489_MULTI_PHASE_INIT
+    #define CYTHON_PEP489_MULTI_PHASE_INIT 1
+  #endif
+  #ifndef CYTHON_USE_TP_FINALIZE
+    #define CYTHON_USE_TP_FINALIZE 1
+  #endif
+  #undef CYTHON_USE_DICT_VERSIONS
+  #define CYTHON_USE_DICT_VERSIONS 0
+  #undef CYTHON_USE_EXC_INFO_STACK
+  #define CYTHON_USE_EXC_INFO_STACK 0
 #else
   #define CYTHON_COMPILING_IN_PYPY 0
   #define CYTHON_COMPILING_IN_PYSTON 0
   #define CYTHON_COMPILING_IN_CPYTHON 1
+  #define CYTHON_COMPILING_IN_NOGIL 0
   #ifndef CYTHON_USE_TYPE_SLOTS
     #define CYTHON_USE_TYPE_SLOTS 1
   #endif
@@ -170,7 +224,7 @@ END: Cython Metadata */
   #ifndef CYTHON_USE_UNICODE_INTERNALS
     #define CYTHON_USE_UNICODE_INTERNALS 1
   #endif
-  #if PY_VERSION_HEX < 0x030300F0
+  #if PY_VERSION_HEX < 0x030300F0 || PY_VERSION_HEX >= 0x030B00A2
     #undef CYTHON_USE_UNICODE_WRITER
     #define CYTHON_USE_UNICODE_WRITER 0
   #elif !defined(CYTHON_USE_UNICODE_WRITER)
@@ -185,11 +239,14 @@ END: Cython Metadata */
   #ifndef CYTHON_UNPACK_METHODS
     #define CYTHON_UNPACK_METHODS 1
   #endif
-  #ifndef CYTHON_FAST_THREAD_STATE
+  #if PY_VERSION_HEX >= 0x030B00A4
+    #undef CYTHON_FAST_THREAD_STATE
+    #define CYTHON_FAST_THREAD_STATE 0
+  #elif !defined(CYTHON_FAST_THREAD_STATE)
     #define CYTHON_FAST_THREAD_STATE 1
   #endif
   #ifndef CYTHON_FAST_PYCALL
-    #define CYTHON_FAST_PYCALL 1
+    #define CYTHON_FAST_PYCALL (PY_VERSION_HEX < 0x030A0000)
   #endif
   #ifndef CYTHON_PEP489_MULTI_PHASE_INIT
     #define CYTHON_PEP489_MULTI_PHASE_INIT (PY_VERSION_HEX >= 0x03050000)
@@ -200,15 +257,23 @@ END: Cython Metadata */
   #ifndef CYTHON_USE_DICT_VERSIONS
     #define CYTHON_USE_DICT_VERSIONS (PY_VERSION_HEX >= 0x030600B1)
   #endif
-  #ifndef CYTHON_USE_EXC_INFO_STACK
+  #if PY_VERSION_HEX >= 0x030B00A4
+    #undef CYTHON_USE_EXC_INFO_STACK
+    #define CYTHON_USE_EXC_INFO_STACK 0
+  #elif !defined(CYTHON_USE_EXC_INFO_STACK)
     #define CYTHON_USE_EXC_INFO_STACK (PY_VERSION_HEX >= 0x030700A3)
   #endif
+  #ifndef CYTHON_UPDATE_DESCRIPTOR_DOC
+    #define CYTHON_UPDATE_DESCRIPTOR_DOC 1
+  #endif
 #endif
 #if !defined(CYTHON_FAST_PYCCALL)
 #define CYTHON_FAST_PYCCALL  (CYTHON_FAST_PYCALL && PY_VERSION_HEX >= 0x030600B1)
 #endif
 #if CYTHON_USE_PYLONG_INTERNALS
-  #include "longintrepr.h"
+  #if PY_MAJOR_VERSION < 3
+    #include "longintrepr.h"
+  #endif
   #undef SHIFT
   #undef BASE
   #undef MASK
@@ -325,9 +390,68 @@ END: Cython Metadata */
   #define __Pyx_DefaultClassType PyClass_Type
 #else
   #define __Pyx_BUILTIN_MODULE_NAME "builtins"
-#if PY_VERSION_HEX >= 0x030800A4 && PY_VERSION_HEX < 0x030800B2
-  #define __Pyx_PyCode_New(a, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos)\
-          PyCode_New(a, 0, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos)
+  #define __Pyx_DefaultClassType PyType_Type
+#if PY_VERSION_HEX >= 0x030B00A1
+    static CYTHON_INLINE PyCodeObject* __Pyx_PyCode_New(int a, int k, int l, int s, int f,
+                                                    PyObject *code, PyObject *c, PyObject* n, PyObject *v,
+                                                    PyObject *fv, PyObject *cell, PyObject* fn,
+                                                    PyObject *name, int fline, PyObject *lnos) {
+        PyObject *kwds=NULL, *argcount=NULL, *posonlyargcount=NULL, *kwonlyargcount=NULL;
+        PyObject *nlocals=NULL, *stacksize=NULL, *flags=NULL, *replace=NULL, *call_result=NULL, *empty=NULL;
+        const char *fn_cstr=NULL;
+        const char *name_cstr=NULL;
+        PyCodeObject* co=NULL;
+        PyObject *type, *value, *traceback;
+        PyErr_Fetch(&type, &value, &traceback);
+        if (!(kwds=PyDict_New())) goto end;
+        if (!(argcount=PyLong_FromLong(a))) goto end;
+        if (PyDict_SetItemString(kwds, "co_argcount", argcount) != 0) goto end;
+        if (!(posonlyargcount=PyLong_FromLong(0))) goto end;
+        if (PyDict_SetItemString(kwds, "co_posonlyargcount", posonlyargcount) != 0) goto end;
+        if (!(kwonlyargcount=PyLong_FromLong(k))) goto end;
+        if (PyDict_SetItemString(kwds, "co_kwonlyargcount", kwonlyargcount) != 0) goto end;
+        if (!(nlocals=PyLong_FromLong(l))) goto end;
+        if (PyDict_SetItemString(kwds, "co_nlocals", nlocals) != 0) goto end;
+        if (!(stacksize=PyLong_FromLong(s))) goto end;
+        if (PyDict_SetItemString(kwds, "co_stacksize", stacksize) != 0) goto end;
+        if (!(flags=PyLong_FromLong(f))) goto end;
+        if (PyDict_SetItemString(kwds, "co_flags", flags) != 0) goto end;
+        if (PyDict_SetItemString(kwds, "co_code", code) != 0) goto end;
+        if (PyDict_SetItemString(kwds, "co_consts", c) != 0) goto end;
+        if (PyDict_SetItemString(kwds, "co_names", n) != 0) goto end;
+        if (PyDict_SetItemString(kwds, "co_varnames", v) != 0) goto end;
+        if (PyDict_SetItemString(kwds, "co_freevars", fv) != 0) goto end;
+        if (PyDict_SetItemString(kwds, "co_cellvars", cell) != 0) goto end;
+        if (PyDict_SetItemString(kwds, "co_linetable", lnos) != 0) goto end;
+        if (!(fn_cstr=PyUnicode_AsUTF8AndSize(fn, NULL))) goto end;
+        if (!(name_cstr=PyUnicode_AsUTF8AndSize(name, NULL))) goto end;
+        if (!(co = PyCode_NewEmpty(fn_cstr, name_cstr, fline))) goto end;
+        if (!(replace = PyObject_GetAttrString((PyObject*)co, "replace"))) goto cleanup_code_too;
+        if (!(empty = PyTuple_New(0))) goto cleanup_code_too; // unfortunately __pyx_empty_tuple isn't available here
+        if (!(call_result = PyObject_Call(replace, empty, kwds))) goto cleanup_code_too;
+        Py_XDECREF((PyObject*)co);
+        co = (PyCodeObject*)call_result;
+        call_result = NULL;
+        if (0) {
+            cleanup_code_too:
+            Py_XDECREF((PyObject*)co);
+            co = NULL;
+        }
+        end:
+        Py_XDECREF(kwds);
+        Py_XDECREF(argcount);
+        Py_XDECREF(posonlyargcount);
+        Py_XDECREF(kwonlyargcount);
+        Py_XDECREF(nlocals);
+        Py_XDECREF(stacksize);
+        Py_XDECREF(replace);
+        Py_XDECREF(call_result);
+        Py_XDECREF(empty);
+        if (type) {
+            PyErr_Restore(type, value, traceback);
+        }
+        return co;
+    }
 #else
   #define __Pyx_PyCode_New(a, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos)\
           PyCode_New(a, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos)
@@ -565,10 +689,10 @@ static CYTHON_INLINE void * PyThread_tss_get(Py_tss_t *key) {
 #if PY_VERSION_HEX < 0x030200A4
   typedef long Py_hash_t;
   #define __Pyx_PyInt_FromHash_t PyInt_FromLong
-  #define __Pyx_PyInt_AsHash_t   PyInt_AsLong
+  #define __Pyx_PyInt_AsHash_t   __Pyx_PyIndex_AsHash_t
 #else
   #define __Pyx_PyInt_FromHash_t PyInt_FromSsize_t
-  #define __Pyx_PyInt_AsHash_t   PyInt_AsSsize_t
+  #define __Pyx_PyInt_AsHash_t   __Pyx_PyIndex_AsSsize_t
 #endif
 #if PY_MAJOR_VERSION >= 3
   #define __Pyx_PyMethod_New(func, self, klass) ((self) ? ((void)(klass), PyMethod_New(func, self)) : __Pyx_NewRef(func))
@@ -593,8 +717,10 @@ static CYTHON_INLINE void * PyThread_tss_get(Py_tss_t *key) {
     } __Pyx_PyAsyncMethodsStruct;
 #endif
 
-#if defined(WIN32) || defined(MS_WINDOWS)
-  #define _USE_MATH_DEFINES
+#if defined(_WIN32) || defined(WIN32) || defined(MS_WINDOWS)
+  #if !defined(_USE_MATH_DEFINES)
+    #define _USE_MATH_DEFINES
+  #endif
 #endif
 #include <math.h>
 #ifdef NAN
@@ -625,8 +751,8 @@ static CYTHON_INLINE float __PYX_NAN() {
   #endif
 #endif
 
-#define __PYX_HAVE__src__screening__gap_test_all
-#define __PYX_HAVE_API__src__screening__gap_test_all
+#define __PYX_HAVE__slopescreening__screening__gap_test_all
+#define __PYX_HAVE_API__slopescreening__screening__gap_test_all
 /* Early includes */
 #include <string.h>
 #include <stdio.h>
@@ -734,6 +860,7 @@ static CYTHON_INLINE PyObject* __Pyx_PyNumber_IntOrLong(PyObject* x);
     (likely(PyTuple_CheckExact(obj)) ? __Pyx_NewRef(obj) : PySequence_Tuple(obj))
 static CYTHON_INLINE Py_ssize_t __Pyx_PyIndex_AsSsize_t(PyObject*);
 static CYTHON_INLINE PyObject * __Pyx_PyInt_FromSize_t(size_t);
+static CYTHON_INLINE Py_hash_t __Pyx_PyIndex_AsHash_t(PyObject*);
 #if CYTHON_ASSUME_SAFE_MACROS
 #define __pyx_PyFloat_AsDouble(x) (PyFloat_CheckExact(x) ? PyFloat_AS_DOUBLE(x) : PyFloat_AsDouble(x))
 #else
@@ -868,10 +995,10 @@ static const char *__pyx_filename;
 
 
 static const char *__pyx_f[] = {
-  "src/screening/gap_test_all.pyx",
+  "slopescreening/screening/gap_test_all.pyx",
   "stringsource",
-  "venv/lib/python3.8/site-packages/numpy/__init__.pxd",
-  "venv/lib/python3.8/site-packages/Cython/Includes/cpython/type.pxd",
+  "venv/lib/python3.10/site-packages/numpy/__init__.pxd",
+  "venv/lib/python3.10/site-packages/Cython/Includes/cpython/type.pxd",
 };
 /* BufferFormatStructs.proto */
 #define IS_UNSIGNED(type) (((type) -1) > 0)
@@ -910,7 +1037,7 @@ typedef struct {
 } __Pyx_BufFmt_Context;
 
 
-/* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":690
+/* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":689
  * # in Cython to enable them only on the right systems.
  * 
  * ctypedef npy_int8       int8_t             # <<<<<<<<<<<<<<
@@ -919,7 +1046,7 @@ typedef struct {
  */
 typedef npy_int8 __pyx_t_5numpy_int8_t;
 
-/* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":691
+/* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":690
  * 
  * ctypedef npy_int8       int8_t
  * ctypedef npy_int16      int16_t             # <<<<<<<<<<<<<<
@@ -928,7 +1055,7 @@ typedef npy_int8 __pyx_t_5numpy_int8_t;
  */
 typedef npy_int16 __pyx_t_5numpy_int16_t;
 
-/* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":692
+/* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":691
  * ctypedef npy_int8       int8_t
  * ctypedef npy_int16      int16_t
  * ctypedef npy_int32      int32_t             # <<<<<<<<<<<<<<
@@ -937,7 +1064,7 @@ typedef npy_int16 __pyx_t_5numpy_int16_t;
  */
 typedef npy_int32 __pyx_t_5numpy_int32_t;
 
-/* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":693
+/* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":692
  * ctypedef npy_int16      int16_t
  * ctypedef npy_int32      int32_t
  * ctypedef npy_int64      int64_t             # <<<<<<<<<<<<<<
@@ -946,7 +1073,7 @@ typedef npy_int32 __pyx_t_5numpy_int32_t;
  */
 typedef npy_int64 __pyx_t_5numpy_int64_t;
 
-/* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":697
+/* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":696
  * #ctypedef npy_int128     int128_t
  * 
  * ctypedef npy_uint8      uint8_t             # <<<<<<<<<<<<<<
@@ -955,7 +1082,7 @@ typedef npy_int64 __pyx_t_5numpy_int64_t;
  */
 typedef npy_uint8 __pyx_t_5numpy_uint8_t;
 
-/* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":698
+/* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":697
  * 
  * ctypedef npy_uint8      uint8_t
  * ctypedef npy_uint16     uint16_t             # <<<<<<<<<<<<<<
@@ -964,7 +1091,7 @@ typedef npy_uint8 __pyx_t_5numpy_uint8_t;
  */
 typedef npy_uint16 __pyx_t_5numpy_uint16_t;
 
-/* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":699
+/* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":698
  * ctypedef npy_uint8      uint8_t
  * ctypedef npy_uint16     uint16_t
  * ctypedef npy_uint32     uint32_t             # <<<<<<<<<<<<<<
@@ -973,7 +1100,7 @@ typedef npy_uint16 __pyx_t_5numpy_uint16_t;
  */
 typedef npy_uint32 __pyx_t_5numpy_uint32_t;
 
-/* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":700
+/* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":699
  * ctypedef npy_uint16     uint16_t
  * ctypedef npy_uint32     uint32_t
  * ctypedef npy_uint64     uint64_t             # <<<<<<<<<<<<<<
@@ -982,7 +1109,7 @@ typedef npy_uint32 __pyx_t_5numpy_uint32_t;
  */
 typedef npy_uint64 __pyx_t_5numpy_uint64_t;
 
-/* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":704
+/* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":703
  * #ctypedef npy_uint128    uint128_t
  * 
  * ctypedef npy_float32    float32_t             # <<<<<<<<<<<<<<
@@ -991,7 +1118,7 @@ typedef npy_uint64 __pyx_t_5numpy_uint64_t;
  */
 typedef npy_float32 __pyx_t_5numpy_float32_t;
 
-/* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":705
+/* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":704
  * 
  * ctypedef npy_float32    float32_t
  * ctypedef npy_float64    float64_t             # <<<<<<<<<<<<<<
@@ -1000,7 +1127,7 @@ typedef npy_float32 __pyx_t_5numpy_float32_t;
  */
 typedef npy_float64 __pyx_t_5numpy_float64_t;
 
-/* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":714
+/* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":713
  * # The int types are mapped a bit surprising --
  * # numpy.int corresponds to 'l' and numpy.long to 'q'
  * ctypedef npy_long       int_t             # <<<<<<<<<<<<<<
@@ -1009,7 +1136,7 @@ typedef npy_float64 __pyx_t_5numpy_float64_t;
  */
 typedef npy_long __pyx_t_5numpy_int_t;
 
-/* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":715
+/* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":714
  * # numpy.int corresponds to 'l' and numpy.long to 'q'
  * ctypedef npy_long       int_t
  * ctypedef npy_longlong   long_t             # <<<<<<<<<<<<<<
@@ -1018,7 +1145,7 @@ typedef npy_long __pyx_t_5numpy_int_t;
  */
 typedef npy_longlong __pyx_t_5numpy_long_t;
 
-/* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":716
+/* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":715
  * ctypedef npy_long       int_t
  * ctypedef npy_longlong   long_t
  * ctypedef npy_longlong   longlong_t             # <<<<<<<<<<<<<<
@@ -1027,7 +1154,7 @@ typedef npy_longlong __pyx_t_5numpy_long_t;
  */
 typedef npy_longlong __pyx_t_5numpy_longlong_t;
 
-/* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":718
+/* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":717
  * ctypedef npy_longlong   longlong_t
  * 
  * ctypedef npy_ulong      uint_t             # <<<<<<<<<<<<<<
@@ -1036,7 +1163,7 @@ typedef npy_longlong __pyx_t_5numpy_longlong_t;
  */
 typedef npy_ulong __pyx_t_5numpy_uint_t;
 
-/* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":719
+/* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":718
  * 
  * ctypedef npy_ulong      uint_t
  * ctypedef npy_ulonglong  ulong_t             # <<<<<<<<<<<<<<
@@ -1045,7 +1172,7 @@ typedef npy_ulong __pyx_t_5numpy_uint_t;
  */
 typedef npy_ulonglong __pyx_t_5numpy_ulong_t;
 
-/* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":720
+/* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":719
  * ctypedef npy_ulong      uint_t
  * ctypedef npy_ulonglong  ulong_t
  * ctypedef npy_ulonglong  ulonglong_t             # <<<<<<<<<<<<<<
@@ -1054,7 +1181,7 @@ typedef npy_ulonglong __pyx_t_5numpy_ulong_t;
  */
 typedef npy_ulonglong __pyx_t_5numpy_ulonglong_t;
 
-/* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":722
+/* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":721
  * ctypedef npy_ulonglong  ulonglong_t
  * 
  * ctypedef npy_intp       intp_t             # <<<<<<<<<<<<<<
@@ -1063,7 +1190,7 @@ typedef npy_ulonglong __pyx_t_5numpy_ulonglong_t;
  */
 typedef npy_intp __pyx_t_5numpy_intp_t;
 
-/* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":723
+/* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":722
  * 
  * ctypedef npy_intp       intp_t
  * ctypedef npy_uintp      uintp_t             # <<<<<<<<<<<<<<
@@ -1072,7 +1199,7 @@ typedef npy_intp __pyx_t_5numpy_intp_t;
  */
 typedef npy_uintp __pyx_t_5numpy_uintp_t;
 
-/* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":725
+/* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":724
  * ctypedef npy_uintp      uintp_t
  * 
  * ctypedef npy_double     float_t             # <<<<<<<<<<<<<<
@@ -1081,7 +1208,7 @@ typedef npy_uintp __pyx_t_5numpy_uintp_t;
  */
 typedef npy_double __pyx_t_5numpy_float_t;
 
-/* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":726
+/* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":725
  * 
  * ctypedef npy_double     float_t
  * ctypedef npy_double     double_t             # <<<<<<<<<<<<<<
@@ -1090,7 +1217,7 @@ typedef npy_double __pyx_t_5numpy_float_t;
  */
 typedef npy_double __pyx_t_5numpy_double_t;
 
-/* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":727
+/* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":726
  * ctypedef npy_double     float_t
  * ctypedef npy_double     double_t
  * ctypedef npy_longdouble longdouble_t             # <<<<<<<<<<<<<<
@@ -1099,14 +1226,14 @@ typedef npy_double __pyx_t_5numpy_double_t;
  */
 typedef npy_longdouble __pyx_t_5numpy_longdouble_t;
 
-/* "src/screening/gap_test_all.pyx":18
+/* "slopescreening/screening/gap_test_all.pyx":18
  * from cpython.mem cimport PyMem_Malloc, PyMem_Realloc, PyMem_Free
  * 
  * ctypedef np.npy_bool bool_t             # <<<<<<<<<<<<<<
  * 
  * 
  */
-typedef npy_bool __pyx_t_3src_9screening_12gap_test_all_bool_t;
+typedef npy_bool __pyx_t_14slopescreening_9screening_12gap_test_all_bool_t;
 /* Declarations.proto */
 #if CYTHON_CCOMPLEX
   #ifdef __cplusplus
@@ -1133,9 +1260,9 @@ static CYTHON_INLINE __pyx_t_double_complex __pyx_t_double_complex_from_parts(do
 
 
 /*--- Type declarations ---*/
-struct __pyx_obj_3src_9screening_12gap_test_all_GapTestAll;
+struct __pyx_obj_14slopescreening_9screening_12gap_test_all_GapTestAll;
 
-/* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":729
+/* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":728
  * ctypedef npy_longdouble longdouble_t
  * 
  * ctypedef npy_cfloat      cfloat_t             # <<<<<<<<<<<<<<
@@ -1144,7 +1271,7 @@ struct __pyx_obj_3src_9screening_12gap_test_all_GapTestAll;
  */
 typedef npy_cfloat __pyx_t_5numpy_cfloat_t;
 
-/* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":730
+/* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":729
  * 
  * ctypedef npy_cfloat      cfloat_t
  * ctypedef npy_cdouble     cdouble_t             # <<<<<<<<<<<<<<
@@ -1153,7 +1280,7 @@ typedef npy_cfloat __pyx_t_5numpy_cfloat_t;
  */
 typedef npy_cdouble __pyx_t_5numpy_cdouble_t;
 
-/* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":731
+/* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":730
  * ctypedef npy_cfloat      cfloat_t
  * ctypedef npy_cdouble     cdouble_t
  * ctypedef npy_clongdouble clongdouble_t             # <<<<<<<<<<<<<<
@@ -1162,7 +1289,7 @@ typedef npy_cdouble __pyx_t_5numpy_cdouble_t;
  */
 typedef npy_clongdouble __pyx_t_5numpy_clongdouble_t;
 
-/* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":733
+/* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":732
  * ctypedef npy_clongdouble clongdouble_t
  * 
  * ctypedef npy_cdouble     complex_t             # <<<<<<<<<<<<<<
@@ -1171,14 +1298,14 @@ typedef npy_clongdouble __pyx_t_5numpy_clongdouble_t;
  */
 typedef npy_cdouble __pyx_t_5numpy_complex_t;
 
-/* "src/screening/gap_test_all.pyx":21
+/* "slopescreening/screening/gap_test_all.pyx":21
  * 
  * 
  * cdef class GapTestAll:             # <<<<<<<<<<<<<<
  *    """ Generalized test
  *    """
  */
-struct __pyx_obj_3src_9screening_12gap_test_all_GapTestAll {
+struct __pyx_obj_14slopescreening_9screening_12gap_test_all_GapTestAll {
   PyObject_HEAD
   double *vec_cumsum_gammas;
   char *name;
@@ -1403,13 +1530,21 @@ static PyObject *__Pyx_PyFunction_FastCallDict(PyObject *func, PyObject **args,
 #ifndef Py_MEMBER_SIZE
 #define Py_MEMBER_SIZE(type, member) sizeof(((type *)0)->member)
 #endif
+#if CYTHON_FAST_PYCALL
   static size_t __pyx_pyframe_localsplus_offset = 0;
   #include "frameobject.h"
+#if PY_VERSION_HEX >= 0x030b00a6
+  #ifndef Py_BUILD_CORE
+    #define Py_BUILD_CORE 1
+  #endif
+  #include "internal/pycore_frame.h"
+#endif
   #define __Pxy_PyFrame_Initialize_Offsets()\
     ((void)__Pyx_BUILD_ASSERT_EXPR(sizeof(PyFrameObject) == offsetof(PyFrameObject, f_localsplus) + Py_MEMBER_SIZE(PyFrameObject, f_localsplus)),\
      (void)(__pyx_pyframe_localsplus_offset = ((size_t)PyFrame_Type.tp_basicsize) - Py_MEMBER_SIZE(PyFrameObject, f_localsplus)))
   #define __Pyx_PyFrame_GetLocalsplus(frame)\
     (assert(__pyx_pyframe_localsplus_offset), (PyObject **)(((char *)(frame)) + __pyx_pyframe_localsplus_offset))
+#endif // CYTHON_FAST_PYCALL
 #endif
 
 /* PyObjectCall.proto */
@@ -1775,17 +1910,17 @@ static PyTypeObject *__pyx_ptype_5numpy_ufunc = 0;
 
 /* Module declarations from 'cython' */
 
-/* Module declarations from 'src.screening.gap_test_all' */
-static PyTypeObject *__pyx_ptype_3src_9screening_12gap_test_all_GapTestAll = 0;
+/* Module declarations from 'slopescreening.screening.gap_test_all' */
+static PyTypeObject *__pyx_ptype_14slopescreening_9screening_12gap_test_all_GapTestAll = 0;
 static __Pyx_TypeInfo __Pyx_TypeInfo_nn_npy_double = { "npy_double", NULL, sizeof(npy_double), { 0 }, 0, 'R', 0, 0 };
 static __Pyx_TypeInfo __Pyx_TypeInfo_long = { "long", NULL, sizeof(long), { 0 }, 0, IS_UNSIGNED(long) ? 'U' : 'I', IS_UNSIGNED(long), 0 };
 static __Pyx_TypeInfo __Pyx_TypeInfo_nn___pyx_t_5numpy_int_t = { "int_t", NULL, sizeof(__pyx_t_5numpy_int_t), { 0 }, 0, IS_UNSIGNED(__pyx_t_5numpy_int_t) ? 'U' : 'I', IS_UNSIGNED(__pyx_t_5numpy_int_t), 0 };
 static __Pyx_TypeInfo __Pyx_TypeInfo_nn_npy_bool = { "npy_bool", NULL, sizeof(npy_bool), { 0 }, 0, IS_UNSIGNED(npy_bool) ? 'U' : 'I', IS_UNSIGNED(npy_bool), 0 };
-#define __Pyx_MODULE_NAME "src.screening.gap_test_all"
-extern int __pyx_module_is_main_src__screening__gap_test_all;
-int __pyx_module_is_main_src__screening__gap_test_all = 0;
+#define __Pyx_MODULE_NAME "slopescreening.screening.gap_test_all"
+extern int __pyx_module_is_main_slopescreening__screening__gap_test_all;
+int __pyx_module_is_main_slopescreening__screening__gap_test_all = 0;
 
-/* Implementation of 'src.screening.gap_test_all' */
+/* Implementation of 'slopescreening.screening.gap_test_all' */
 static PyObject *__pyx_builtin_range;
 static PyObject *__pyx_builtin_TypeError;
 static PyObject *__pyx_builtin_ImportError;
@@ -1820,10 +1955,10 @@ static const char __pyx_k_setstate_cython[] = "__setstate_cython__";
 static const char __pyx_k_cline_in_traceback[] = "cline_in_traceback";
 static const char __pyx_k_coeff_dual_scaling[] = "coeff_dual_scaling";
 static const char __pyx_k_AbstractGapScreening[] = "AbstractGapScreening";
-static const char __pyx_k_src_screening_ascreening[] = "src.screening.ascreening";
 static const char __pyx_k_numpy_core_multiarray_failed_to[] = "numpy.core.multiarray failed to import";
 static const char __pyx_k_numpy_core_umath_failed_to_impor[] = "numpy.core.umath failed to import";
 static const char __pyx_k_self_vec_cumsum_gammas_cannot_be[] = "self.vec_cumsum_gammas cannot be converted to a Python object for pickling";
+static const char __pyx_k_slopescreening_screening_ascreen[] = "slopescreening.screening.ascreening";
 static PyObject *__pyx_n_s_AbstractGapScreening;
 static PyObject *__pyx_n_s_Atcabs;
 static PyObject *__pyx_n_s_GapTestAll;
@@ -1854,17 +1989,17 @@ static PyObject *__pyx_n_s_reduce_ex;
 static PyObject *__pyx_kp_s_self_vec_cumsum_gammas_cannot_be;
 static PyObject *__pyx_n_s_setstate;
 static PyObject *__pyx_n_s_setstate_cython;
+static PyObject *__pyx_n_s_slopescreening_screening_ascreen;
 static PyObject *__pyx_n_s_sqrt;
-static PyObject *__pyx_n_s_src_screening_ascreening;
 static PyObject *__pyx_n_s_test;
 static PyObject *__pyx_n_s_vec_gammas;
 static PyObject *__pyx_n_s_zeros;
-static int __pyx_pf_3src_9screening_12gap_test_all_10GapTestAll___init__(struct __pyx_obj_3src_9screening_12gap_test_all_GapTestAll *__pyx_v_self, PyArrayObject *__pyx_v_vec_gammas); /* proto */
-static void __pyx_pf_3src_9screening_12gap_test_all_10GapTestAll_2__dealloc__(struct __pyx_obj_3src_9screening_12gap_test_all_GapTestAll *__pyx_v_self); /* proto */
-static PyObject *__pyx_pf_3src_9screening_12gap_test_all_10GapTestAll_4apply_test(CYTHON_UNUSED struct __pyx_obj_3src_9screening_12gap_test_all_GapTestAll *__pyx_v_self, PyArrayObject *__pyx_v_Atcabs, double __pyx_v_gap, double __pyx_v_lbd, PyArrayObject *__pyx_v_vec_gammas, double __pyx_v_coeff_dual_scaling, double __pyx_v_offset_radius, PyArrayObject *__pyx_v_index); /* proto */
-static PyObject *__pyx_pf_3src_9screening_12gap_test_all_10GapTestAll_6__reduce_cython__(CYTHON_UNUSED struct __pyx_obj_3src_9screening_12gap_test_all_GapTestAll *__pyx_v_self); /* proto */
-static PyObject *__pyx_pf_3src_9screening_12gap_test_all_10GapTestAll_8__setstate_cython__(CYTHON_UNUSED struct __pyx_obj_3src_9screening_12gap_test_all_GapTestAll *__pyx_v_self, CYTHON_UNUSED PyObject *__pyx_v___pyx_state); /* proto */
-static PyObject *__pyx_tp_new_3src_9screening_12gap_test_all_GapTestAll(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/
+static int __pyx_pf_14slopescreening_9screening_12gap_test_all_10GapTestAll___init__(struct __pyx_obj_14slopescreening_9screening_12gap_test_all_GapTestAll *__pyx_v_self, PyArrayObject *__pyx_v_vec_gammas); /* proto */
+static void __pyx_pf_14slopescreening_9screening_12gap_test_all_10GapTestAll_2__dealloc__(struct __pyx_obj_14slopescreening_9screening_12gap_test_all_GapTestAll *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_14slopescreening_9screening_12gap_test_all_10GapTestAll_4apply_test(CYTHON_UNUSED struct __pyx_obj_14slopescreening_9screening_12gap_test_all_GapTestAll *__pyx_v_self, PyArrayObject *__pyx_v_Atcabs, double __pyx_v_gap, double __pyx_v_lbd, PyArrayObject *__pyx_v_vec_gammas, double __pyx_v_coeff_dual_scaling, double __pyx_v_offset_radius, PyArrayObject *__pyx_v_index); /* proto */
+static PyObject *__pyx_pf_14slopescreening_9screening_12gap_test_all_10GapTestAll_6__reduce_cython__(CYTHON_UNUSED struct __pyx_obj_14slopescreening_9screening_12gap_test_all_GapTestAll *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_14slopescreening_9screening_12gap_test_all_10GapTestAll_8__setstate_cython__(CYTHON_UNUSED struct __pyx_obj_14slopescreening_9screening_12gap_test_all_GapTestAll *__pyx_v_self, CYTHON_UNUSED PyObject *__pyx_v___pyx_state); /* proto */
+static PyObject *__pyx_tp_new_14slopescreening_9screening_12gap_test_all_GapTestAll(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/
 static PyObject *__pyx_int_0;
 static PyObject *__pyx_int_1;
 static PyObject *__pyx_int_neg_1;
@@ -1875,7 +2010,7 @@ static PyObject *__pyx_tuple__4;
 static PyObject *__pyx_tuple__5;
 /* Late includes */
 
-/* "src/screening/gap_test_all.pyx":30
+/* "slopescreening/screening/gap_test_all.pyx":30
  *    @cython.boundscheck(False) # turn off bounds-checking for entire function
  *    @cython.wraparound(False)  # turn off negative index wrapping for entire function
  *    def __init__(             # <<<<<<<<<<<<<<
@@ -1884,8 +2019,8 @@ static PyObject *__pyx_tuple__5;
  */
 
 /* Python wrapper */
-static int __pyx_pw_3src_9screening_12gap_test_all_10GapTestAll_1__init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static int __pyx_pw_3src_9screening_12gap_test_all_10GapTestAll_1__init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+static int __pyx_pw_14slopescreening_9screening_12gap_test_all_10GapTestAll_1__init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static int __pyx_pw_14slopescreening_9screening_12gap_test_all_10GapTestAll_1__init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
   PyArrayObject *__pyx_v_vec_gammas = 0;
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
@@ -1925,12 +2060,12 @@ static int __pyx_pw_3src_9screening_12gap_test_all_10GapTestAll_1__init__(PyObje
   __pyx_L5_argtuple_error:;
   __Pyx_RaiseArgtupleInvalid("__init__", 1, 1, 1, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 30, __pyx_L3_error)
   __pyx_L3_error:;
-  __Pyx_AddTraceback("src.screening.gap_test_all.GapTestAll.__init__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_AddTraceback("slopescreening.screening.gap_test_all.GapTestAll.__init__", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __Pyx_RefNannyFinishContext();
   return -1;
   __pyx_L4_argument_unpacking_done:;
   if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_vec_gammas), __pyx_ptype_5numpy_ndarray, 1, "vec_gammas", 0))) __PYX_ERR(0, 31, __pyx_L1_error)
-  __pyx_r = __pyx_pf_3src_9screening_12gap_test_all_10GapTestAll___init__(((struct __pyx_obj_3src_9screening_12gap_test_all_GapTestAll *)__pyx_v_self), __pyx_v_vec_gammas);
+  __pyx_r = __pyx_pf_14slopescreening_9screening_12gap_test_all_10GapTestAll___init__(((struct __pyx_obj_14slopescreening_9screening_12gap_test_all_GapTestAll *)__pyx_v_self), __pyx_v_vec_gammas);
 
   /* function exit code */
   goto __pyx_L0;
@@ -1941,7 +2076,7 @@ static int __pyx_pw_3src_9screening_12gap_test_all_10GapTestAll_1__init__(PyObje
   return __pyx_r;
 }
 
-static int __pyx_pf_3src_9screening_12gap_test_all_10GapTestAll___init__(struct __pyx_obj_3src_9screening_12gap_test_all_GapTestAll *__pyx_v_self, PyArrayObject *__pyx_v_vec_gammas) {
+static int __pyx_pf_14slopescreening_9screening_12gap_test_all_10GapTestAll___init__(struct __pyx_obj_14slopescreening_9screening_12gap_test_all_GapTestAll *__pyx_v_self, PyArrayObject *__pyx_v_vec_gammas) {
   int __pyx_v_n;
   int __pyx_v_i;
   __Pyx_LocalBuf_ND __pyx_pybuffernd_vec_gammas;
@@ -1966,7 +2101,7 @@ static int __pyx_pf_3src_9screening_12gap_test_all_10GapTestAll___init__(struct
   }
   __pyx_pybuffernd_vec_gammas.diminfo[0].strides = __pyx_pybuffernd_vec_gammas.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_vec_gammas.diminfo[0].shape = __pyx_pybuffernd_vec_gammas.rcbuffer->pybuffer.shape[0];
 
-  /* "src/screening/gap_test_all.pyx":34
+  /* "slopescreening/screening/gap_test_all.pyx":34
  *    ):
  * 
  *       cdef int n = vec_gammas.shape[0]             # <<<<<<<<<<<<<<
@@ -1975,7 +2110,7 @@ static int __pyx_pf_3src_9screening_12gap_test_all_10GapTestAll___init__(struct
  */
   __pyx_v_n = (__pyx_v_vec_gammas->dimensions[0]);
 
-  /* "src/screening/gap_test_all.pyx":37
+  /* "slopescreening/screening/gap_test_all.pyx":37
  *       cdef int i
  * 
  *       self.vec_cumsum_gammas = <double*> PyMem_Malloc((n+1) * sizeof(double))             # <<<<<<<<<<<<<<
@@ -1984,7 +2119,7 @@ static int __pyx_pf_3src_9screening_12gap_test_all_10GapTestAll___init__(struct
  */
   __pyx_v_self->vec_cumsum_gammas = ((double *)PyMem_Malloc(((__pyx_v_n + 1) * (sizeof(double)))));
 
-  /* "src/screening/gap_test_all.pyx":38
+  /* "slopescreening/screening/gap_test_all.pyx":38
  * 
  *       self.vec_cumsum_gammas = <double*> PyMem_Malloc((n+1) * sizeof(double))
  *       self.vec_cumsum_gammas[0] = 0             # <<<<<<<<<<<<<<
@@ -1993,7 +2128,7 @@ static int __pyx_pf_3src_9screening_12gap_test_all_10GapTestAll___init__(struct
  */
   (__pyx_v_self->vec_cumsum_gammas[0]) = 0.0;
 
-  /* "src/screening/gap_test_all.pyx":40
+  /* "slopescreening/screening/gap_test_all.pyx":40
  *       self.vec_cumsum_gammas[0] = 0
  * 
  *       for i in range(n):             # <<<<<<<<<<<<<<
@@ -2005,7 +2140,7 @@ static int __pyx_pf_3src_9screening_12gap_test_all_10GapTestAll___init__(struct
   for (__pyx_t_3 = 0; __pyx_t_3 < __pyx_t_2; __pyx_t_3+=1) {
     __pyx_v_i = __pyx_t_3;
 
-    /* "src/screening/gap_test_all.pyx":41
+    /* "slopescreening/screening/gap_test_all.pyx":41
  * 
  *       for i in range(n):
  *          self.vec_cumsum_gammas[i+1] = self.vec_cumsum_gammas[i] + vec_gammas[i]             # <<<<<<<<<<<<<<
@@ -2016,7 +2151,7 @@ static int __pyx_pf_3src_9screening_12gap_test_all_10GapTestAll___init__(struct
     (__pyx_v_self->vec_cumsum_gammas[(__pyx_v_i + 1)]) = ((__pyx_v_self->vec_cumsum_gammas[__pyx_v_i]) + (*__Pyx_BufPtrStrided1d(npy_double *, __pyx_pybuffernd_vec_gammas.rcbuffer->pybuffer.buf, __pyx_t_4, __pyx_pybuffernd_vec_gammas.diminfo[0].strides)));
   }
 
-  /* "src/screening/gap_test_all.pyx":49
+  /* "slopescreening/screening/gap_test_all.pyx":49
  *       # self.vec_cumsum_gammas = &buf[0]
  * 
  *       self.name = "GAP test-all (cython)"             # <<<<<<<<<<<<<<
@@ -2025,7 +2160,7 @@ static int __pyx_pf_3src_9screening_12gap_test_all_10GapTestAll___init__(struct
  */
   __pyx_v_self->name = ((char *)"GAP test-all (cython)");
 
-  /* "src/screening/gap_test_all.pyx":30
+  /* "slopescreening/screening/gap_test_all.pyx":30
  *    @cython.boundscheck(False) # turn off bounds-checking for entire function
  *    @cython.wraparound(False)  # turn off negative index wrapping for entire function
  *    def __init__(             # <<<<<<<<<<<<<<
@@ -2043,7 +2178,7 @@ static int __pyx_pf_3src_9screening_12gap_test_all_10GapTestAll___init__(struct
     __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb);
     __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_vec_gammas.rcbuffer->pybuffer);
   __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);}
-  __Pyx_AddTraceback("src.screening.gap_test_all.GapTestAll.__init__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_AddTraceback("slopescreening.screening.gap_test_all.GapTestAll.__init__", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __pyx_r = -1;
   goto __pyx_L2;
   __pyx_L0:;
@@ -2053,7 +2188,7 @@ static int __pyx_pf_3src_9screening_12gap_test_all_10GapTestAll___init__(struct
   return __pyx_r;
 }
 
-/* "src/screening/gap_test_all.pyx":52
+/* "slopescreening/screening/gap_test_all.pyx":52
  * 
  * 
  *    def __dealloc__(self):             # <<<<<<<<<<<<<<
@@ -2062,21 +2197,21 @@ static int __pyx_pf_3src_9screening_12gap_test_all_10GapTestAll___init__(struct
  */
 
 /* Python wrapper */
-static void __pyx_pw_3src_9screening_12gap_test_all_10GapTestAll_3__dealloc__(PyObject *__pyx_v_self); /*proto*/
-static void __pyx_pw_3src_9screening_12gap_test_all_10GapTestAll_3__dealloc__(PyObject *__pyx_v_self) {
+static void __pyx_pw_14slopescreening_9screening_12gap_test_all_10GapTestAll_3__dealloc__(PyObject *__pyx_v_self); /*proto*/
+static void __pyx_pw_14slopescreening_9screening_12gap_test_all_10GapTestAll_3__dealloc__(PyObject *__pyx_v_self) {
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("__dealloc__ (wrapper)", 0);
-  __pyx_pf_3src_9screening_12gap_test_all_10GapTestAll_2__dealloc__(((struct __pyx_obj_3src_9screening_12gap_test_all_GapTestAll *)__pyx_v_self));
+  __pyx_pf_14slopescreening_9screening_12gap_test_all_10GapTestAll_2__dealloc__(((struct __pyx_obj_14slopescreening_9screening_12gap_test_all_GapTestAll *)__pyx_v_self));
 
   /* function exit code */
   __Pyx_RefNannyFinishContext();
 }
 
-static void __pyx_pf_3src_9screening_12gap_test_all_10GapTestAll_2__dealloc__(struct __pyx_obj_3src_9screening_12gap_test_all_GapTestAll *__pyx_v_self) {
+static void __pyx_pf_14slopescreening_9screening_12gap_test_all_10GapTestAll_2__dealloc__(struct __pyx_obj_14slopescreening_9screening_12gap_test_all_GapTestAll *__pyx_v_self) {
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("__dealloc__", 0);
 
-  /* "src/screening/gap_test_all.pyx":53
+  /* "slopescreening/screening/gap_test_all.pyx":53
  * 
  *    def __dealloc__(self):
  *       PyMem_Free(self.vec_cumsum_gammas)  # no-op if self.data is NULL             # <<<<<<<<<<<<<<
@@ -2085,7 +2220,7 @@ static void __pyx_pf_3src_9screening_12gap_test_all_10GapTestAll_2__dealloc__(st
  */
   PyMem_Free(__pyx_v_self->vec_cumsum_gammas);
 
-  /* "src/screening/gap_test_all.pyx":52
+  /* "slopescreening/screening/gap_test_all.pyx":52
  * 
  * 
  *    def __dealloc__(self):             # <<<<<<<<<<<<<<
@@ -2097,7 +2232,7 @@ static void __pyx_pf_3src_9screening_12gap_test_all_10GapTestAll_2__dealloc__(st
   __Pyx_RefNannyFinishContext();
 }
 
-/* "src/screening/gap_test_all.pyx":58
+/* "slopescreening/screening/gap_test_all.pyx":58
  *    @cython.boundscheck(False) # turn off bounds-checking for entire function
  *    # @cython.wraparound(False)  # turn off negative index wrapping for entire function
  *    def apply_test(self,             # <<<<<<<<<<<<<<
@@ -2106,9 +2241,9 @@ static void __pyx_pf_3src_9screening_12gap_test_all_10GapTestAll_2__dealloc__(st
  */
 
 /* Python wrapper */
-static PyObject *__pyx_pw_3src_9screening_12gap_test_all_10GapTestAll_5apply_test(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static char __pyx_doc_3src_9screening_12gap_test_all_10GapTestAll_4apply_test[] = " Apply the Gap safe sphere screening test\n\n      Implementation of the safe screening test\n      \n      Parameters\n      ----------\n      Atcabs : np.ndarray\n         vector matA.T @ vecc where vec is dual admissible in absolute value\n         size [n]\n      gap : positive float\n         duality gap\n      lbd : positive float\n         regularization parameters\n      vec_gammas : np.ndarray\n         slope parameters\n         size [n,]\n      coeff_dual_scaling : positif float\n         If coeff_dual_scaling is not feasible, dual scaling factor\n         such taht vecu / coeff_dual_scaling os dual feasible\n         Here for code optimization purposes\n         Default value is 1. (vecu is feasible)\n      offset_radius : float\n         additive term added to the redius\n         default is 0\n      index : np.ndarray\n         Array of indices that sort Atu in absolute value\n         default is None\n      \n      Returns\n      -------\n      calI_screen : np.ndarray\n         vector of boolean\n         True if screening test passes and False otherwise\n         size [n,]\n      ";
-static PyObject *__pyx_pw_3src_9screening_12gap_test_all_10GapTestAll_5apply_test(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+static PyObject *__pyx_pw_14slopescreening_9screening_12gap_test_all_10GapTestAll_5apply_test(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static char __pyx_doc_14slopescreening_9screening_12gap_test_all_10GapTestAll_4apply_test[] = " Apply the Gap safe sphere screening test\n\n      Implementation of the safe screening test\n      \n      Parameters\n      ----------\n      Atcabs : np.ndarray\n         vector matA.T @ vecc where vec is dual admissible in absolute value\n         size [n]\n      gap : positive float\n         duality gap\n      lbd : positive float\n         regularization parameters\n      vec_gammas : np.ndarray\n         slope parameters\n         size [n,]\n      coeff_dual_scaling : positif float\n         If coeff_dual_scaling is not feasible, dual scaling factor\n         such taht vecu / coeff_dual_scaling os dual feasible\n         Here for code optimization purposes\n         Default value is 1. (vecu is feasible)\n      offset_radius : float\n         additive term added to the redius\n         default is 0\n      index : np.ndarray\n         Array of indices that sort Atu in absolute value\n         default is None\n      \n      Returns\n      -------\n      calI_screen : np.ndarray\n         vector of boolean\n         True if screening test passes and False otherwise\n         size [n,]\n      ";
+static PyObject *__pyx_pw_14slopescreening_9screening_12gap_test_all_10GapTestAll_5apply_test(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
   PyArrayObject *__pyx_v_Atcabs = 0;
   double __pyx_v_gap;
   double __pyx_v_lbd;
@@ -2126,7 +2261,7 @@ static PyObject *__pyx_pw_3src_9screening_12gap_test_all_10GapTestAll_5apply_tes
     static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_Atcabs,&__pyx_n_s_gap,&__pyx_n_s_lbd,&__pyx_n_s_vec_gammas,&__pyx_n_s_coeff_dual_scaling,&__pyx_n_s_offset_radius,&__pyx_n_s_index,0};
     PyObject* values[7] = {0,0,0,0,0,0,0};
 
-    /* "src/screening/gap_test_all.pyx":65
+    /* "slopescreening/screening/gap_test_all.pyx":65
  *       double coeff_dual_scaling =1.,
  *       double offset_radius=0.,
  *       np.ndarray[long, ndim=1] index=None             # <<<<<<<<<<<<<<
@@ -2236,16 +2371,16 @@ static PyObject *__pyx_pw_3src_9screening_12gap_test_all_10GapTestAll_5apply_tes
   __pyx_L5_argtuple_error:;
   __Pyx_RaiseArgtupleInvalid("apply_test", 0, 4, 7, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 58, __pyx_L3_error)
   __pyx_L3_error:;
-  __Pyx_AddTraceback("src.screening.gap_test_all.GapTestAll.apply_test", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_AddTraceback("slopescreening.screening.gap_test_all.GapTestAll.apply_test", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __Pyx_RefNannyFinishContext();
   return NULL;
   __pyx_L4_argument_unpacking_done:;
   if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_Atcabs), __pyx_ptype_5numpy_ndarray, 1, "Atcabs", 0))) __PYX_ERR(0, 59, __pyx_L1_error)
   if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_vec_gammas), __pyx_ptype_5numpy_ndarray, 1, "vec_gammas", 0))) __PYX_ERR(0, 62, __pyx_L1_error)
   if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_index), __pyx_ptype_5numpy_ndarray, 1, "index", 0))) __PYX_ERR(0, 65, __pyx_L1_error)
-  __pyx_r = __pyx_pf_3src_9screening_12gap_test_all_10GapTestAll_4apply_test(((struct __pyx_obj_3src_9screening_12gap_test_all_GapTestAll *)__pyx_v_self), __pyx_v_Atcabs, __pyx_v_gap, __pyx_v_lbd, __pyx_v_vec_gammas, __pyx_v_coeff_dual_scaling, __pyx_v_offset_radius, __pyx_v_index);
+  __pyx_r = __pyx_pf_14slopescreening_9screening_12gap_test_all_10GapTestAll_4apply_test(((struct __pyx_obj_14slopescreening_9screening_12gap_test_all_GapTestAll *)__pyx_v_self), __pyx_v_Atcabs, __pyx_v_gap, __pyx_v_lbd, __pyx_v_vec_gammas, __pyx_v_coeff_dual_scaling, __pyx_v_offset_radius, __pyx_v_index);
 
-  /* "src/screening/gap_test_all.pyx":58
+  /* "slopescreening/screening/gap_test_all.pyx":58
  *    @cython.boundscheck(False) # turn off bounds-checking for entire function
  *    # @cython.wraparound(False)  # turn off negative index wrapping for entire function
  *    def apply_test(self,             # <<<<<<<<<<<<<<
@@ -2262,7 +2397,7 @@ static PyObject *__pyx_pw_3src_9screening_12gap_test_all_10GapTestAll_5apply_tes
   return __pyx_r;
 }
 
-static PyObject *__pyx_pf_3src_9screening_12gap_test_all_10GapTestAll_4apply_test(CYTHON_UNUSED struct __pyx_obj_3src_9screening_12gap_test_all_GapTestAll *__pyx_v_self, PyArrayObject *__pyx_v_Atcabs, double __pyx_v_gap, double __pyx_v_lbd, PyArrayObject *__pyx_v_vec_gammas, double __pyx_v_coeff_dual_scaling, double __pyx_v_offset_radius, PyArrayObject *__pyx_v_index) {
+static PyObject *__pyx_pf_14slopescreening_9screening_12gap_test_all_10GapTestAll_4apply_test(CYTHON_UNUSED struct __pyx_obj_14slopescreening_9screening_12gap_test_all_GapTestAll *__pyx_v_self, PyArrayObject *__pyx_v_Atcabs, double __pyx_v_gap, double __pyx_v_lbd, PyArrayObject *__pyx_v_vec_gammas, double __pyx_v_coeff_dual_scaling, double __pyx_v_offset_radius, PyArrayObject *__pyx_v_index) {
   double __pyx_v_radius;
   PyArrayObject *__pyx_v_coeff_lbd_gamma = 0;
   int __pyx_v_n;
@@ -2374,7 +2509,7 @@ static PyObject *__pyx_pf_3src_9screening_12gap_test_all_10GapTestAll_4apply_tes
   }
   __pyx_pybuffernd_index.diminfo[0].strides = __pyx_pybuffernd_index.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_index.diminfo[0].shape = __pyx_pybuffernd_index.rcbuffer->pybuffer.shape[0];
 
-  /* "src/screening/gap_test_all.pyx":107
+  /* "slopescreening/screening/gap_test_all.pyx":107
  *       # in order to match the paper indexation rules
  * 
  *       cdef double radius  = coeff_dual_scaling * np.sqrt(2 * gap) + offset_radius             # <<<<<<<<<<<<<<
@@ -2420,7 +2555,7 @@ static PyObject *__pyx_pf_3src_9screening_12gap_test_all_10GapTestAll_4apply_tes
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   __pyx_v_radius = __pyx_t_6;
 
-  /* "src/screening/gap_test_all.pyx":109
+  /* "slopescreening/screening/gap_test_all.pyx":109
  *       cdef double radius  = coeff_dual_scaling * np.sqrt(2 * gap) + offset_radius
  *       # cdef double lbd_aug = coeff_dual_scaling * lbd
  *       cdef np.ndarray[np.npy_double, ndim=1] coeff_lbd_gamma = coeff_dual_scaling * lbd * vec_gammas             # <<<<<<<<<<<<<<
@@ -2446,7 +2581,7 @@ static PyObject *__pyx_pf_3src_9screening_12gap_test_all_10GapTestAll_4apply_tes
   __pyx_v_coeff_lbd_gamma = ((PyArrayObject *)__pyx_t_2);
   __pyx_t_2 = 0;
 
-  /* "src/screening/gap_test_all.pyx":111
+  /* "slopescreening/screening/gap_test_all.pyx":111
  *       cdef np.ndarray[np.npy_double, ndim=1] coeff_lbd_gamma = coeff_dual_scaling * lbd * vec_gammas
  * 
  *       cdef int n = Atcabs.shape[0]             # <<<<<<<<<<<<<<
@@ -2455,7 +2590,7 @@ static PyObject *__pyx_pf_3src_9screening_12gap_test_all_10GapTestAll_4apply_tes
  */
   __pyx_v_n = (__pyx_v_Atcabs->dimensions[0]);
 
-  /* "src/screening/gap_test_all.pyx":113
+  /* "slopescreening/screening/gap_test_all.pyx":113
  *       cdef int n = Atcabs.shape[0]
  *       cdef int k, q, r
  *       cdef double tau = 0             # <<<<<<<<<<<<<<
@@ -2464,7 +2599,7 @@ static PyObject *__pyx_pf_3src_9screening_12gap_test_all_10GapTestAll_4apply_tes
  */
   __pyx_v_tau = 0.0;
 
-  /* "src/screening/gap_test_all.pyx":117
+  /* "slopescreening/screening/gap_test_all.pyx":117
  * 
  *       # arange because I want entries 0, 1 being 0 and 1!
  *       cdef np.ndarray[np.int_t, ndim=1] vec_p_star = np.arange(n+1, dtype=long)             # <<<<<<<<<<<<<<
@@ -2505,7 +2640,7 @@ static PyObject *__pyx_pf_3src_9screening_12gap_test_all_10GapTestAll_4apply_tes
   __pyx_v_vec_p_star = ((PyArrayObject *)__pyx_t_3);
   __pyx_t_3 = 0;
 
-  /* "src/screening/gap_test_all.pyx":118
+  /* "slopescreening/screening/gap_test_all.pyx":118
  *       # arange because I want entries 0, 1 being 0 and 1!
  *       cdef np.ndarray[np.int_t, ndim=1] vec_p_star = np.arange(n+1, dtype=long)
  *       cdef np.ndarray[np.int_t, ndim=1] vec_q_star = np.arange(n+1, dtype=long)             # <<<<<<<<<<<<<<
@@ -2546,7 +2681,7 @@ static PyObject *__pyx_pf_3src_9screening_12gap_test_all_10GapTestAll_4apply_tes
   __pyx_v_vec_q_star = ((PyArrayObject *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "src/screening/gap_test_all.pyx":121
+  /* "slopescreening/screening/gap_test_all.pyx":121
  * 
  *       # output
  *       cdef np.ndarray[np.npy_bool, ndim=1] calI_screen = np.zeros(n, dtype=bool)             # <<<<<<<<<<<<<<
@@ -2587,7 +2722,7 @@ static PyObject *__pyx_pf_3src_9screening_12gap_test_all_10GapTestAll_4apply_tes
   __pyx_v_calI_screen = ((PyArrayObject *)__pyx_t_2);
   __pyx_t_2 = 0;
 
-  /* "src/screening/gap_test_all.pyx":124
+  /* "slopescreening/screening/gap_test_all.pyx":124
  * 
  *       # 1. Sort in descending order
  *       if index is None:             # <<<<<<<<<<<<<<
@@ -2598,7 +2733,7 @@ static PyObject *__pyx_pf_3src_9screening_12gap_test_all_10GapTestAll_4apply_tes
   __pyx_t_12 = (__pyx_t_11 != 0);
   if (__pyx_t_12) {
 
-    /* "src/screening/gap_test_all.pyx":125
+    /* "slopescreening/screening/gap_test_all.pyx":125
  *       # 1. Sort in descending order
  *       if index is None:
  *          index = np.argsort(Atcabs)[::-1]             # <<<<<<<<<<<<<<
@@ -2651,7 +2786,7 @@ static PyObject *__pyx_pf_3src_9screening_12gap_test_all_10GapTestAll_4apply_tes
     __Pyx_DECREF_SET(__pyx_v_index, ((PyArrayObject *)__pyx_t_4));
     __pyx_t_4 = 0;
 
-    /* "src/screening/gap_test_all.pyx":124
+    /* "slopescreening/screening/gap_test_all.pyx":124
  * 
  *       # 1. Sort in descending order
  *       if index is None:             # <<<<<<<<<<<<<<
@@ -2660,7 +2795,7 @@ static PyObject *__pyx_pf_3src_9screening_12gap_test_all_10GapTestAll_4apply_tes
  */
   }
 
-  /* "src/screening/gap_test_all.pyx":128
+  /* "slopescreening/screening/gap_test_all.pyx":128
  * 
  *       # 2. Precomputing quantities
  *       cdef np.ndarray[np.npy_double, ndim=1] vec_f = np.cumsum(             # <<<<<<<<<<<<<<
@@ -2673,7 +2808,7 @@ static PyObject *__pyx_pf_3src_9screening_12gap_test_all_10GapTestAll_4apply_tes
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
 
-  /* "src/screening/gap_test_all.pyx":129
+  /* "slopescreening/screening/gap_test_all.pyx":129
  *       # 2. Precomputing quantities
  *       cdef np.ndarray[np.npy_double, ndim=1] vec_f = np.cumsum(
  *          coeff_lbd_gamma[::-1] - Atcabs[index[::-1]] - radius             # <<<<<<<<<<<<<<
@@ -2714,7 +2849,7 @@ static PyObject *__pyx_pf_3src_9screening_12gap_test_all_10GapTestAll_4apply_tes
   __Pyx_GOTREF(__pyx_t_4);
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "src/screening/gap_test_all.pyx":130
+  /* "slopescreening/screening/gap_test_all.pyx":130
  *       cdef np.ndarray[np.npy_double, ndim=1] vec_f = np.cumsum(
  *          coeff_lbd_gamma[::-1] - Atcabs[index[::-1]] - radius
  *       )[::-1]             # <<<<<<<<<<<<<<
@@ -2738,7 +2873,7 @@ static PyObject *__pyx_pf_3src_9screening_12gap_test_all_10GapTestAll_4apply_tes
   __pyx_v_vec_f = ((PyArrayObject *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "src/screening/gap_test_all.pyx":132
+  /* "slopescreening/screening/gap_test_all.pyx":132
  *       )[::-1]
  * 
  *       cdef double best_bound_q = vec_f[0] - coeff_lbd_gamma[0]             # <<<<<<<<<<<<<<
@@ -2751,7 +2886,7 @@ static PyObject *__pyx_pf_3src_9screening_12gap_test_all_10GapTestAll_4apply_tes
   if (__pyx_t_20 < 0) __pyx_t_20 += __pyx_pybuffernd_coeff_lbd_gamma.diminfo[0].shape;
   __pyx_v_best_bound_q = ((*__Pyx_BufPtrStrided1d(npy_double *, __pyx_pybuffernd_vec_f.rcbuffer->pybuffer.buf, __pyx_t_19, __pyx_pybuffernd_vec_f.diminfo[0].strides)) - (*__Pyx_BufPtrStrided1d(npy_double *, __pyx_pybuffernd_coeff_lbd_gamma.rcbuffer->pybuffer.buf, __pyx_t_20, __pyx_pybuffernd_coeff_lbd_gamma.diminfo[0].strides)));
 
-  /* "src/screening/gap_test_all.pyx":133
+  /* "slopescreening/screening/gap_test_all.pyx":133
  * 
  *       cdef double best_bound_q = vec_f[0] - coeff_lbd_gamma[0]
  *       cdef double curr_bound_q = 0.             # <<<<<<<<<<<<<<
@@ -2760,7 +2895,7 @@ static PyObject *__pyx_pf_3src_9screening_12gap_test_all_10GapTestAll_4apply_tes
  */
   __pyx_v_curr_bound_q = 0.;
 
-  /* "src/screening/gap_test_all.pyx":134
+  /* "slopescreening/screening/gap_test_all.pyx":134
  *       cdef double best_bound_q = vec_f[0] - coeff_lbd_gamma[0]
  *       cdef double curr_bound_q = 0.
  *       cdef double best_bound_p = vec_f[0]             # <<<<<<<<<<<<<<
@@ -2771,7 +2906,7 @@ static PyObject *__pyx_pf_3src_9screening_12gap_test_all_10GapTestAll_4apply_tes
   if (__pyx_t_20 < 0) __pyx_t_20 += __pyx_pybuffernd_vec_f.diminfo[0].shape;
   __pyx_v_best_bound_p = (*__Pyx_BufPtrStrided1d(npy_double *, __pyx_pybuffernd_vec_f.rcbuffer->pybuffer.buf, __pyx_t_20, __pyx_pybuffernd_vec_f.diminfo[0].strides));
 
-  /* "src/screening/gap_test_all.pyx":135
+  /* "slopescreening/screening/gap_test_all.pyx":135
  *       cdef double curr_bound_q = 0.
  *       cdef double best_bound_p = vec_f[0]
  *       cdef double curr_bound_p = 0.             # <<<<<<<<<<<<<<
@@ -2780,7 +2915,7 @@ static PyObject *__pyx_pf_3src_9screening_12gap_test_all_10GapTestAll_4apply_tes
  */
   __pyx_v_curr_bound_p = 0.;
 
-  /* "src/screening/gap_test_all.pyx":136
+  /* "slopescreening/screening/gap_test_all.pyx":136
  *       cdef double best_bound_p = vec_f[0]
  *       cdef double curr_bound_p = 0.
  *       for k in range(2, n+1):             # <<<<<<<<<<<<<<
@@ -2792,7 +2927,7 @@ static PyObject *__pyx_pf_3src_9screening_12gap_test_all_10GapTestAll_4apply_tes
   for (__pyx_t_14 = 2; __pyx_t_14 < __pyx_t_22; __pyx_t_14+=1) {
     __pyx_v_k = __pyx_t_14;
 
-    /* "src/screening/gap_test_all.pyx":140
+    /* "slopescreening/screening/gap_test_all.pyx":140
  * 
  *          # 1. Evaluate p*
  *          curr_bound_p = vec_f[k-1]             # <<<<<<<<<<<<<<
@@ -2803,7 +2938,7 @@ static PyObject *__pyx_pf_3src_9screening_12gap_test_all_10GapTestAll_4apply_tes
     if (__pyx_t_20 < 0) __pyx_t_20 += __pyx_pybuffernd_vec_f.diminfo[0].shape;
     __pyx_v_curr_bound_p = (*__Pyx_BufPtrStrided1d(npy_double *, __pyx_pybuffernd_vec_f.rcbuffer->pybuffer.buf, __pyx_t_20, __pyx_pybuffernd_vec_f.diminfo[0].strides));
 
-    /* "src/screening/gap_test_all.pyx":141
+    /* "slopescreening/screening/gap_test_all.pyx":141
  *          # 1. Evaluate p*
  *          curr_bound_p = vec_f[k-1]
  *          if curr_bound_p > best_bound_p:             # <<<<<<<<<<<<<<
@@ -2813,7 +2948,7 @@ static PyObject *__pyx_pf_3src_9screening_12gap_test_all_10GapTestAll_4apply_tes
     __pyx_t_12 = ((__pyx_v_curr_bound_p > __pyx_v_best_bound_p) != 0);
     if (__pyx_t_12) {
 
-      /* "src/screening/gap_test_all.pyx":142
+      /* "slopescreening/screening/gap_test_all.pyx":142
  *          curr_bound_p = vec_f[k-1]
  *          if curr_bound_p > best_bound_p:
  *             best_bound_p = curr_bound_p             # <<<<<<<<<<<<<<
@@ -2822,7 +2957,7 @@ static PyObject *__pyx_pf_3src_9screening_12gap_test_all_10GapTestAll_4apply_tes
  */
       __pyx_v_best_bound_p = __pyx_v_curr_bound_p;
 
-      /* "src/screening/gap_test_all.pyx":143
+      /* "slopescreening/screening/gap_test_all.pyx":143
  *          if curr_bound_p > best_bound_p:
  *             best_bound_p = curr_bound_p
  *             vec_p_star[k] = k             # <<<<<<<<<<<<<<
@@ -2833,7 +2968,7 @@ static PyObject *__pyx_pf_3src_9screening_12gap_test_all_10GapTestAll_4apply_tes
       if (__pyx_t_20 < 0) __pyx_t_20 += __pyx_pybuffernd_vec_p_star.diminfo[0].shape;
       *__Pyx_BufPtrStrided1d(__pyx_t_5numpy_int_t *, __pyx_pybuffernd_vec_p_star.rcbuffer->pybuffer.buf, __pyx_t_20, __pyx_pybuffernd_vec_p_star.diminfo[0].strides) = __pyx_v_k;
 
-      /* "src/screening/gap_test_all.pyx":141
+      /* "slopescreening/screening/gap_test_all.pyx":141
  *          # 1. Evaluate p*
  *          curr_bound_p = vec_f[k-1]
  *          if curr_bound_p > best_bound_p:             # <<<<<<<<<<<<<<
@@ -2843,7 +2978,7 @@ static PyObject *__pyx_pf_3src_9screening_12gap_test_all_10GapTestAll_4apply_tes
       goto __pyx_L6;
     }
 
-    /* "src/screening/gap_test_all.pyx":145
+    /* "slopescreening/screening/gap_test_all.pyx":145
  *             vec_p_star[k] = k
  *          else:
  *             vec_p_star[k] = vec_p_star[k-1]             # <<<<<<<<<<<<<<
@@ -2859,7 +2994,7 @@ static PyObject *__pyx_pf_3src_9screening_12gap_test_all_10GapTestAll_4apply_tes
     }
     __pyx_L6:;
 
-    /* "src/screening/gap_test_all.pyx":148
+    /* "slopescreening/screening/gap_test_all.pyx":148
  * 
  *          # 1. Evaluate q*
  *          curr_bound_q = vec_f[k-1] - coeff_lbd_gamma[k-1]             # <<<<<<<<<<<<<<
@@ -2872,7 +3007,7 @@ static PyObject *__pyx_pf_3src_9screening_12gap_test_all_10GapTestAll_4apply_tes
     if (__pyx_t_19 < 0) __pyx_t_19 += __pyx_pybuffernd_coeff_lbd_gamma.diminfo[0].shape;
     __pyx_v_curr_bound_q = ((*__Pyx_BufPtrStrided1d(npy_double *, __pyx_pybuffernd_vec_f.rcbuffer->pybuffer.buf, __pyx_t_20, __pyx_pybuffernd_vec_f.diminfo[0].strides)) - (*__Pyx_BufPtrStrided1d(npy_double *, __pyx_pybuffernd_coeff_lbd_gamma.rcbuffer->pybuffer.buf, __pyx_t_19, __pyx_pybuffernd_coeff_lbd_gamma.diminfo[0].strides)));
 
-    /* "src/screening/gap_test_all.pyx":149
+    /* "slopescreening/screening/gap_test_all.pyx":149
  *          # 1. Evaluate q*
  *          curr_bound_q = vec_f[k-1] - coeff_lbd_gamma[k-1]
  *          if curr_bound_q > best_bound_q:             # <<<<<<<<<<<<<<
@@ -2882,7 +3017,7 @@ static PyObject *__pyx_pf_3src_9screening_12gap_test_all_10GapTestAll_4apply_tes
     __pyx_t_12 = ((__pyx_v_curr_bound_q > __pyx_v_best_bound_q) != 0);
     if (__pyx_t_12) {
 
-      /* "src/screening/gap_test_all.pyx":150
+      /* "slopescreening/screening/gap_test_all.pyx":150
  *          curr_bound_q = vec_f[k-1] - coeff_lbd_gamma[k-1]
  *          if curr_bound_q > best_bound_q:
  *             best_bound_q = curr_bound_q             # <<<<<<<<<<<<<<
@@ -2891,7 +3026,7 @@ static PyObject *__pyx_pf_3src_9screening_12gap_test_all_10GapTestAll_4apply_tes
  */
       __pyx_v_best_bound_q = __pyx_v_curr_bound_q;
 
-      /* "src/screening/gap_test_all.pyx":151
+      /* "slopescreening/screening/gap_test_all.pyx":151
  *          if curr_bound_q > best_bound_q:
  *             best_bound_q = curr_bound_q
  *             vec_q_star[k] = k             # <<<<<<<<<<<<<<
@@ -2902,7 +3037,7 @@ static PyObject *__pyx_pf_3src_9screening_12gap_test_all_10GapTestAll_4apply_tes
       if (__pyx_t_19 < 0) __pyx_t_19 += __pyx_pybuffernd_vec_q_star.diminfo[0].shape;
       *__Pyx_BufPtrStrided1d(__pyx_t_5numpy_int_t *, __pyx_pybuffernd_vec_q_star.rcbuffer->pybuffer.buf, __pyx_t_19, __pyx_pybuffernd_vec_q_star.diminfo[0].strides) = __pyx_v_k;
 
-      /* "src/screening/gap_test_all.pyx":149
+      /* "slopescreening/screening/gap_test_all.pyx":149
  *          # 1. Evaluate q*
  *          curr_bound_q = vec_f[k-1] - coeff_lbd_gamma[k-1]
  *          if curr_bound_q > best_bound_q:             # <<<<<<<<<<<<<<
@@ -2912,7 +3047,7 @@ static PyObject *__pyx_pf_3src_9screening_12gap_test_all_10GapTestAll_4apply_tes
       goto __pyx_L7;
     }
 
-    /* "src/screening/gap_test_all.pyx":153
+    /* "slopescreening/screening/gap_test_all.pyx":153
  *             vec_q_star[k] = k
  *          else:
  *             vec_q_star[k] = vec_q_star[k-1]             # <<<<<<<<<<<<<<
@@ -2929,7 +3064,7 @@ static PyObject *__pyx_pf_3src_9screening_12gap_test_all_10GapTestAll_4apply_tes
     __pyx_L7:;
   }
 
-  /* "src/screening/gap_test_all.pyx":156
+  /* "slopescreening/screening/gap_test_all.pyx":156
  * 
  *       # 3. Tests
  *       for l in range(n, 0, -1):             # <<<<<<<<<<<<<<
@@ -2995,7 +3130,7 @@ static PyObject *__pyx_pf_3src_9screening_12gap_test_all_10GapTestAll_4apply_tes
     __Pyx_XDECREF_SET(__pyx_v_l, __pyx_t_1);
     __pyx_t_1 = 0;
 
-    /* "src/screening/gap_test_all.pyx":157
+    /* "slopescreening/screening/gap_test_all.pyx":157
  *       # 3. Tests
  *       for l in range(n, 0, -1):
  *          q = vec_q_star[l]             # <<<<<<<<<<<<<<
@@ -3008,7 +3143,7 @@ static PyObject *__pyx_pf_3src_9screening_12gap_test_all_10GapTestAll_4apply_tes
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
     __pyx_v_q = __pyx_t_14;
 
-    /* "src/screening/gap_test_all.pyx":158
+    /* "slopescreening/screening/gap_test_all.pyx":158
  *       for l in range(n, 0, -1):
  *          q = vec_q_star[l]
  *          while q >= 1:             # <<<<<<<<<<<<<<
@@ -3019,7 +3154,7 @@ static PyObject *__pyx_pf_3src_9screening_12gap_test_all_10GapTestAll_4apply_tes
       __pyx_t_12 = ((__pyx_v_q >= 1) != 0);
       if (!__pyx_t_12) break;
 
-      /* "src/screening/gap_test_all.pyx":160
+      /* "slopescreening/screening/gap_test_all.pyx":160
  *          while q >= 1:
  *             # Implicit definition of the best value of p given q
  *             p = vec_p_star[q]             # <<<<<<<<<<<<<<
@@ -3033,7 +3168,7 @@ static PyObject *__pyx_pf_3src_9screening_12gap_test_all_10GapTestAll_4apply_tes
       __Pyx_XDECREF_SET(__pyx_v_p, __pyx_t_1);
       __pyx_t_1 = 0;
 
-      /* "src/screening/gap_test_all.pyx":163
+      /* "slopescreening/screening/gap_test_all.pyx":163
  * 
  *             # Evaluation of the threshold
  *             tau = vec_f[p-1] - vec_f[q-1] + (coeff_lbd_gamma[q-1] - radius)             # <<<<<<<<<<<<<<
@@ -3065,7 +3200,7 @@ static PyObject *__pyx_pf_3src_9screening_12gap_test_all_10GapTestAll_4apply_tes
       __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
       __pyx_v_tau = __pyx_t_6;
 
-      /* "src/screening/gap_test_all.pyx":166
+      /* "slopescreening/screening/gap_test_all.pyx":166
  * 
  *             # Test
  *             if Atcabs[index[l-1]] >= tau:             # <<<<<<<<<<<<<<
@@ -3089,7 +3224,7 @@ static PyObject *__pyx_pf_3src_9screening_12gap_test_all_10GapTestAll_4apply_tes
       __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
       if (__pyx_t_12) {
 
-        /* "src/screening/gap_test_all.pyx":167
+        /* "slopescreening/screening/gap_test_all.pyx":167
  *             # Test
  *             if Atcabs[index[l-1]] >= tau:
  *                calI_screen[index[l:]] = True             # <<<<<<<<<<<<<<
@@ -3104,7 +3239,7 @@ static PyObject *__pyx_pf_3src_9screening_12gap_test_all_10GapTestAll_4apply_tes
         if (unlikely(PyObject_SetItem(((PyObject *)__pyx_v_calI_screen), __pyx_t_1, Py_True) < 0)) __PYX_ERR(0, 167, __pyx_L1_error)
         __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-        /* "src/screening/gap_test_all.pyx":168
+        /* "slopescreening/screening/gap_test_all.pyx":168
  *             if Atcabs[index[l-1]] >= tau:
  *                calI_screen[index[l:]] = True
  *                return calI_screen             # <<<<<<<<<<<<<<
@@ -3117,7 +3252,7 @@ static PyObject *__pyx_pf_3src_9screening_12gap_test_all_10GapTestAll_4apply_tes
         __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
         goto __pyx_L0;
 
-        /* "src/screening/gap_test_all.pyx":166
+        /* "slopescreening/screening/gap_test_all.pyx":166
  * 
  *             # Test
  *             if Atcabs[index[l-1]] >= tau:             # <<<<<<<<<<<<<<
@@ -3126,7 +3261,7 @@ static PyObject *__pyx_pf_3src_9screening_12gap_test_all_10GapTestAll_4apply_tes
  */
       }
 
-      /* "src/screening/gap_test_all.pyx":171
+      /* "slopescreening/screening/gap_test_all.pyx":171
  * 
  *             # Next critical point
  *             q = vec_q_star[p-1]             # <<<<<<<<<<<<<<
@@ -3143,7 +3278,7 @@ static PyObject *__pyx_pf_3src_9screening_12gap_test_all_10GapTestAll_4apply_tes
       __pyx_v_q = __pyx_t_14;
     }
 
-    /* "src/screening/gap_test_all.pyx":156
+    /* "slopescreening/screening/gap_test_all.pyx":156
  * 
  *       # 3. Tests
  *       for l in range(n, 0, -1):             # <<<<<<<<<<<<<<
@@ -3153,7 +3288,7 @@ static PyObject *__pyx_pf_3src_9screening_12gap_test_all_10GapTestAll_4apply_tes
   }
   __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
 
-  /* "src/screening/gap_test_all.pyx":174
+  /* "slopescreening/screening/gap_test_all.pyx":174
  * 
  * 
  *       calI_screen[index[l:]] = True             # <<<<<<<<<<<<<<
@@ -3168,7 +3303,7 @@ static PyObject *__pyx_pf_3src_9screening_12gap_test_all_10GapTestAll_4apply_tes
   if (unlikely(PyObject_SetItem(((PyObject *)__pyx_v_calI_screen), __pyx_t_5, Py_True) < 0)) __PYX_ERR(0, 174, __pyx_L1_error)
   __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
 
-  /* "src/screening/gap_test_all.pyx":175
+  /* "slopescreening/screening/gap_test_all.pyx":175
  * 
  *       calI_screen[index[l:]] = True
  *       return calI_screen             # <<<<<<<<<<<<<<
@@ -3178,7 +3313,7 @@ static PyObject *__pyx_pf_3src_9screening_12gap_test_all_10GapTestAll_4apply_tes
   __pyx_r = ((PyObject *)__pyx_v_calI_screen);
   goto __pyx_L0;
 
-  /* "src/screening/gap_test_all.pyx":58
+  /* "slopescreening/screening/gap_test_all.pyx":58
  *    @cython.boundscheck(False) # turn off bounds-checking for entire function
  *    # @cython.wraparound(False)  # turn off negative index wrapping for entire function
  *    def apply_test(self,             # <<<<<<<<<<<<<<
@@ -3206,7 +3341,7 @@ static PyObject *__pyx_pf_3src_9screening_12gap_test_all_10GapTestAll_4apply_tes
     __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_vec_p_star.rcbuffer->pybuffer);
     __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_vec_q_star.rcbuffer->pybuffer);
   __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);}
-  __Pyx_AddTraceback("src.screening.gap_test_all.GapTestAll.apply_test", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_AddTraceback("slopescreening.screening.gap_test_all.GapTestAll.apply_test", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __pyx_r = NULL;
   goto __pyx_L2;
   __pyx_L0:;
@@ -3239,19 +3374,19 @@ static PyObject *__pyx_pf_3src_9screening_12gap_test_all_10GapTestAll_4apply_tes
  */
 
 /* Python wrapper */
-static PyObject *__pyx_pw_3src_9screening_12gap_test_all_10GapTestAll_7__reduce_cython__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
-static PyObject *__pyx_pw_3src_9screening_12gap_test_all_10GapTestAll_7__reduce_cython__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
+static PyObject *__pyx_pw_14slopescreening_9screening_12gap_test_all_10GapTestAll_7__reduce_cython__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
+static PyObject *__pyx_pw_14slopescreening_9screening_12gap_test_all_10GapTestAll_7__reduce_cython__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
   PyObject *__pyx_r = 0;
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("__reduce_cython__ (wrapper)", 0);
-  __pyx_r = __pyx_pf_3src_9screening_12gap_test_all_10GapTestAll_6__reduce_cython__(((struct __pyx_obj_3src_9screening_12gap_test_all_GapTestAll *)__pyx_v_self));
+  __pyx_r = __pyx_pf_14slopescreening_9screening_12gap_test_all_10GapTestAll_6__reduce_cython__(((struct __pyx_obj_14slopescreening_9screening_12gap_test_all_GapTestAll *)__pyx_v_self));
 
   /* function exit code */
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-static PyObject *__pyx_pf_3src_9screening_12gap_test_all_10GapTestAll_6__reduce_cython__(CYTHON_UNUSED struct __pyx_obj_3src_9screening_12gap_test_all_GapTestAll *__pyx_v_self) {
+static PyObject *__pyx_pf_14slopescreening_9screening_12gap_test_all_10GapTestAll_6__reduce_cython__(CYTHON_UNUSED struct __pyx_obj_14slopescreening_9screening_12gap_test_all_GapTestAll *__pyx_v_self) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   PyObject *__pyx_t_1 = NULL;
@@ -3281,7 +3416,7 @@ static PyObject *__pyx_pf_3src_9screening_12gap_test_all_10GapTestAll_6__reduce_
   /* function exit code */
   __pyx_L1_error:;
   __Pyx_XDECREF(__pyx_t_1);
-  __Pyx_AddTraceback("src.screening.gap_test_all.GapTestAll.__reduce_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_AddTraceback("slopescreening.screening.gap_test_all.GapTestAll.__reduce_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __pyx_r = NULL;
   __Pyx_XGIVEREF(__pyx_r);
   __Pyx_RefNannyFinishContext();
@@ -3296,19 +3431,19 @@ static PyObject *__pyx_pf_3src_9screening_12gap_test_all_10GapTestAll_6__reduce_
  */
 
 /* Python wrapper */
-static PyObject *__pyx_pw_3src_9screening_12gap_test_all_10GapTestAll_9__setstate_cython__(PyObject *__pyx_v_self, PyObject *__pyx_v___pyx_state); /*proto*/
-static PyObject *__pyx_pw_3src_9screening_12gap_test_all_10GapTestAll_9__setstate_cython__(PyObject *__pyx_v_self, PyObject *__pyx_v___pyx_state) {
+static PyObject *__pyx_pw_14slopescreening_9screening_12gap_test_all_10GapTestAll_9__setstate_cython__(PyObject *__pyx_v_self, PyObject *__pyx_v___pyx_state); /*proto*/
+static PyObject *__pyx_pw_14slopescreening_9screening_12gap_test_all_10GapTestAll_9__setstate_cython__(PyObject *__pyx_v_self, PyObject *__pyx_v___pyx_state) {
   PyObject *__pyx_r = 0;
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("__setstate_cython__ (wrapper)", 0);
-  __pyx_r = __pyx_pf_3src_9screening_12gap_test_all_10GapTestAll_8__setstate_cython__(((struct __pyx_obj_3src_9screening_12gap_test_all_GapTestAll *)__pyx_v_self), ((PyObject *)__pyx_v___pyx_state));
+  __pyx_r = __pyx_pf_14slopescreening_9screening_12gap_test_all_10GapTestAll_8__setstate_cython__(((struct __pyx_obj_14slopescreening_9screening_12gap_test_all_GapTestAll *)__pyx_v_self), ((PyObject *)__pyx_v___pyx_state));
 
   /* function exit code */
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-static PyObject *__pyx_pf_3src_9screening_12gap_test_all_10GapTestAll_8__setstate_cython__(CYTHON_UNUSED struct __pyx_obj_3src_9screening_12gap_test_all_GapTestAll *__pyx_v_self, CYTHON_UNUSED PyObject *__pyx_v___pyx_state) {
+static PyObject *__pyx_pf_14slopescreening_9screening_12gap_test_all_10GapTestAll_8__setstate_cython__(CYTHON_UNUSED struct __pyx_obj_14slopescreening_9screening_12gap_test_all_GapTestAll *__pyx_v_self, CYTHON_UNUSED PyObject *__pyx_v___pyx_state) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   PyObject *__pyx_t_1 = NULL;
@@ -3338,14 +3473,14 @@ static PyObject *__pyx_pf_3src_9screening_12gap_test_all_10GapTestAll_8__setstat
   /* function exit code */
   __pyx_L1_error:;
   __Pyx_XDECREF(__pyx_t_1);
-  __Pyx_AddTraceback("src.screening.gap_test_all.GapTestAll.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_AddTraceback("slopescreening.screening.gap_test_all.GapTestAll.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __pyx_r = NULL;
   __Pyx_XGIVEREF(__pyx_r);
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":735
+/* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":734
  * ctypedef npy_cdouble     complex_t
  * 
  * cdef inline object PyArray_MultiIterNew1(a):             # <<<<<<<<<<<<<<
@@ -3362,7 +3497,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew1(PyObject *__
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("PyArray_MultiIterNew1", 0);
 
-  /* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":736
+  /* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":735
  * 
  * cdef inline object PyArray_MultiIterNew1(a):
  *     return PyArray_MultiIterNew(1, <void*>a)             # <<<<<<<<<<<<<<
@@ -3370,13 +3505,13 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew1(PyObject *__
  * cdef inline object PyArray_MultiIterNew2(a, b):
  */
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyArray_MultiIterNew(1, ((void *)__pyx_v_a)); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 736, __pyx_L1_error)
+  __pyx_t_1 = PyArray_MultiIterNew(1, ((void *)__pyx_v_a)); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 735, __pyx_L1_error)
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_r = __pyx_t_1;
   __pyx_t_1 = 0;
   goto __pyx_L0;
 
-  /* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":735
+  /* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":734
  * ctypedef npy_cdouble     complex_t
  * 
  * cdef inline object PyArray_MultiIterNew1(a):             # <<<<<<<<<<<<<<
@@ -3395,7 +3530,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew1(PyObject *__
   return __pyx_r;
 }
 
-/* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":738
+/* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":737
  *     return PyArray_MultiIterNew(1, <void*>a)
  * 
  * cdef inline object PyArray_MultiIterNew2(a, b):             # <<<<<<<<<<<<<<
@@ -3412,7 +3547,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew2(PyObject *__
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("PyArray_MultiIterNew2", 0);
 
-  /* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":739
+  /* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":738
  * 
  * cdef inline object PyArray_MultiIterNew2(a, b):
  *     return PyArray_MultiIterNew(2, <void*>a, <void*>b)             # <<<<<<<<<<<<<<
@@ -3420,13 +3555,13 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew2(PyObject *__
  * cdef inline object PyArray_MultiIterNew3(a, b, c):
  */
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyArray_MultiIterNew(2, ((void *)__pyx_v_a), ((void *)__pyx_v_b)); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 739, __pyx_L1_error)
+  __pyx_t_1 = PyArray_MultiIterNew(2, ((void *)__pyx_v_a), ((void *)__pyx_v_b)); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 738, __pyx_L1_error)
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_r = __pyx_t_1;
   __pyx_t_1 = 0;
   goto __pyx_L0;
 
-  /* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":738
+  /* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":737
  *     return PyArray_MultiIterNew(1, <void*>a)
  * 
  * cdef inline object PyArray_MultiIterNew2(a, b):             # <<<<<<<<<<<<<<
@@ -3445,7 +3580,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew2(PyObject *__
   return __pyx_r;
 }
 
-/* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":741
+/* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":740
  *     return PyArray_MultiIterNew(2, <void*>a, <void*>b)
  * 
  * cdef inline object PyArray_MultiIterNew3(a, b, c):             # <<<<<<<<<<<<<<
@@ -3462,7 +3597,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew3(PyObject *__
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("PyArray_MultiIterNew3", 0);
 
-  /* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":742
+  /* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":741
  * 
  * cdef inline object PyArray_MultiIterNew3(a, b, c):
  *     return PyArray_MultiIterNew(3, <void*>a, <void*>b, <void*> c)             # <<<<<<<<<<<<<<
@@ -3470,13 +3605,13 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew3(PyObject *__
  * cdef inline object PyArray_MultiIterNew4(a, b, c, d):
  */
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyArray_MultiIterNew(3, ((void *)__pyx_v_a), ((void *)__pyx_v_b), ((void *)__pyx_v_c)); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 742, __pyx_L1_error)
+  __pyx_t_1 = PyArray_MultiIterNew(3, ((void *)__pyx_v_a), ((void *)__pyx_v_b), ((void *)__pyx_v_c)); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 741, __pyx_L1_error)
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_r = __pyx_t_1;
   __pyx_t_1 = 0;
   goto __pyx_L0;
 
-  /* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":741
+  /* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":740
  *     return PyArray_MultiIterNew(2, <void*>a, <void*>b)
  * 
  * cdef inline object PyArray_MultiIterNew3(a, b, c):             # <<<<<<<<<<<<<<
@@ -3495,7 +3630,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew3(PyObject *__
   return __pyx_r;
 }
 
-/* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":744
+/* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":743
  *     return PyArray_MultiIterNew(3, <void*>a, <void*>b, <void*> c)
  * 
  * cdef inline object PyArray_MultiIterNew4(a, b, c, d):             # <<<<<<<<<<<<<<
@@ -3512,7 +3647,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew4(PyObject *__
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("PyArray_MultiIterNew4", 0);
 
-  /* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":745
+  /* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":744
  * 
  * cdef inline object PyArray_MultiIterNew4(a, b, c, d):
  *     return PyArray_MultiIterNew(4, <void*>a, <void*>b, <void*>c, <void*> d)             # <<<<<<<<<<<<<<
@@ -3520,13 +3655,13 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew4(PyObject *__
  * cdef inline object PyArray_MultiIterNew5(a, b, c, d, e):
  */
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyArray_MultiIterNew(4, ((void *)__pyx_v_a), ((void *)__pyx_v_b), ((void *)__pyx_v_c), ((void *)__pyx_v_d)); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 745, __pyx_L1_error)
+  __pyx_t_1 = PyArray_MultiIterNew(4, ((void *)__pyx_v_a), ((void *)__pyx_v_b), ((void *)__pyx_v_c), ((void *)__pyx_v_d)); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 744, __pyx_L1_error)
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_r = __pyx_t_1;
   __pyx_t_1 = 0;
   goto __pyx_L0;
 
-  /* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":744
+  /* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":743
  *     return PyArray_MultiIterNew(3, <void*>a, <void*>b, <void*> c)
  * 
  * cdef inline object PyArray_MultiIterNew4(a, b, c, d):             # <<<<<<<<<<<<<<
@@ -3545,7 +3680,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew4(PyObject *__
   return __pyx_r;
 }
 
-/* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":747
+/* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":746
  *     return PyArray_MultiIterNew(4, <void*>a, <void*>b, <void*>c, <void*> d)
  * 
  * cdef inline object PyArray_MultiIterNew5(a, b, c, d, e):             # <<<<<<<<<<<<<<
@@ -3562,7 +3697,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew5(PyObject *__
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("PyArray_MultiIterNew5", 0);
 
-  /* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":748
+  /* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":747
  * 
  * cdef inline object PyArray_MultiIterNew5(a, b, c, d, e):
  *     return PyArray_MultiIterNew(5, <void*>a, <void*>b, <void*>c, <void*> d, <void*> e)             # <<<<<<<<<<<<<<
@@ -3570,13 +3705,13 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew5(PyObject *__
  * cdef inline tuple PyDataType_SHAPE(dtype d):
  */
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyArray_MultiIterNew(5, ((void *)__pyx_v_a), ((void *)__pyx_v_b), ((void *)__pyx_v_c), ((void *)__pyx_v_d), ((void *)__pyx_v_e)); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 748, __pyx_L1_error)
+  __pyx_t_1 = PyArray_MultiIterNew(5, ((void *)__pyx_v_a), ((void *)__pyx_v_b), ((void *)__pyx_v_c), ((void *)__pyx_v_d), ((void *)__pyx_v_e)); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 747, __pyx_L1_error)
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_r = __pyx_t_1;
   __pyx_t_1 = 0;
   goto __pyx_L0;
 
-  /* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":747
+  /* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":746
  *     return PyArray_MultiIterNew(4, <void*>a, <void*>b, <void*>c, <void*> d)
  * 
  * cdef inline object PyArray_MultiIterNew5(a, b, c, d, e):             # <<<<<<<<<<<<<<
@@ -3595,7 +3730,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew5(PyObject *__
   return __pyx_r;
 }
 
-/* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":750
+/* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":749
  *     return PyArray_MultiIterNew(5, <void*>a, <void*>b, <void*>c, <void*> d, <void*> e)
  * 
  * cdef inline tuple PyDataType_SHAPE(dtype d):             # <<<<<<<<<<<<<<
@@ -3609,7 +3744,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyDataType_SHAPE(PyArray_Descr *__
   int __pyx_t_1;
   __Pyx_RefNannySetupContext("PyDataType_SHAPE", 0);
 
-  /* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":751
+  /* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":750
  * 
  * cdef inline tuple PyDataType_SHAPE(dtype d):
  *     if PyDataType_HASSUBARRAY(d):             # <<<<<<<<<<<<<<
@@ -3619,7 +3754,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyDataType_SHAPE(PyArray_Descr *__
   __pyx_t_1 = (PyDataType_HASSUBARRAY(__pyx_v_d) != 0);
   if (__pyx_t_1) {
 
-    /* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":752
+    /* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":751
  * cdef inline tuple PyDataType_SHAPE(dtype d):
  *     if PyDataType_HASSUBARRAY(d):
  *         return <tuple>d.subarray.shape             # <<<<<<<<<<<<<<
@@ -3631,7 +3766,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyDataType_SHAPE(PyArray_Descr *__
     __pyx_r = ((PyObject*)__pyx_v_d->subarray->shape);
     goto __pyx_L0;
 
-    /* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":751
+    /* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":750
  * 
  * cdef inline tuple PyDataType_SHAPE(dtype d):
  *     if PyDataType_HASSUBARRAY(d):             # <<<<<<<<<<<<<<
@@ -3640,7 +3775,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyDataType_SHAPE(PyArray_Descr *__
  */
   }
 
-  /* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":754
+  /* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":753
  *         return <tuple>d.subarray.shape
  *     else:
  *         return ()             # <<<<<<<<<<<<<<
@@ -3654,7 +3789,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyDataType_SHAPE(PyArray_Descr *__
     goto __pyx_L0;
   }
 
-  /* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":750
+  /* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":749
  *     return PyArray_MultiIterNew(5, <void*>a, <void*>b, <void*>c, <void*> d, <void*> e)
  * 
  * cdef inline tuple PyDataType_SHAPE(dtype d):             # <<<<<<<<<<<<<<
@@ -3669,7 +3804,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyDataType_SHAPE(PyArray_Descr *__
   return __pyx_r;
 }
 
-/* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":929
+/* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":928
  *     int _import_umath() except -1
  * 
  * cdef inline void set_array_base(ndarray arr, object base):             # <<<<<<<<<<<<<<
@@ -3681,7 +3816,7 @@ static CYTHON_INLINE void __pyx_f_5numpy_set_array_base(PyArrayObject *__pyx_v_a
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("set_array_base", 0);
 
-  /* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":930
+  /* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":929
  * 
  * cdef inline void set_array_base(ndarray arr, object base):
  *     Py_INCREF(base) # important to do this before stealing the reference below!             # <<<<<<<<<<<<<<
@@ -3690,7 +3825,7 @@ static CYTHON_INLINE void __pyx_f_5numpy_set_array_base(PyArrayObject *__pyx_v_a
  */
   Py_INCREF(__pyx_v_base);
 
-  /* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":931
+  /* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":930
  * cdef inline void set_array_base(ndarray arr, object base):
  *     Py_INCREF(base) # important to do this before stealing the reference below!
  *     PyArray_SetBaseObject(arr, base)             # <<<<<<<<<<<<<<
@@ -3699,7 +3834,7 @@ static CYTHON_INLINE void __pyx_f_5numpy_set_array_base(PyArrayObject *__pyx_v_a
  */
   (void)(PyArray_SetBaseObject(__pyx_v_arr, __pyx_v_base));
 
-  /* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":929
+  /* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":928
  *     int _import_umath() except -1
  * 
  * cdef inline void set_array_base(ndarray arr, object base):             # <<<<<<<<<<<<<<
@@ -3711,7 +3846,7 @@ static CYTHON_INLINE void __pyx_f_5numpy_set_array_base(PyArrayObject *__pyx_v_a
   __Pyx_RefNannyFinishContext();
 }
 
-/* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":933
+/* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":932
  *     PyArray_SetBaseObject(arr, base)
  * 
  * cdef inline object get_array_base(ndarray arr):             # <<<<<<<<<<<<<<
@@ -3726,7 +3861,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_get_array_base(PyArrayObject *__py
   int __pyx_t_1;
   __Pyx_RefNannySetupContext("get_array_base", 0);
 
-  /* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":934
+  /* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":933
  * 
  * cdef inline object get_array_base(ndarray arr):
  *     base = PyArray_BASE(arr)             # <<<<<<<<<<<<<<
@@ -3735,7 +3870,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_get_array_base(PyArrayObject *__py
  */
   __pyx_v_base = PyArray_BASE(__pyx_v_arr);
 
-  /* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":935
+  /* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":934
  * cdef inline object get_array_base(ndarray arr):
  *     base = PyArray_BASE(arr)
  *     if base is NULL:             # <<<<<<<<<<<<<<
@@ -3745,7 +3880,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_get_array_base(PyArrayObject *__py
   __pyx_t_1 = ((__pyx_v_base == NULL) != 0);
   if (__pyx_t_1) {
 
-    /* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":936
+    /* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":935
  *     base = PyArray_BASE(arr)
  *     if base is NULL:
  *         return None             # <<<<<<<<<<<<<<
@@ -3756,7 +3891,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_get_array_base(PyArrayObject *__py
     __pyx_r = Py_None; __Pyx_INCREF(Py_None);
     goto __pyx_L0;
 
-    /* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":935
+    /* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":934
  * cdef inline object get_array_base(ndarray arr):
  *     base = PyArray_BASE(arr)
  *     if base is NULL:             # <<<<<<<<<<<<<<
@@ -3765,7 +3900,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_get_array_base(PyArrayObject *__py
  */
   }
 
-  /* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":937
+  /* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":936
  *     if base is NULL:
  *         return None
  *     return <object>base             # <<<<<<<<<<<<<<
@@ -3777,7 +3912,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_get_array_base(PyArrayObject *__py
   __pyx_r = ((PyObject *)__pyx_v_base);
   goto __pyx_L0;
 
-  /* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":933
+  /* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":932
  *     PyArray_SetBaseObject(arr, base)
  * 
  * cdef inline object get_array_base(ndarray arr):             # <<<<<<<<<<<<<<
@@ -3792,7 +3927,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_get_array_base(PyArrayObject *__py
   return __pyx_r;
 }
 
-/* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":941
+/* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":940
  * # Versions of the import_* functions which are more suitable for
  * # Cython code.
  * cdef inline int import_array() except -1:             # <<<<<<<<<<<<<<
@@ -3816,7 +3951,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_array(void) {
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("import_array", 0);
 
-  /* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":942
+  /* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":941
  * # Cython code.
  * cdef inline int import_array() except -1:
  *     try:             # <<<<<<<<<<<<<<
@@ -3832,16 +3967,16 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_array(void) {
     __Pyx_XGOTREF(__pyx_t_3);
     /*try:*/ {
 
-      /* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":943
+      /* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":942
  * cdef inline int import_array() except -1:
  *     try:
  *         __pyx_import_array()             # <<<<<<<<<<<<<<
  *     except Exception:
  *         raise ImportError("numpy.core.multiarray failed to import")
  */
-      __pyx_t_4 = _import_array(); if (unlikely(__pyx_t_4 == ((int)-1))) __PYX_ERR(2, 943, __pyx_L3_error)
+      __pyx_t_4 = _import_array(); if (unlikely(__pyx_t_4 == ((int)-1))) __PYX_ERR(2, 942, __pyx_L3_error)
 
-      /* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":942
+      /* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":941
  * # Cython code.
  * cdef inline int import_array() except -1:
  *     try:             # <<<<<<<<<<<<<<
@@ -3855,7 +3990,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_array(void) {
     goto __pyx_L8_try_end;
     __pyx_L3_error:;
 
-    /* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":944
+    /* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":943
  *     try:
  *         __pyx_import_array()
  *     except Exception:             # <<<<<<<<<<<<<<
@@ -3865,28 +4000,28 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_array(void) {
     __pyx_t_4 = __Pyx_PyErr_ExceptionMatches(((PyObject *)(&((PyTypeObject*)PyExc_Exception)[0])));
     if (__pyx_t_4) {
       __Pyx_AddTraceback("numpy.import_array", __pyx_clineno, __pyx_lineno, __pyx_filename);
-      if (__Pyx_GetException(&__pyx_t_5, &__pyx_t_6, &__pyx_t_7) < 0) __PYX_ERR(2, 944, __pyx_L5_except_error)
+      if (__Pyx_GetException(&__pyx_t_5, &__pyx_t_6, &__pyx_t_7) < 0) __PYX_ERR(2, 943, __pyx_L5_except_error)
       __Pyx_GOTREF(__pyx_t_5);
       __Pyx_GOTREF(__pyx_t_6);
       __Pyx_GOTREF(__pyx_t_7);
 
-      /* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":945
+      /* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":944
  *         __pyx_import_array()
  *     except Exception:
  *         raise ImportError("numpy.core.multiarray failed to import")             # <<<<<<<<<<<<<<
  * 
  * cdef inline int import_umath() except -1:
  */
-      __pyx_t_8 = __Pyx_PyObject_Call(__pyx_builtin_ImportError, __pyx_tuple__4, NULL); if (unlikely(!__pyx_t_8)) __PYX_ERR(2, 945, __pyx_L5_except_error)
+      __pyx_t_8 = __Pyx_PyObject_Call(__pyx_builtin_ImportError, __pyx_tuple__4, NULL); if (unlikely(!__pyx_t_8)) __PYX_ERR(2, 944, __pyx_L5_except_error)
       __Pyx_GOTREF(__pyx_t_8);
       __Pyx_Raise(__pyx_t_8, 0, 0, 0);
       __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
-      __PYX_ERR(2, 945, __pyx_L5_except_error)
+      __PYX_ERR(2, 944, __pyx_L5_except_error)
     }
     goto __pyx_L5_except_error;
     __pyx_L5_except_error:;
 
-    /* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":942
+    /* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":941
  * # Cython code.
  * cdef inline int import_array() except -1:
  *     try:             # <<<<<<<<<<<<<<
@@ -3901,7 +4036,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_array(void) {
     __pyx_L8_try_end:;
   }
 
-  /* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":941
+  /* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":940
  * # Versions of the import_* functions which are more suitable for
  * # Cython code.
  * cdef inline int import_array() except -1:             # <<<<<<<<<<<<<<
@@ -3924,7 +4059,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_array(void) {
   return __pyx_r;
 }
 
-/* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":947
+/* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":946
  *         raise ImportError("numpy.core.multiarray failed to import")
  * 
  * cdef inline int import_umath() except -1:             # <<<<<<<<<<<<<<
@@ -3948,7 +4083,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_umath(void) {
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("import_umath", 0);
 
-  /* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":948
+  /* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":947
  * 
  * cdef inline int import_umath() except -1:
  *     try:             # <<<<<<<<<<<<<<
@@ -3964,16 +4099,16 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_umath(void) {
     __Pyx_XGOTREF(__pyx_t_3);
     /*try:*/ {
 
-      /* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":949
+      /* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":948
  * cdef inline int import_umath() except -1:
  *     try:
  *         _import_umath()             # <<<<<<<<<<<<<<
  *     except Exception:
  *         raise ImportError("numpy.core.umath failed to import")
  */
-      __pyx_t_4 = _import_umath(); if (unlikely(__pyx_t_4 == ((int)-1))) __PYX_ERR(2, 949, __pyx_L3_error)
+      __pyx_t_4 = _import_umath(); if (unlikely(__pyx_t_4 == ((int)-1))) __PYX_ERR(2, 948, __pyx_L3_error)
 
-      /* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":948
+      /* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":947
  * 
  * cdef inline int import_umath() except -1:
  *     try:             # <<<<<<<<<<<<<<
@@ -3987,7 +4122,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_umath(void) {
     goto __pyx_L8_try_end;
     __pyx_L3_error:;
 
-    /* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":950
+    /* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":949
  *     try:
  *         _import_umath()
  *     except Exception:             # <<<<<<<<<<<<<<
@@ -3997,28 +4132,28 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_umath(void) {
     __pyx_t_4 = __Pyx_PyErr_ExceptionMatches(((PyObject *)(&((PyTypeObject*)PyExc_Exception)[0])));
     if (__pyx_t_4) {
       __Pyx_AddTraceback("numpy.import_umath", __pyx_clineno, __pyx_lineno, __pyx_filename);
-      if (__Pyx_GetException(&__pyx_t_5, &__pyx_t_6, &__pyx_t_7) < 0) __PYX_ERR(2, 950, __pyx_L5_except_error)
+      if (__Pyx_GetException(&__pyx_t_5, &__pyx_t_6, &__pyx_t_7) < 0) __PYX_ERR(2, 949, __pyx_L5_except_error)
       __Pyx_GOTREF(__pyx_t_5);
       __Pyx_GOTREF(__pyx_t_6);
       __Pyx_GOTREF(__pyx_t_7);
 
-      /* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":951
+      /* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":950
  *         _import_umath()
  *     except Exception:
  *         raise ImportError("numpy.core.umath failed to import")             # <<<<<<<<<<<<<<
  * 
  * cdef inline int import_ufunc() except -1:
  */
-      __pyx_t_8 = __Pyx_PyObject_Call(__pyx_builtin_ImportError, __pyx_tuple__5, NULL); if (unlikely(!__pyx_t_8)) __PYX_ERR(2, 951, __pyx_L5_except_error)
+      __pyx_t_8 = __Pyx_PyObject_Call(__pyx_builtin_ImportError, __pyx_tuple__5, NULL); if (unlikely(!__pyx_t_8)) __PYX_ERR(2, 950, __pyx_L5_except_error)
       __Pyx_GOTREF(__pyx_t_8);
       __Pyx_Raise(__pyx_t_8, 0, 0, 0);
       __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
-      __PYX_ERR(2, 951, __pyx_L5_except_error)
+      __PYX_ERR(2, 950, __pyx_L5_except_error)
     }
     goto __pyx_L5_except_error;
     __pyx_L5_except_error:;
 
-    /* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":948
+    /* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":947
  * 
  * cdef inline int import_umath() except -1:
  *     try:             # <<<<<<<<<<<<<<
@@ -4033,7 +4168,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_umath(void) {
     __pyx_L8_try_end:;
   }
 
-  /* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":947
+  /* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":946
  *         raise ImportError("numpy.core.multiarray failed to import")
  * 
  * cdef inline int import_umath() except -1:             # <<<<<<<<<<<<<<
@@ -4056,7 +4191,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_umath(void) {
   return __pyx_r;
 }
 
-/* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":953
+/* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":952
  *         raise ImportError("numpy.core.umath failed to import")
  * 
  * cdef inline int import_ufunc() except -1:             # <<<<<<<<<<<<<<
@@ -4080,7 +4215,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_ufunc(void) {
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("import_ufunc", 0);
 
-  /* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":954
+  /* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":953
  * 
  * cdef inline int import_ufunc() except -1:
  *     try:             # <<<<<<<<<<<<<<
@@ -4096,16 +4231,16 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_ufunc(void) {
     __Pyx_XGOTREF(__pyx_t_3);
     /*try:*/ {
 
-      /* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":955
+      /* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":954
  * cdef inline int import_ufunc() except -1:
  *     try:
  *         _import_umath()             # <<<<<<<<<<<<<<
  *     except Exception:
  *         raise ImportError("numpy.core.umath failed to import")
  */
-      __pyx_t_4 = _import_umath(); if (unlikely(__pyx_t_4 == ((int)-1))) __PYX_ERR(2, 955, __pyx_L3_error)
+      __pyx_t_4 = _import_umath(); if (unlikely(__pyx_t_4 == ((int)-1))) __PYX_ERR(2, 954, __pyx_L3_error)
 
-      /* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":954
+      /* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":953
  * 
  * cdef inline int import_ufunc() except -1:
  *     try:             # <<<<<<<<<<<<<<
@@ -4119,7 +4254,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_ufunc(void) {
     goto __pyx_L8_try_end;
     __pyx_L3_error:;
 
-    /* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":956
+    /* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":955
  *     try:
  *         _import_umath()
  *     except Exception:             # <<<<<<<<<<<<<<
@@ -4129,28 +4264,28 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_ufunc(void) {
     __pyx_t_4 = __Pyx_PyErr_ExceptionMatches(((PyObject *)(&((PyTypeObject*)PyExc_Exception)[0])));
     if (__pyx_t_4) {
       __Pyx_AddTraceback("numpy.import_ufunc", __pyx_clineno, __pyx_lineno, __pyx_filename);
-      if (__Pyx_GetException(&__pyx_t_5, &__pyx_t_6, &__pyx_t_7) < 0) __PYX_ERR(2, 956, __pyx_L5_except_error)
+      if (__Pyx_GetException(&__pyx_t_5, &__pyx_t_6, &__pyx_t_7) < 0) __PYX_ERR(2, 955, __pyx_L5_except_error)
       __Pyx_GOTREF(__pyx_t_5);
       __Pyx_GOTREF(__pyx_t_6);
       __Pyx_GOTREF(__pyx_t_7);
 
-      /* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":957
+      /* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":956
  *         _import_umath()
  *     except Exception:
  *         raise ImportError("numpy.core.umath failed to import")             # <<<<<<<<<<<<<<
  * 
  * cdef extern from *:
  */
-      __pyx_t_8 = __Pyx_PyObject_Call(__pyx_builtin_ImportError, __pyx_tuple__5, NULL); if (unlikely(!__pyx_t_8)) __PYX_ERR(2, 957, __pyx_L5_except_error)
+      __pyx_t_8 = __Pyx_PyObject_Call(__pyx_builtin_ImportError, __pyx_tuple__5, NULL); if (unlikely(!__pyx_t_8)) __PYX_ERR(2, 956, __pyx_L5_except_error)
       __Pyx_GOTREF(__pyx_t_8);
       __Pyx_Raise(__pyx_t_8, 0, 0, 0);
       __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
-      __PYX_ERR(2, 957, __pyx_L5_except_error)
+      __PYX_ERR(2, 956, __pyx_L5_except_error)
     }
     goto __pyx_L5_except_error;
     __pyx_L5_except_error:;
 
-    /* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":954
+    /* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":953
  * 
  * cdef inline int import_ufunc() except -1:
  *     try:             # <<<<<<<<<<<<<<
@@ -4165,7 +4300,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_ufunc(void) {
     __pyx_L8_try_end:;
   }
 
-  /* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":953
+  /* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":952
  *         raise ImportError("numpy.core.umath failed to import")
  * 
  * cdef inline int import_ufunc() except -1:             # <<<<<<<<<<<<<<
@@ -4188,7 +4323,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_ufunc(void) {
   return __pyx_r;
 }
 
-/* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":967
+/* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":966
  * 
  * 
  * cdef inline bint is_timedelta64_object(object obj):             # <<<<<<<<<<<<<<
@@ -4201,7 +4336,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_is_timedelta64_object(PyObject *__pyx_v_
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("is_timedelta64_object", 0);
 
-  /* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":979
+  /* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":978
  *     bool
  *     """
  *     return PyObject_TypeCheck(obj, &PyTimedeltaArrType_Type)             # <<<<<<<<<<<<<<
@@ -4211,7 +4346,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_is_timedelta64_object(PyObject *__pyx_v_
   __pyx_r = PyObject_TypeCheck(__pyx_v_obj, (&PyTimedeltaArrType_Type));
   goto __pyx_L0;
 
-  /* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":967
+  /* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":966
  * 
  * 
  * cdef inline bint is_timedelta64_object(object obj):             # <<<<<<<<<<<<<<
@@ -4225,7 +4360,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_is_timedelta64_object(PyObject *__pyx_v_
   return __pyx_r;
 }
 
-/* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":982
+/* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":981
  * 
  * 
  * cdef inline bint is_datetime64_object(object obj):             # <<<<<<<<<<<<<<
@@ -4238,7 +4373,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_is_datetime64_object(PyObject *__pyx_v_o
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("is_datetime64_object", 0);
 
-  /* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":994
+  /* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":993
  *     bool
  *     """
  *     return PyObject_TypeCheck(obj, &PyDatetimeArrType_Type)             # <<<<<<<<<<<<<<
@@ -4248,7 +4383,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_is_datetime64_object(PyObject *__pyx_v_o
   __pyx_r = PyObject_TypeCheck(__pyx_v_obj, (&PyDatetimeArrType_Type));
   goto __pyx_L0;
 
-  /* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":982
+  /* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":981
  * 
  * 
  * cdef inline bint is_datetime64_object(object obj):             # <<<<<<<<<<<<<<
@@ -4262,7 +4397,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_is_datetime64_object(PyObject *__pyx_v_o
   return __pyx_r;
 }
 
-/* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":997
+/* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":996
  * 
  * 
  * cdef inline npy_datetime get_datetime64_value(object obj) nogil:             # <<<<<<<<<<<<<<
@@ -4273,7 +4408,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_is_datetime64_object(PyObject *__pyx_v_o
 static CYTHON_INLINE npy_datetime __pyx_f_5numpy_get_datetime64_value(PyObject *__pyx_v_obj) {
   npy_datetime __pyx_r;
 
-  /* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":1004
+  /* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":1003
  *     also needed.  That can be found using `get_datetime64_unit`.
  *     """
  *     return (<PyDatetimeScalarObject*>obj).obval             # <<<<<<<<<<<<<<
@@ -4283,7 +4418,7 @@ static CYTHON_INLINE npy_datetime __pyx_f_5numpy_get_datetime64_value(PyObject *
   __pyx_r = ((PyDatetimeScalarObject *)__pyx_v_obj)->obval;
   goto __pyx_L0;
 
-  /* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":997
+  /* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":996
  * 
  * 
  * cdef inline npy_datetime get_datetime64_value(object obj) nogil:             # <<<<<<<<<<<<<<
@@ -4296,7 +4431,7 @@ static CYTHON_INLINE npy_datetime __pyx_f_5numpy_get_datetime64_value(PyObject *
   return __pyx_r;
 }
 
-/* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":1007
+/* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":1006
  * 
  * 
  * cdef inline npy_timedelta get_timedelta64_value(object obj) nogil:             # <<<<<<<<<<<<<<
@@ -4307,7 +4442,7 @@ static CYTHON_INLINE npy_datetime __pyx_f_5numpy_get_datetime64_value(PyObject *
 static CYTHON_INLINE npy_timedelta __pyx_f_5numpy_get_timedelta64_value(PyObject *__pyx_v_obj) {
   npy_timedelta __pyx_r;
 
-  /* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":1011
+  /* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":1010
  *     returns the int64 value underlying scalar numpy timedelta64 object
  *     """
  *     return (<PyTimedeltaScalarObject*>obj).obval             # <<<<<<<<<<<<<<
@@ -4317,7 +4452,7 @@ static CYTHON_INLINE npy_timedelta __pyx_f_5numpy_get_timedelta64_value(PyObject
   __pyx_r = ((PyTimedeltaScalarObject *)__pyx_v_obj)->obval;
   goto __pyx_L0;
 
-  /* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":1007
+  /* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":1006
  * 
  * 
  * cdef inline npy_timedelta get_timedelta64_value(object obj) nogil:             # <<<<<<<<<<<<<<
@@ -4330,7 +4465,7 @@ static CYTHON_INLINE npy_timedelta __pyx_f_5numpy_get_timedelta64_value(PyObject
   return __pyx_r;
 }
 
-/* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":1014
+/* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":1013
  * 
  * 
  * cdef inline NPY_DATETIMEUNIT get_datetime64_unit(object obj) nogil:             # <<<<<<<<<<<<<<
@@ -4341,7 +4476,7 @@ static CYTHON_INLINE npy_timedelta __pyx_f_5numpy_get_timedelta64_value(PyObject
 static CYTHON_INLINE NPY_DATETIMEUNIT __pyx_f_5numpy_get_datetime64_unit(PyObject *__pyx_v_obj) {
   NPY_DATETIMEUNIT __pyx_r;
 
-  /* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":1018
+  /* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":1017
  *     returns the unit part of the dtype for a numpy datetime64 object.
  *     """
  *     return <NPY_DATETIMEUNIT>(<PyDatetimeScalarObject*>obj).obmeta.base             # <<<<<<<<<<<<<<
@@ -4349,7 +4484,7 @@ static CYTHON_INLINE NPY_DATETIMEUNIT __pyx_f_5numpy_get_datetime64_unit(PyObjec
   __pyx_r = ((NPY_DATETIMEUNIT)((PyDatetimeScalarObject *)__pyx_v_obj)->obmeta.base);
   goto __pyx_L0;
 
-  /* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":1014
+  /* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":1013
  * 
  * 
  * cdef inline NPY_DATETIMEUNIT get_datetime64_unit(object obj) nogil:             # <<<<<<<<<<<<<<
@@ -4362,7 +4497,7 @@ static CYTHON_INLINE NPY_DATETIMEUNIT __pyx_f_5numpy_get_datetime64_unit(PyObjec
   return __pyx_r;
 }
 
-static PyObject *__pyx_tp_new_3src_9screening_12gap_test_all_GapTestAll(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
+static PyObject *__pyx_tp_new_14slopescreening_9screening_12gap_test_all_GapTestAll(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
   PyObject *o;
   if (likely((t->tp_flags & Py_TPFLAGS_IS_ABSTRACT) == 0)) {
     o = (*t->tp_alloc)(t, 0);
@@ -4373,7 +4508,7 @@ static PyObject *__pyx_tp_new_3src_9screening_12gap_test_all_GapTestAll(PyTypeOb
   return o;
 }
 
-static void __pyx_tp_dealloc_3src_9screening_12gap_test_all_GapTestAll(PyObject *o) {
+static void __pyx_tp_dealloc_14slopescreening_9screening_12gap_test_all_GapTestAll(PyObject *o) {
   #if CYTHON_USE_TP_FINALIZE
   if (unlikely(PyType_HasFeature(Py_TYPE(o), Py_TPFLAGS_HAVE_FINALIZE) && Py_TYPE(o)->tp_finalize) && (!PyType_IS_GC(Py_TYPE(o)) || !_PyGC_FINALIZED(o))) {
     if (PyObject_CallFinalizerFromDealloc(o)) return;
@@ -4383,26 +4518,26 @@ static void __pyx_tp_dealloc_3src_9screening_12gap_test_all_GapTestAll(PyObject
     PyObject *etype, *eval, *etb;
     PyErr_Fetch(&etype, &eval, &etb);
     __Pyx_SET_REFCNT(o, Py_REFCNT(o) + 1);
-    __pyx_pw_3src_9screening_12gap_test_all_10GapTestAll_3__dealloc__(o);
+    __pyx_pw_14slopescreening_9screening_12gap_test_all_10GapTestAll_3__dealloc__(o);
     __Pyx_SET_REFCNT(o, Py_REFCNT(o) - 1);
     PyErr_Restore(etype, eval, etb);
   }
   (*Py_TYPE(o)->tp_free)(o);
 }
 
-static PyMethodDef __pyx_methods_3src_9screening_12gap_test_all_GapTestAll[] = {
-  {"apply_test", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_pw_3src_9screening_12gap_test_all_10GapTestAll_5apply_test, METH_VARARGS|METH_KEYWORDS, __pyx_doc_3src_9screening_12gap_test_all_10GapTestAll_4apply_test},
-  {"__reduce_cython__", (PyCFunction)__pyx_pw_3src_9screening_12gap_test_all_10GapTestAll_7__reduce_cython__, METH_NOARGS, 0},
-  {"__setstate_cython__", (PyCFunction)__pyx_pw_3src_9screening_12gap_test_all_10GapTestAll_9__setstate_cython__, METH_O, 0},
+static PyMethodDef __pyx_methods_14slopescreening_9screening_12gap_test_all_GapTestAll[] = {
+  {"apply_test", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_pw_14slopescreening_9screening_12gap_test_all_10GapTestAll_5apply_test, METH_VARARGS|METH_KEYWORDS, __pyx_doc_14slopescreening_9screening_12gap_test_all_10GapTestAll_4apply_test},
+  {"__reduce_cython__", (PyCFunction)__pyx_pw_14slopescreening_9screening_12gap_test_all_10GapTestAll_7__reduce_cython__, METH_NOARGS, 0},
+  {"__setstate_cython__", (PyCFunction)__pyx_pw_14slopescreening_9screening_12gap_test_all_10GapTestAll_9__setstate_cython__, METH_O, 0},
   {0, 0, 0, 0}
 };
 
-static PyTypeObject __pyx_type_3src_9screening_12gap_test_all_GapTestAll = {
+static PyTypeObject __pyx_type_14slopescreening_9screening_12gap_test_all_GapTestAll = {
   PyVarObject_HEAD_INIT(0, 0)
-  "src.screening.gap_test_all.GapTestAll", /*tp_name*/
-  sizeof(struct __pyx_obj_3src_9screening_12gap_test_all_GapTestAll), /*tp_basicsize*/
+  "slopescreening.screening.gap_test_all.GapTestAll", /*tp_name*/
+  sizeof(struct __pyx_obj_14slopescreening_9screening_12gap_test_all_GapTestAll), /*tp_basicsize*/
   0, /*tp_itemsize*/
-  __pyx_tp_dealloc_3src_9screening_12gap_test_all_GapTestAll, /*tp_dealloc*/
+  __pyx_tp_dealloc_14slopescreening_9screening_12gap_test_all_GapTestAll, /*tp_dealloc*/
   #if PY_VERSION_HEX < 0x030800b4
   0, /*tp_print*/
   #endif
@@ -4435,7 +4570,7 @@ static PyTypeObject __pyx_type_3src_9screening_12gap_test_all_GapTestAll = {
   0, /*tp_weaklistoffset*/
   0, /*tp_iter*/
   0, /*tp_iternext*/
-  __pyx_methods_3src_9screening_12gap_test_all_GapTestAll, /*tp_methods*/
+  __pyx_methods_14slopescreening_9screening_12gap_test_all_GapTestAll, /*tp_methods*/
   0, /*tp_members*/
   0, /*tp_getset*/
   0, /*tp_base*/
@@ -4443,9 +4578,9 @@ static PyTypeObject __pyx_type_3src_9screening_12gap_test_all_GapTestAll = {
   0, /*tp_descr_get*/
   0, /*tp_descr_set*/
   0, /*tp_dictoffset*/
-  __pyx_pw_3src_9screening_12gap_test_all_10GapTestAll_1__init__, /*tp_init*/
+  __pyx_pw_14slopescreening_9screening_12gap_test_all_10GapTestAll_1__init__, /*tp_init*/
   0, /*tp_alloc*/
-  __pyx_tp_new_3src_9screening_12gap_test_all_GapTestAll, /*tp_new*/
+  __pyx_tp_new_14slopescreening_9screening_12gap_test_all_GapTestAll, /*tp_new*/
   0, /*tp_free*/
   0, /*tp_is_gc*/
   0, /*tp_bases*/
@@ -4458,12 +4593,15 @@ static PyTypeObject __pyx_type_3src_9screening_12gap_test_all_GapTestAll = {
   #if PY_VERSION_HEX >= 0x030400a1
   0, /*tp_finalize*/
   #endif
-  #if PY_VERSION_HEX >= 0x030800b1
+  #if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800)
   0, /*tp_vectorcall*/
   #endif
   #if PY_VERSION_HEX >= 0x030800b4 && PY_VERSION_HEX < 0x03090000
   0, /*tp_print*/
   #endif
+  #if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000
+  0, /*tp_pypy_flags*/
+  #endif
 };
 
 static PyMethodDef __pyx_methods[] = {
@@ -4542,8 +4680,8 @@ static __Pyx_StringTabEntry __pyx_string_tab[] = {
   {&__pyx_kp_s_self_vec_cumsum_gammas_cannot_be, __pyx_k_self_vec_cumsum_gammas_cannot_be, sizeof(__pyx_k_self_vec_cumsum_gammas_cannot_be), 0, 0, 1, 0},
   {&__pyx_n_s_setstate, __pyx_k_setstate, sizeof(__pyx_k_setstate), 0, 0, 1, 1},
   {&__pyx_n_s_setstate_cython, __pyx_k_setstate_cython, sizeof(__pyx_k_setstate_cython), 0, 0, 1, 1},
+  {&__pyx_n_s_slopescreening_screening_ascreen, __pyx_k_slopescreening_screening_ascreen, sizeof(__pyx_k_slopescreening_screening_ascreen), 0, 0, 1, 1},
   {&__pyx_n_s_sqrt, __pyx_k_sqrt, sizeof(__pyx_k_sqrt), 0, 0, 1, 1},
-  {&__pyx_n_s_src_screening_ascreening, __pyx_k_src_screening_ascreening, sizeof(__pyx_k_src_screening_ascreening), 0, 0, 1, 1},
   {&__pyx_n_s_test, __pyx_k_test, sizeof(__pyx_k_test), 0, 0, 1, 1},
   {&__pyx_n_s_vec_gammas, __pyx_k_vec_gammas, sizeof(__pyx_k_vec_gammas), 0, 0, 1, 1},
   {&__pyx_n_s_zeros, __pyx_k_zeros, sizeof(__pyx_k_zeros), 0, 0, 1, 1},
@@ -4552,7 +4690,7 @@ static __Pyx_StringTabEntry __pyx_string_tab[] = {
 static CYTHON_SMALL_CODE int __Pyx_InitCachedBuiltins(void) {
   __pyx_builtin_range = __Pyx_GetBuiltinName(__pyx_n_s_range); if (!__pyx_builtin_range) __PYX_ERR(0, 40, __pyx_L1_error)
   __pyx_builtin_TypeError = __Pyx_GetBuiltinName(__pyx_n_s_TypeError); if (!__pyx_builtin_TypeError) __PYX_ERR(1, 2, __pyx_L1_error)
-  __pyx_builtin_ImportError = __Pyx_GetBuiltinName(__pyx_n_s_ImportError); if (!__pyx_builtin_ImportError) __PYX_ERR(2, 945, __pyx_L1_error)
+  __pyx_builtin_ImportError = __Pyx_GetBuiltinName(__pyx_n_s_ImportError); if (!__pyx_builtin_ImportError) __PYX_ERR(2, 944, __pyx_L1_error)
   return 0;
   __pyx_L1_error:;
   return -1;
@@ -4562,7 +4700,7 @@ static CYTHON_SMALL_CODE int __Pyx_InitCachedConstants(void) {
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("__Pyx_InitCachedConstants", 0);
 
-  /* "src/screening/gap_test_all.pyx":125
+  /* "slopescreening/screening/gap_test_all.pyx":125
  *       # 1. Sort in descending order
  *       if index is None:
  *          index = np.argsort(Atcabs)[::-1]             # <<<<<<<<<<<<<<
@@ -4592,25 +4730,25 @@ static CYTHON_SMALL_CODE int __Pyx_InitCachedConstants(void) {
   __Pyx_GOTREF(__pyx_tuple__3);
   __Pyx_GIVEREF(__pyx_tuple__3);
 
-  /* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":945
+  /* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":944
  *         __pyx_import_array()
  *     except Exception:
  *         raise ImportError("numpy.core.multiarray failed to import")             # <<<<<<<<<<<<<<
  * 
  * cdef inline int import_umath() except -1:
  */
-  __pyx_tuple__4 = PyTuple_Pack(1, __pyx_kp_s_numpy_core_multiarray_failed_to); if (unlikely(!__pyx_tuple__4)) __PYX_ERR(2, 945, __pyx_L1_error)
+  __pyx_tuple__4 = PyTuple_Pack(1, __pyx_kp_s_numpy_core_multiarray_failed_to); if (unlikely(!__pyx_tuple__4)) __PYX_ERR(2, 944, __pyx_L1_error)
   __Pyx_GOTREF(__pyx_tuple__4);
   __Pyx_GIVEREF(__pyx_tuple__4);
 
-  /* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":951
+  /* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":950
  *         _import_umath()
  *     except Exception:
  *         raise ImportError("numpy.core.umath failed to import")             # <<<<<<<<<<<<<<
  * 
  * cdef inline int import_ufunc() except -1:
  */
-  __pyx_tuple__5 = PyTuple_Pack(1, __pyx_kp_s_numpy_core_umath_failed_to_impor); if (unlikely(!__pyx_tuple__5)) __PYX_ERR(2, 951, __pyx_L1_error)
+  __pyx_tuple__5 = PyTuple_Pack(1, __pyx_kp_s_numpy_core_umath_failed_to_impor); if (unlikely(!__pyx_tuple__5)) __PYX_ERR(2, 950, __pyx_L1_error)
   __Pyx_GOTREF(__pyx_tuple__5);
   __Pyx_GIVEREF(__pyx_tuple__5);
   __Pyx_RefNannyFinishContext();
@@ -4669,16 +4807,16 @@ static int __Pyx_modinit_type_init_code(void) {
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("__Pyx_modinit_type_init_code", 0);
   /*--- Type init code ---*/
-  if (PyType_Ready(&__pyx_type_3src_9screening_12gap_test_all_GapTestAll) < 0) __PYX_ERR(0, 21, __pyx_L1_error)
+  if (PyType_Ready(&__pyx_type_14slopescreening_9screening_12gap_test_all_GapTestAll) < 0) __PYX_ERR(0, 21, __pyx_L1_error)
   #if PY_VERSION_HEX < 0x030800B1
-  __pyx_type_3src_9screening_12gap_test_all_GapTestAll.tp_print = 0;
+  __pyx_type_14slopescreening_9screening_12gap_test_all_GapTestAll.tp_print = 0;
   #endif
-  if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_type_3src_9screening_12gap_test_all_GapTestAll.tp_dictoffset && __pyx_type_3src_9screening_12gap_test_all_GapTestAll.tp_getattro == PyObject_GenericGetAttr)) {
-    __pyx_type_3src_9screening_12gap_test_all_GapTestAll.tp_getattro = __Pyx_PyObject_GenericGetAttr;
+  if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_type_14slopescreening_9screening_12gap_test_all_GapTestAll.tp_dictoffset && __pyx_type_14slopescreening_9screening_12gap_test_all_GapTestAll.tp_getattro == PyObject_GenericGetAttr)) {
+    __pyx_type_14slopescreening_9screening_12gap_test_all_GapTestAll.tp_getattro = __Pyx_PyObject_GenericGetAttr;
   }
-  if (PyObject_SetAttr(__pyx_m, __pyx_n_s_GapTestAll, (PyObject *)&__pyx_type_3src_9screening_12gap_test_all_GapTestAll) < 0) __PYX_ERR(0, 21, __pyx_L1_error)
-  if (__Pyx_setup_reduce((PyObject*)&__pyx_type_3src_9screening_12gap_test_all_GapTestAll) < 0) __PYX_ERR(0, 21, __pyx_L1_error)
-  __pyx_ptype_3src_9screening_12gap_test_all_GapTestAll = &__pyx_type_3src_9screening_12gap_test_all_GapTestAll;
+  if (PyObject_SetAttr(__pyx_m, __pyx_n_s_GapTestAll, (PyObject *)&__pyx_type_14slopescreening_9screening_12gap_test_all_GapTestAll) < 0) __PYX_ERR(0, 21, __pyx_L1_error)
+  if (__Pyx_setup_reduce((PyObject*)&__pyx_type_14slopescreening_9screening_12gap_test_all_GapTestAll) < 0) __PYX_ERR(0, 21, __pyx_L1_error)
+  __pyx_ptype_14slopescreening_9screening_12gap_test_all_GapTestAll = &__pyx_type_14slopescreening_9screening_12gap_test_all_GapTestAll;
   __Pyx_RefNannyFinishContext();
   return 0;
   __pyx_L1_error:;
@@ -4705,38 +4843,38 @@ static int __Pyx_modinit_type_import_code(void) {
   __Pyx_ImportType_CheckSize_Warn);
    if (!__pyx_ptype_7cpython_4type_type) __PYX_ERR(3, 9, __pyx_L1_error)
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  __pyx_t_1 = PyImport_ImportModule("numpy"); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 200, __pyx_L1_error)
+  __pyx_t_1 = PyImport_ImportModule("numpy"); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 199, __pyx_L1_error)
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_ptype_5numpy_dtype = __Pyx_ImportType(__pyx_t_1, "numpy", "dtype", sizeof(PyArray_Descr), __Pyx_ImportType_CheckSize_Ignore);
-   if (!__pyx_ptype_5numpy_dtype) __PYX_ERR(2, 200, __pyx_L1_error)
+   if (!__pyx_ptype_5numpy_dtype) __PYX_ERR(2, 199, __pyx_L1_error)
   __pyx_ptype_5numpy_flatiter = __Pyx_ImportType(__pyx_t_1, "numpy", "flatiter", sizeof(PyArrayIterObject), __Pyx_ImportType_CheckSize_Ignore);
-   if (!__pyx_ptype_5numpy_flatiter) __PYX_ERR(2, 223, __pyx_L1_error)
+   if (!__pyx_ptype_5numpy_flatiter) __PYX_ERR(2, 222, __pyx_L1_error)
   __pyx_ptype_5numpy_broadcast = __Pyx_ImportType(__pyx_t_1, "numpy", "broadcast", sizeof(PyArrayMultiIterObject), __Pyx_ImportType_CheckSize_Ignore);
-   if (!__pyx_ptype_5numpy_broadcast) __PYX_ERR(2, 227, __pyx_L1_error)
+   if (!__pyx_ptype_5numpy_broadcast) __PYX_ERR(2, 226, __pyx_L1_error)
   __pyx_ptype_5numpy_ndarray = __Pyx_ImportType(__pyx_t_1, "numpy", "ndarray", sizeof(PyArrayObject), __Pyx_ImportType_CheckSize_Ignore);
-   if (!__pyx_ptype_5numpy_ndarray) __PYX_ERR(2, 239, __pyx_L1_error)
+   if (!__pyx_ptype_5numpy_ndarray) __PYX_ERR(2, 238, __pyx_L1_error)
   __pyx_ptype_5numpy_generic = __Pyx_ImportType(__pyx_t_1, "numpy", "generic", sizeof(PyObject), __Pyx_ImportType_CheckSize_Warn);
-   if (!__pyx_ptype_5numpy_generic) __PYX_ERR(2, 771, __pyx_L1_error)
+   if (!__pyx_ptype_5numpy_generic) __PYX_ERR(2, 770, __pyx_L1_error)
   __pyx_ptype_5numpy_number = __Pyx_ImportType(__pyx_t_1, "numpy", "number", sizeof(PyObject), __Pyx_ImportType_CheckSize_Warn);
-   if (!__pyx_ptype_5numpy_number) __PYX_ERR(2, 773, __pyx_L1_error)
+   if (!__pyx_ptype_5numpy_number) __PYX_ERR(2, 772, __pyx_L1_error)
   __pyx_ptype_5numpy_integer = __Pyx_ImportType(__pyx_t_1, "numpy", "integer", sizeof(PyObject), __Pyx_ImportType_CheckSize_Warn);
-   if (!__pyx_ptype_5numpy_integer) __PYX_ERR(2, 775, __pyx_L1_error)
+   if (!__pyx_ptype_5numpy_integer) __PYX_ERR(2, 774, __pyx_L1_error)
   __pyx_ptype_5numpy_signedinteger = __Pyx_ImportType(__pyx_t_1, "numpy", "signedinteger", sizeof(PyObject), __Pyx_ImportType_CheckSize_Warn);
-   if (!__pyx_ptype_5numpy_signedinteger) __PYX_ERR(2, 777, __pyx_L1_error)
+   if (!__pyx_ptype_5numpy_signedinteger) __PYX_ERR(2, 776, __pyx_L1_error)
   __pyx_ptype_5numpy_unsignedinteger = __Pyx_ImportType(__pyx_t_1, "numpy", "unsignedinteger", sizeof(PyObject), __Pyx_ImportType_CheckSize_Warn);
-   if (!__pyx_ptype_5numpy_unsignedinteger) __PYX_ERR(2, 779, __pyx_L1_error)
+   if (!__pyx_ptype_5numpy_unsignedinteger) __PYX_ERR(2, 778, __pyx_L1_error)
   __pyx_ptype_5numpy_inexact = __Pyx_ImportType(__pyx_t_1, "numpy", "inexact", sizeof(PyObject), __Pyx_ImportType_CheckSize_Warn);
-   if (!__pyx_ptype_5numpy_inexact) __PYX_ERR(2, 781, __pyx_L1_error)
+   if (!__pyx_ptype_5numpy_inexact) __PYX_ERR(2, 780, __pyx_L1_error)
   __pyx_ptype_5numpy_floating = __Pyx_ImportType(__pyx_t_1, "numpy", "floating", sizeof(PyObject), __Pyx_ImportType_CheckSize_Warn);
-   if (!__pyx_ptype_5numpy_floating) __PYX_ERR(2, 783, __pyx_L1_error)
+   if (!__pyx_ptype_5numpy_floating) __PYX_ERR(2, 782, __pyx_L1_error)
   __pyx_ptype_5numpy_complexfloating = __Pyx_ImportType(__pyx_t_1, "numpy", "complexfloating", sizeof(PyObject), __Pyx_ImportType_CheckSize_Warn);
-   if (!__pyx_ptype_5numpy_complexfloating) __PYX_ERR(2, 785, __pyx_L1_error)
+   if (!__pyx_ptype_5numpy_complexfloating) __PYX_ERR(2, 784, __pyx_L1_error)
   __pyx_ptype_5numpy_flexible = __Pyx_ImportType(__pyx_t_1, "numpy", "flexible", sizeof(PyObject), __Pyx_ImportType_CheckSize_Warn);
-   if (!__pyx_ptype_5numpy_flexible) __PYX_ERR(2, 787, __pyx_L1_error)
+   if (!__pyx_ptype_5numpy_flexible) __PYX_ERR(2, 786, __pyx_L1_error)
   __pyx_ptype_5numpy_character = __Pyx_ImportType(__pyx_t_1, "numpy", "character", sizeof(PyObject), __Pyx_ImportType_CheckSize_Warn);
-   if (!__pyx_ptype_5numpy_character) __PYX_ERR(2, 789, __pyx_L1_error)
+   if (!__pyx_ptype_5numpy_character) __PYX_ERR(2, 788, __pyx_L1_error)
   __pyx_ptype_5numpy_ufunc = __Pyx_ImportType(__pyx_t_1, "numpy", "ufunc", sizeof(PyUFuncObject), __Pyx_ImportType_CheckSize_Ignore);
-   if (!__pyx_ptype_5numpy_ufunc) __PYX_ERR(2, 827, __pyx_L1_error)
+   if (!__pyx_ptype_5numpy_ufunc) __PYX_ERR(2, 826, __pyx_L1_error)
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   __Pyx_RefNannyFinishContext();
   return 0;
@@ -4935,14 +5073,14 @@ if (!__Pyx_RefNanny) {
   #if PY_MAJOR_VERSION < 3 && (__PYX_DEFAULT_STRING_ENCODING_IS_ASCII || __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT)
   if (__Pyx_init_sys_getdefaultencoding_params() < 0) __PYX_ERR(0, 1, __pyx_L1_error)
   #endif
-  if (__pyx_module_is_main_src__screening__gap_test_all) {
+  if (__pyx_module_is_main_slopescreening__screening__gap_test_all) {
     if (PyObject_SetAttr(__pyx_m, __pyx_n_s_name, __pyx_n_s_main) < 0) __PYX_ERR(0, 1, __pyx_L1_error)
   }
   #if PY_MAJOR_VERSION >= 3
   {
     PyObject *modules = PyImport_GetModuleDict(); if (unlikely(!modules)) __PYX_ERR(0, 1, __pyx_L1_error)
-    if (!PyDict_GetItemString(modules, "src.screening.gap_test_all")) {
-      if (unlikely(PyDict_SetItemString(modules, "src.screening.gap_test_all", __pyx_m) < 0)) __PYX_ERR(0, 1, __pyx_L1_error)
+    if (!PyDict_GetItemString(modules, "slopescreening.screening.gap_test_all")) {
+      if (unlikely(PyDict_SetItemString(modules, "slopescreening.screening.gap_test_all", __pyx_m) < 0)) __PYX_ERR(0, 1, __pyx_L1_error)
     }
   }
   #endif
@@ -4963,22 +5101,22 @@ if (!__Pyx_RefNanny) {
   if (__Pyx_patch_abc() < 0) __PYX_ERR(0, 1, __pyx_L1_error)
   #endif
 
-  /* "src/screening/gap_test_all.pyx":4
+  /* "slopescreening/screening/gap_test_all.pyx":4
  * # Based on https://cython.readthedocs.io/en/latest/src/tutorial/numpy.html
  * # https://cython.readthedocs.io/en/latest/src/tutorial/memory_allocation.html
  * import numpy as np             # <<<<<<<<<<<<<<
  * 
- * from src.screening.ascreening import AbstractGapScreening
+ * from slopescreening.screening.ascreening import AbstractGapScreening
  */
   __pyx_t_1 = __Pyx_Import(__pyx_n_s_numpy, 0, -1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 4, __pyx_L1_error)
   __Pyx_GOTREF(__pyx_t_1);
   if (PyDict_SetItem(__pyx_d, __pyx_n_s_np, __pyx_t_1) < 0) __PYX_ERR(0, 4, __pyx_L1_error)
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "src/screening/gap_test_all.pyx":6
+  /* "slopescreening/screening/gap_test_all.pyx":6
  * import numpy as np
  * 
- * from src.screening.ascreening import AbstractGapScreening             # <<<<<<<<<<<<<<
+ * from slopescreening.screening.ascreening import AbstractGapScreening             # <<<<<<<<<<<<<<
  * 
  * 
  */
@@ -4987,7 +5125,7 @@ if (!__Pyx_RefNanny) {
   __Pyx_INCREF(__pyx_n_s_AbstractGapScreening);
   __Pyx_GIVEREF(__pyx_n_s_AbstractGapScreening);
   PyList_SET_ITEM(__pyx_t_1, 0, __pyx_n_s_AbstractGapScreening);
-  __pyx_t_2 = __Pyx_Import(__pyx_n_s_src_screening_ascreening, __pyx_t_1, -1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 6, __pyx_L1_error)
+  __pyx_t_2 = __Pyx_Import(__pyx_n_s_slopescreening_screening_ascreen, __pyx_t_1, -1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 6, __pyx_L1_error)
   __Pyx_GOTREF(__pyx_t_2);
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   __pyx_t_1 = __Pyx_ImportFrom(__pyx_t_2, __pyx_n_s_AbstractGapScreening); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 6, __pyx_L1_error)
@@ -4996,7 +5134,7 @@ if (!__Pyx_RefNanny) {
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
 
-  /* "src/screening/gap_test_all.pyx":1
+  /* "slopescreening/screening/gap_test_all.pyx":1
  * # -*- coding: utf-8 -*-             # <<<<<<<<<<<<<<
  * # Based on https://cython.readthedocs.io/en/latest/src/tutorial/numpy.html
  * # https://cython.readthedocs.io/en/latest/src/tutorial/memory_allocation.html
@@ -5006,7 +5144,7 @@ if (!__Pyx_RefNanny) {
   if (PyDict_SetItem(__pyx_d, __pyx_n_s_test, __pyx_t_2) < 0) __PYX_ERR(0, 1, __pyx_L1_error)
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
 
-  /* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":1014
+  /* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":1013
  * 
  * 
  * cdef inline NPY_DATETIMEUNIT get_datetime64_unit(object obj) nogil:             # <<<<<<<<<<<<<<
@@ -5022,11 +5160,11 @@ if (!__Pyx_RefNanny) {
   __Pyx_XDECREF(__pyx_t_2);
   if (__pyx_m) {
     if (__pyx_d) {
-      __Pyx_AddTraceback("init src.screening.gap_test_all", __pyx_clineno, __pyx_lineno, __pyx_filename);
+      __Pyx_AddTraceback("init slopescreening.screening.gap_test_all", __pyx_clineno, __pyx_lineno, __pyx_filename);
     }
     Py_CLEAR(__pyx_m);
   } else if (!PyErr_Occurred()) {
-    PyErr_SetString(PyExc_ImportError, "init src.screening.gap_test_all");
+    PyErr_SetString(PyExc_ImportError, "init slopescreening.screening.gap_test_all");
   }
   __pyx_L0:;
   __Pyx_RefNannyFinishContext();
@@ -6814,17 +6952,35 @@ static CYTHON_INLINE PyObject* __Pyx_PyObject_GetAttrStrNoError(PyObject* obj, P
 static int __Pyx_setup_reduce(PyObject* type_obj) {
     int ret = 0;
     PyObject *object_reduce = NULL;
+    PyObject *object_getstate = NULL;
     PyObject *object_reduce_ex = NULL;
     PyObject *reduce = NULL;
     PyObject *reduce_ex = NULL;
     PyObject *reduce_cython = NULL;
     PyObject *setstate = NULL;
     PyObject *setstate_cython = NULL;
+    PyObject *getstate = NULL;
 #if CYTHON_USE_PYTYPE_LOOKUP
-    if (_PyType_Lookup((PyTypeObject*)type_obj, __pyx_n_s_getstate)) goto __PYX_GOOD;
+    getstate = _PyType_Lookup((PyTypeObject*)type_obj, __pyx_n_s_getstate);
 #else
-    if (PyObject_HasAttr(type_obj, __pyx_n_s_getstate)) goto __PYX_GOOD;
+    getstate = __Pyx_PyObject_GetAttrStrNoError(type_obj, __pyx_n_s_getstate);
+    if (!getstate && PyErr_Occurred()) {
+        goto __PYX_BAD;
+    }
 #endif
+    if (getstate) {
+#if CYTHON_USE_PYTYPE_LOOKUP
+        object_getstate = _PyType_Lookup(&PyBaseObject_Type, __pyx_n_s_getstate);
+#else
+        object_getstate = __Pyx_PyObject_GetAttrStrNoError((PyObject*)&PyBaseObject_Type, __pyx_n_s_getstate);
+        if (!object_getstate && PyErr_Occurred()) {
+            goto __PYX_BAD;
+        }
+#endif
+        if (object_getstate != getstate) {
+            goto __PYX_GOOD;
+        }
+    }
 #if CYTHON_USE_PYTYPE_LOOKUP
     object_reduce_ex = _PyType_Lookup(&PyBaseObject_Type, __pyx_n_s_reduce_ex); if (!object_reduce_ex) goto __PYX_BAD;
 #else
@@ -6869,6 +7025,8 @@ __PYX_GOOD:
 #if !CYTHON_USE_PYTYPE_LOOKUP
     Py_XDECREF(object_reduce);
     Py_XDECREF(object_reduce_ex);
+    Py_XDECREF(object_getstate);
+    Py_XDECREF(getstate);
 #endif
     Py_XDECREF(reduce);
     Py_XDECREF(reduce_ex);
@@ -7050,7 +7208,7 @@ static int __Pyx_CLineForTraceback(CYTHON_NCP_UNUSED PyThreadState *tstate, int
     }
     if (!use_cline) {
         c_line = 0;
-        PyObject_SetAttr(__pyx_cython_runtime, __pyx_n_s_cline_in_traceback, Py_False);
+        (void) PyObject_SetAttr(__pyx_cython_runtime, __pyx_n_s_cline_in_traceback, Py_False);
     }
     else if (use_cline == Py_False || (use_cline != Py_True && PyObject_Not(use_cline) != 0)) {
         c_line = 0;
@@ -7144,33 +7302,40 @@ static void __pyx_insert_code_object(int code_line, PyCodeObject* code_object) {
   #include "compile.h"
 #include "frameobject.h"
 #include "traceback.h"
+#if PY_VERSION_HEX >= 0x030b00a6
+  #ifndef Py_BUILD_CORE
+    #define Py_BUILD_CORE 1
+  #endif
+  #include "internal/pycore_frame.h"
+#endif
 static PyCodeObject* __Pyx_CreateCodeObjectForTraceback(
             const char *funcname, int c_line,
             int py_line, const char *filename) {
-    PyCodeObject *py_code = 0;
-    PyObject *py_srcfile = 0;
-    PyObject *py_funcname = 0;
+    PyCodeObject *py_code = NULL;
+    PyObject *py_funcname = NULL;
     #if PY_MAJOR_VERSION < 3
+    PyObject *py_srcfile = NULL;
     py_srcfile = PyString_FromString(filename);
-    #else
-    py_srcfile = PyUnicode_FromString(filename);
-    #endif
     if (!py_srcfile) goto bad;
+    #endif
     if (c_line) {
         #if PY_MAJOR_VERSION < 3
         py_funcname = PyString_FromFormat( "%s (%s:%d)", funcname, __pyx_cfilenm, c_line);
+        if (!py_funcname) goto bad;
         #else
         py_funcname = PyUnicode_FromFormat( "%s (%s:%d)", funcname, __pyx_cfilenm, c_line);
+        if (!py_funcname) goto bad;
+        funcname = PyUnicode_AsUTF8(py_funcname);
+        if (!funcname) goto bad;
         #endif
     }
     else {
         #if PY_MAJOR_VERSION < 3
         py_funcname = PyString_FromString(funcname);
-        #else
-        py_funcname = PyUnicode_FromString(funcname);
+        if (!py_funcname) goto bad;
         #endif
     }
-    if (!py_funcname) goto bad;
+    #if PY_MAJOR_VERSION < 3
     py_code = __Pyx_PyCode_New(
         0,
         0,
@@ -7189,11 +7354,16 @@ static PyCodeObject* __Pyx_CreateCodeObjectForTraceback(
         __pyx_empty_bytes  /*PyObject *lnotab*/
     );
     Py_DECREF(py_srcfile);
-    Py_DECREF(py_funcname);
+    #else
+    py_code = PyCode_NewEmpty(filename, funcname, py_line);
+    #endif
+    Py_XDECREF(py_funcname);  // XDECREF since it's only set on Py3 if cline
     return py_code;
 bad:
-    Py_XDECREF(py_srcfile);
     Py_XDECREF(py_funcname);
+    #if PY_MAJOR_VERSION < 3
+    Py_XDECREF(py_srcfile);
+    #endif
     return NULL;
 }
 static void __Pyx_AddTraceback(const char *funcname, int c_line,
@@ -7201,14 +7371,24 @@ static void __Pyx_AddTraceback(const char *funcname, int c_line,
     PyCodeObject *py_code = 0;
     PyFrameObject *py_frame = 0;
     PyThreadState *tstate = __Pyx_PyThreadState_Current;
+    PyObject *ptype, *pvalue, *ptraceback;
     if (c_line) {
         c_line = __Pyx_CLineForTraceback(tstate, c_line);
     }
     py_code = __pyx_find_code_object(c_line ? -c_line : py_line);
     if (!py_code) {
+        __Pyx_ErrFetchInState(tstate, &ptype, &pvalue, &ptraceback);
         py_code = __Pyx_CreateCodeObjectForTraceback(
             funcname, c_line, py_line, filename);
-        if (!py_code) goto bad;
+        if (!py_code) {
+            /* If the code object creation fails, then we should clear the
+               fetched exception references and propagate the new exception */
+            Py_XDECREF(ptype);
+            Py_XDECREF(pvalue);
+            Py_XDECREF(ptraceback);
+            goto bad;
+        }
+        __Pyx_ErrRestoreInState(tstate, ptype, pvalue, ptraceback);
         __pyx_insert_code_object(c_line ? -c_line : py_line, py_code);
     }
     py_frame = PyFrame_New(
@@ -8183,11 +8363,33 @@ static CYTHON_INLINE int __Pyx_PyErr_GivenExceptionMatches2(PyObject *err, PyObj
 
 /* CheckBinaryVersion */
   static int __Pyx_check_binary_version(void) {
-    char ctversion[4], rtversion[4];
-    PyOS_snprintf(ctversion, 4, "%d.%d", PY_MAJOR_VERSION, PY_MINOR_VERSION);
-    PyOS_snprintf(rtversion, 4, "%s", Py_GetVersion());
-    if (ctversion[0] != rtversion[0] || ctversion[2] != rtversion[2]) {
+    char ctversion[5];
+    int same=1, i, found_dot;
+    const char* rt_from_call = Py_GetVersion();
+    PyOS_snprintf(ctversion, 5, "%d.%d", PY_MAJOR_VERSION, PY_MINOR_VERSION);
+    found_dot = 0;
+    for (i = 0; i < 4; i++) {
+        if (!ctversion[i]) {
+            same = (rt_from_call[i] < '0' || rt_from_call[i] > '9');
+            break;
+        }
+        if (rt_from_call[i] != ctversion[i]) {
+            same = 0;
+            break;
+        }
+    }
+    if (!same) {
+        char rtversion[5] = {'\0'};
         char message[200];
+        for (i=0; i<4; ++i) {
+            if (rt_from_call[i] == '.') {
+                if (found_dot) break;
+                found_dot = 1;
+            } else if (rt_from_call[i] < '0' || rt_from_call[i] > '9') {
+                break;
+            }
+            rtversion[i] = rt_from_call[i];
+        }
         PyOS_snprintf(message, sizeof(message),
                       "compiletime version %s of module '%.100s' "
                       "does not match runtime version %s",
@@ -8445,6 +8647,23 @@ static CYTHON_INLINE Py_ssize_t __Pyx_PyIndex_AsSsize_t(PyObject* b) {
   Py_DECREF(x);
   return ival;
 }
+static CYTHON_INLINE Py_hash_t __Pyx_PyIndex_AsHash_t(PyObject* o) {
+  if (sizeof(Py_hash_t) == sizeof(Py_ssize_t)) {
+    return (Py_hash_t) __Pyx_PyIndex_AsSsize_t(o);
+#if PY_MAJOR_VERSION < 3
+  } else if (likely(PyInt_CheckExact(o))) {
+    return PyInt_AS_LONG(o);
+#endif
+  } else {
+    Py_ssize_t ival;
+    PyObject *x;
+    x = PyNumber_Index(o);
+    if (!x) return -1;
+    ival = PyInt_AsLong(x);
+    Py_DECREF(x);
+    return ival;
+  }
+}
 static CYTHON_INLINE PyObject * __Pyx_PyBool_FromLong(long b) {
   return b ? __Pyx_NewRef(Py_True) : __Pyx_NewRef(Py_False);
 }
diff --git a/src/screening/gap_test_all.pyx b/slopescreening/screening/gap_test_all.pyx
similarity index 98%
rename from src/screening/gap_test_all.pyx
rename to slopescreening/screening/gap_test_all.pyx
index b172470..b5534f0 100644
--- a/src/screening/gap_test_all.pyx
+++ b/slopescreening/screening/gap_test_all.pyx
@@ -3,7 +3,7 @@
 # https://cython.readthedocs.io/en/latest/src/tutorial/memory_allocation.html
 import numpy as np
 
-from src.screening.ascreening import AbstractGapScreening
+from slopescreening.screening.ascreening import AbstractGapScreening
 
 
 # "cimport" is used to import special compile-time information
diff --git a/src/screening/gap_test_p_1.c b/slopescreening/screening/gap_test_p_1.c
similarity index 89%
rename from src/screening/gap_test_p_1.c
rename to slopescreening/screening/gap_test_p_1.c
index 595c769..97c5c3c 100644
--- a/src/screening/gap_test_p_1.c
+++ b/slopescreening/screening/gap_test_p_1.c
@@ -1,15 +1,15 @@
-/* Generated by Cython 0.29.24 */
+/* Generated by Cython 0.29.32 */
 
 /* BEGIN: Cython Metadata
 {
     "distutils": {
         "depends": [],
-        "name": "src.screening.gap_test_p_1",
+        "name": "slopescreening.screening.gap_test_p_1",
         "sources": [
-            "src/screening/gap_test_p_1.pyx"
+            "slopescreening/screening/gap_test_p_1.pyx"
         ]
     },
-    "module_name": "src.screening.gap_test_p_1"
+    "module_name": "slopescreening.screening.gap_test_p_1"
 }
 END: Cython Metadata */
 
@@ -22,8 +22,8 @@ END: Cython Metadata */
 #elif PY_VERSION_HEX < 0x02060000 || (0x03000000 <= PY_VERSION_HEX && PY_VERSION_HEX < 0x03030000)
     #error Cython requires Python 2.6+ or Python 3.3+.
 #else
-#define CYTHON_ABI "0_29_24"
-#define CYTHON_HEX_VERSION 0x001D18F0
+#define CYTHON_ABI "0_29_32"
+#define CYTHON_HEX_VERSION 0x001D20F0
 #define CYTHON_FUTURE_DIVISION 0
 #include <stddef.h>
 #ifndef offsetof
@@ -62,6 +62,7 @@ END: Cython Metadata */
   #define CYTHON_COMPILING_IN_PYPY 1
   #define CYTHON_COMPILING_IN_PYSTON 0
   #define CYTHON_COMPILING_IN_CPYTHON 0
+  #define CYTHON_COMPILING_IN_NOGIL 0
   #undef CYTHON_USE_TYPE_SLOTS
   #define CYTHON_USE_TYPE_SLOTS 0
   #undef CYTHON_USE_PYTYPE_LOOKUP
@@ -98,10 +99,14 @@ END: Cython Metadata */
   #define CYTHON_USE_DICT_VERSIONS 0
   #undef CYTHON_USE_EXC_INFO_STACK
   #define CYTHON_USE_EXC_INFO_STACK 0
+  #ifndef CYTHON_UPDATE_DESCRIPTOR_DOC
+    #define CYTHON_UPDATE_DESCRIPTOR_DOC (PYPY_VERSION_HEX >= 0x07030900)
+  #endif
 #elif defined(PYSTON_VERSION)
   #define CYTHON_COMPILING_IN_PYPY 0
   #define CYTHON_COMPILING_IN_PYSTON 1
   #define CYTHON_COMPILING_IN_CPYTHON 0
+  #define CYTHON_COMPILING_IN_NOGIL 0
   #ifndef CYTHON_USE_TYPE_SLOTS
     #define CYTHON_USE_TYPE_SLOTS 1
   #endif
@@ -139,10 +144,59 @@ END: Cython Metadata */
   #define CYTHON_USE_DICT_VERSIONS 0
   #undef CYTHON_USE_EXC_INFO_STACK
   #define CYTHON_USE_EXC_INFO_STACK 0
+  #ifndef CYTHON_UPDATE_DESCRIPTOR_DOC
+    #define CYTHON_UPDATE_DESCRIPTOR_DOC 0
+  #endif
+#elif defined(PY_NOGIL)
+  #define CYTHON_COMPILING_IN_PYPY 0
+  #define CYTHON_COMPILING_IN_PYSTON 0
+  #define CYTHON_COMPILING_IN_CPYTHON 0
+  #define CYTHON_COMPILING_IN_NOGIL 1
+  #ifndef CYTHON_USE_TYPE_SLOTS
+    #define CYTHON_USE_TYPE_SLOTS 1
+  #endif
+  #undef CYTHON_USE_PYTYPE_LOOKUP
+  #define CYTHON_USE_PYTYPE_LOOKUP 0
+  #ifndef CYTHON_USE_ASYNC_SLOTS
+    #define CYTHON_USE_ASYNC_SLOTS 1
+  #endif
+  #undef CYTHON_USE_PYLIST_INTERNALS
+  #define CYTHON_USE_PYLIST_INTERNALS 0
+  #ifndef CYTHON_USE_UNICODE_INTERNALS
+    #define CYTHON_USE_UNICODE_INTERNALS 1
+  #endif
+  #undef CYTHON_USE_UNICODE_WRITER
+  #define CYTHON_USE_UNICODE_WRITER 0
+  #undef CYTHON_USE_PYLONG_INTERNALS
+  #define CYTHON_USE_PYLONG_INTERNALS 0
+  #ifndef CYTHON_AVOID_BORROWED_REFS
+    #define CYTHON_AVOID_BORROWED_REFS 0
+  #endif
+  #ifndef CYTHON_ASSUME_SAFE_MACROS
+    #define CYTHON_ASSUME_SAFE_MACROS 1
+  #endif
+  #ifndef CYTHON_UNPACK_METHODS
+    #define CYTHON_UNPACK_METHODS 1
+  #endif
+  #undef CYTHON_FAST_THREAD_STATE
+  #define CYTHON_FAST_THREAD_STATE 0
+  #undef CYTHON_FAST_PYCALL
+  #define CYTHON_FAST_PYCALL 0
+  #ifndef CYTHON_PEP489_MULTI_PHASE_INIT
+    #define CYTHON_PEP489_MULTI_PHASE_INIT 1
+  #endif
+  #ifndef CYTHON_USE_TP_FINALIZE
+    #define CYTHON_USE_TP_FINALIZE 1
+  #endif
+  #undef CYTHON_USE_DICT_VERSIONS
+  #define CYTHON_USE_DICT_VERSIONS 0
+  #undef CYTHON_USE_EXC_INFO_STACK
+  #define CYTHON_USE_EXC_INFO_STACK 0
 #else
   #define CYTHON_COMPILING_IN_PYPY 0
   #define CYTHON_COMPILING_IN_PYSTON 0
   #define CYTHON_COMPILING_IN_CPYTHON 1
+  #define CYTHON_COMPILING_IN_NOGIL 0
   #ifndef CYTHON_USE_TYPE_SLOTS
     #define CYTHON_USE_TYPE_SLOTS 1
   #endif
@@ -170,7 +224,7 @@ END: Cython Metadata */
   #ifndef CYTHON_USE_UNICODE_INTERNALS
     #define CYTHON_USE_UNICODE_INTERNALS 1
   #endif
-  #if PY_VERSION_HEX < 0x030300F0
+  #if PY_VERSION_HEX < 0x030300F0 || PY_VERSION_HEX >= 0x030B00A2
     #undef CYTHON_USE_UNICODE_WRITER
     #define CYTHON_USE_UNICODE_WRITER 0
   #elif !defined(CYTHON_USE_UNICODE_WRITER)
@@ -185,11 +239,14 @@ END: Cython Metadata */
   #ifndef CYTHON_UNPACK_METHODS
     #define CYTHON_UNPACK_METHODS 1
   #endif
-  #ifndef CYTHON_FAST_THREAD_STATE
+  #if PY_VERSION_HEX >= 0x030B00A4
+    #undef CYTHON_FAST_THREAD_STATE
+    #define CYTHON_FAST_THREAD_STATE 0
+  #elif !defined(CYTHON_FAST_THREAD_STATE)
     #define CYTHON_FAST_THREAD_STATE 1
   #endif
   #ifndef CYTHON_FAST_PYCALL
-    #define CYTHON_FAST_PYCALL 1
+    #define CYTHON_FAST_PYCALL (PY_VERSION_HEX < 0x030A0000)
   #endif
   #ifndef CYTHON_PEP489_MULTI_PHASE_INIT
     #define CYTHON_PEP489_MULTI_PHASE_INIT (PY_VERSION_HEX >= 0x03050000)
@@ -200,15 +257,23 @@ END: Cython Metadata */
   #ifndef CYTHON_USE_DICT_VERSIONS
     #define CYTHON_USE_DICT_VERSIONS (PY_VERSION_HEX >= 0x030600B1)
   #endif
-  #ifndef CYTHON_USE_EXC_INFO_STACK
+  #if PY_VERSION_HEX >= 0x030B00A4
+    #undef CYTHON_USE_EXC_INFO_STACK
+    #define CYTHON_USE_EXC_INFO_STACK 0
+  #elif !defined(CYTHON_USE_EXC_INFO_STACK)
     #define CYTHON_USE_EXC_INFO_STACK (PY_VERSION_HEX >= 0x030700A3)
   #endif
+  #ifndef CYTHON_UPDATE_DESCRIPTOR_DOC
+    #define CYTHON_UPDATE_DESCRIPTOR_DOC 1
+  #endif
 #endif
 #if !defined(CYTHON_FAST_PYCCALL)
 #define CYTHON_FAST_PYCCALL  (CYTHON_FAST_PYCALL && PY_VERSION_HEX >= 0x030600B1)
 #endif
 #if CYTHON_USE_PYLONG_INTERNALS
-  #include "longintrepr.h"
+  #if PY_MAJOR_VERSION < 3
+    #include "longintrepr.h"
+  #endif
   #undef SHIFT
   #undef BASE
   #undef MASK
@@ -325,9 +390,68 @@ END: Cython Metadata */
   #define __Pyx_DefaultClassType PyClass_Type
 #else
   #define __Pyx_BUILTIN_MODULE_NAME "builtins"
-#if PY_VERSION_HEX >= 0x030800A4 && PY_VERSION_HEX < 0x030800B2
-  #define __Pyx_PyCode_New(a, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos)\
-          PyCode_New(a, 0, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos)
+  #define __Pyx_DefaultClassType PyType_Type
+#if PY_VERSION_HEX >= 0x030B00A1
+    static CYTHON_INLINE PyCodeObject* __Pyx_PyCode_New(int a, int k, int l, int s, int f,
+                                                    PyObject *code, PyObject *c, PyObject* n, PyObject *v,
+                                                    PyObject *fv, PyObject *cell, PyObject* fn,
+                                                    PyObject *name, int fline, PyObject *lnos) {
+        PyObject *kwds=NULL, *argcount=NULL, *posonlyargcount=NULL, *kwonlyargcount=NULL;
+        PyObject *nlocals=NULL, *stacksize=NULL, *flags=NULL, *replace=NULL, *call_result=NULL, *empty=NULL;
+        const char *fn_cstr=NULL;
+        const char *name_cstr=NULL;
+        PyCodeObject* co=NULL;
+        PyObject *type, *value, *traceback;
+        PyErr_Fetch(&type, &value, &traceback);
+        if (!(kwds=PyDict_New())) goto end;
+        if (!(argcount=PyLong_FromLong(a))) goto end;
+        if (PyDict_SetItemString(kwds, "co_argcount", argcount) != 0) goto end;
+        if (!(posonlyargcount=PyLong_FromLong(0))) goto end;
+        if (PyDict_SetItemString(kwds, "co_posonlyargcount", posonlyargcount) != 0) goto end;
+        if (!(kwonlyargcount=PyLong_FromLong(k))) goto end;
+        if (PyDict_SetItemString(kwds, "co_kwonlyargcount", kwonlyargcount) != 0) goto end;
+        if (!(nlocals=PyLong_FromLong(l))) goto end;
+        if (PyDict_SetItemString(kwds, "co_nlocals", nlocals) != 0) goto end;
+        if (!(stacksize=PyLong_FromLong(s))) goto end;
+        if (PyDict_SetItemString(kwds, "co_stacksize", stacksize) != 0) goto end;
+        if (!(flags=PyLong_FromLong(f))) goto end;
+        if (PyDict_SetItemString(kwds, "co_flags", flags) != 0) goto end;
+        if (PyDict_SetItemString(kwds, "co_code", code) != 0) goto end;
+        if (PyDict_SetItemString(kwds, "co_consts", c) != 0) goto end;
+        if (PyDict_SetItemString(kwds, "co_names", n) != 0) goto end;
+        if (PyDict_SetItemString(kwds, "co_varnames", v) != 0) goto end;
+        if (PyDict_SetItemString(kwds, "co_freevars", fv) != 0) goto end;
+        if (PyDict_SetItemString(kwds, "co_cellvars", cell) != 0) goto end;
+        if (PyDict_SetItemString(kwds, "co_linetable", lnos) != 0) goto end;
+        if (!(fn_cstr=PyUnicode_AsUTF8AndSize(fn, NULL))) goto end;
+        if (!(name_cstr=PyUnicode_AsUTF8AndSize(name, NULL))) goto end;
+        if (!(co = PyCode_NewEmpty(fn_cstr, name_cstr, fline))) goto end;
+        if (!(replace = PyObject_GetAttrString((PyObject*)co, "replace"))) goto cleanup_code_too;
+        if (!(empty = PyTuple_New(0))) goto cleanup_code_too; // unfortunately __pyx_empty_tuple isn't available here
+        if (!(call_result = PyObject_Call(replace, empty, kwds))) goto cleanup_code_too;
+        Py_XDECREF((PyObject*)co);
+        co = (PyCodeObject*)call_result;
+        call_result = NULL;
+        if (0) {
+            cleanup_code_too:
+            Py_XDECREF((PyObject*)co);
+            co = NULL;
+        }
+        end:
+        Py_XDECREF(kwds);
+        Py_XDECREF(argcount);
+        Py_XDECREF(posonlyargcount);
+        Py_XDECREF(kwonlyargcount);
+        Py_XDECREF(nlocals);
+        Py_XDECREF(stacksize);
+        Py_XDECREF(replace);
+        Py_XDECREF(call_result);
+        Py_XDECREF(empty);
+        if (type) {
+            PyErr_Restore(type, value, traceback);
+        }
+        return co;
+    }
 #else
   #define __Pyx_PyCode_New(a, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos)\
           PyCode_New(a, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos)
@@ -565,10 +689,10 @@ static CYTHON_INLINE void * PyThread_tss_get(Py_tss_t *key) {
 #if PY_VERSION_HEX < 0x030200A4
   typedef long Py_hash_t;
   #define __Pyx_PyInt_FromHash_t PyInt_FromLong
-  #define __Pyx_PyInt_AsHash_t   PyInt_AsLong
+  #define __Pyx_PyInt_AsHash_t   __Pyx_PyIndex_AsHash_t
 #else
   #define __Pyx_PyInt_FromHash_t PyInt_FromSsize_t
-  #define __Pyx_PyInt_AsHash_t   PyInt_AsSsize_t
+  #define __Pyx_PyInt_AsHash_t   __Pyx_PyIndex_AsSsize_t
 #endif
 #if PY_MAJOR_VERSION >= 3
   #define __Pyx_PyMethod_New(func, self, klass) ((self) ? ((void)(klass), PyMethod_New(func, self)) : __Pyx_NewRef(func))
@@ -593,8 +717,10 @@ static CYTHON_INLINE void * PyThread_tss_get(Py_tss_t *key) {
     } __Pyx_PyAsyncMethodsStruct;
 #endif
 
-#if defined(WIN32) || defined(MS_WINDOWS)
-  #define _USE_MATH_DEFINES
+#if defined(_WIN32) || defined(WIN32) || defined(MS_WINDOWS)
+  #if !defined(_USE_MATH_DEFINES)
+    #define _USE_MATH_DEFINES
+  #endif
 #endif
 #include <math.h>
 #ifdef NAN
@@ -625,8 +751,8 @@ static CYTHON_INLINE float __PYX_NAN() {
   #endif
 #endif
 
-#define __PYX_HAVE__src__screening__gap_test_p_1
-#define __PYX_HAVE_API__src__screening__gap_test_p_1
+#define __PYX_HAVE__slopescreening__screening__gap_test_p_1
+#define __PYX_HAVE_API__slopescreening__screening__gap_test_p_1
 /* Early includes */
 #include <string.h>
 #include <stdio.h>
@@ -734,6 +860,7 @@ static CYTHON_INLINE PyObject* __Pyx_PyNumber_IntOrLong(PyObject* x);
     (likely(PyTuple_CheckExact(obj)) ? __Pyx_NewRef(obj) : PySequence_Tuple(obj))
 static CYTHON_INLINE Py_ssize_t __Pyx_PyIndex_AsSsize_t(PyObject*);
 static CYTHON_INLINE PyObject * __Pyx_PyInt_FromSize_t(size_t);
+static CYTHON_INLINE Py_hash_t __Pyx_PyIndex_AsHash_t(PyObject*);
 #if CYTHON_ASSUME_SAFE_MACROS
 #define __pyx_PyFloat_AsDouble(x) (PyFloat_CheckExact(x) ? PyFloat_AS_DOUBLE(x) : PyFloat_AsDouble(x))
 #else
@@ -868,10 +995,10 @@ static const char *__pyx_filename;
 
 
 static const char *__pyx_f[] = {
-  "src/screening/gap_test_p_1.pyx",
+  "slopescreening/screening/gap_test_p_1.pyx",
   "stringsource",
-  "venv/lib/python3.8/site-packages/numpy/__init__.pxd",
-  "venv/lib/python3.8/site-packages/Cython/Includes/cpython/type.pxd",
+  "venv/lib/python3.10/site-packages/numpy/__init__.pxd",
+  "venv/lib/python3.10/site-packages/Cython/Includes/cpython/type.pxd",
 };
 /* BufferFormatStructs.proto */
 #define IS_UNSIGNED(type) (((type) -1) > 0)
@@ -910,7 +1037,7 @@ typedef struct {
 } __Pyx_BufFmt_Context;
 
 
-/* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":690
+/* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":689
  * # in Cython to enable them only on the right systems.
  * 
  * ctypedef npy_int8       int8_t             # <<<<<<<<<<<<<<
@@ -919,7 +1046,7 @@ typedef struct {
  */
 typedef npy_int8 __pyx_t_5numpy_int8_t;
 
-/* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":691
+/* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":690
  * 
  * ctypedef npy_int8       int8_t
  * ctypedef npy_int16      int16_t             # <<<<<<<<<<<<<<
@@ -928,7 +1055,7 @@ typedef npy_int8 __pyx_t_5numpy_int8_t;
  */
 typedef npy_int16 __pyx_t_5numpy_int16_t;
 
-/* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":692
+/* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":691
  * ctypedef npy_int8       int8_t
  * ctypedef npy_int16      int16_t
  * ctypedef npy_int32      int32_t             # <<<<<<<<<<<<<<
@@ -937,7 +1064,7 @@ typedef npy_int16 __pyx_t_5numpy_int16_t;
  */
 typedef npy_int32 __pyx_t_5numpy_int32_t;
 
-/* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":693
+/* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":692
  * ctypedef npy_int16      int16_t
  * ctypedef npy_int32      int32_t
  * ctypedef npy_int64      int64_t             # <<<<<<<<<<<<<<
@@ -946,7 +1073,7 @@ typedef npy_int32 __pyx_t_5numpy_int32_t;
  */
 typedef npy_int64 __pyx_t_5numpy_int64_t;
 
-/* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":697
+/* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":696
  * #ctypedef npy_int128     int128_t
  * 
  * ctypedef npy_uint8      uint8_t             # <<<<<<<<<<<<<<
@@ -955,7 +1082,7 @@ typedef npy_int64 __pyx_t_5numpy_int64_t;
  */
 typedef npy_uint8 __pyx_t_5numpy_uint8_t;
 
-/* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":698
+/* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":697
  * 
  * ctypedef npy_uint8      uint8_t
  * ctypedef npy_uint16     uint16_t             # <<<<<<<<<<<<<<
@@ -964,7 +1091,7 @@ typedef npy_uint8 __pyx_t_5numpy_uint8_t;
  */
 typedef npy_uint16 __pyx_t_5numpy_uint16_t;
 
-/* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":699
+/* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":698
  * ctypedef npy_uint8      uint8_t
  * ctypedef npy_uint16     uint16_t
  * ctypedef npy_uint32     uint32_t             # <<<<<<<<<<<<<<
@@ -973,7 +1100,7 @@ typedef npy_uint16 __pyx_t_5numpy_uint16_t;
  */
 typedef npy_uint32 __pyx_t_5numpy_uint32_t;
 
-/* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":700
+/* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":699
  * ctypedef npy_uint16     uint16_t
  * ctypedef npy_uint32     uint32_t
  * ctypedef npy_uint64     uint64_t             # <<<<<<<<<<<<<<
@@ -982,7 +1109,7 @@ typedef npy_uint32 __pyx_t_5numpy_uint32_t;
  */
 typedef npy_uint64 __pyx_t_5numpy_uint64_t;
 
-/* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":704
+/* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":703
  * #ctypedef npy_uint128    uint128_t
  * 
  * ctypedef npy_float32    float32_t             # <<<<<<<<<<<<<<
@@ -991,7 +1118,7 @@ typedef npy_uint64 __pyx_t_5numpy_uint64_t;
  */
 typedef npy_float32 __pyx_t_5numpy_float32_t;
 
-/* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":705
+/* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":704
  * 
  * ctypedef npy_float32    float32_t
  * ctypedef npy_float64    float64_t             # <<<<<<<<<<<<<<
@@ -1000,7 +1127,7 @@ typedef npy_float32 __pyx_t_5numpy_float32_t;
  */
 typedef npy_float64 __pyx_t_5numpy_float64_t;
 
-/* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":714
+/* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":713
  * # The int types are mapped a bit surprising --
  * # numpy.int corresponds to 'l' and numpy.long to 'q'
  * ctypedef npy_long       int_t             # <<<<<<<<<<<<<<
@@ -1009,7 +1136,7 @@ typedef npy_float64 __pyx_t_5numpy_float64_t;
  */
 typedef npy_long __pyx_t_5numpy_int_t;
 
-/* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":715
+/* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":714
  * # numpy.int corresponds to 'l' and numpy.long to 'q'
  * ctypedef npy_long       int_t
  * ctypedef npy_longlong   long_t             # <<<<<<<<<<<<<<
@@ -1018,7 +1145,7 @@ typedef npy_long __pyx_t_5numpy_int_t;
  */
 typedef npy_longlong __pyx_t_5numpy_long_t;
 
-/* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":716
+/* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":715
  * ctypedef npy_long       int_t
  * ctypedef npy_longlong   long_t
  * ctypedef npy_longlong   longlong_t             # <<<<<<<<<<<<<<
@@ -1027,7 +1154,7 @@ typedef npy_longlong __pyx_t_5numpy_long_t;
  */
 typedef npy_longlong __pyx_t_5numpy_longlong_t;
 
-/* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":718
+/* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":717
  * ctypedef npy_longlong   longlong_t
  * 
  * ctypedef npy_ulong      uint_t             # <<<<<<<<<<<<<<
@@ -1036,7 +1163,7 @@ typedef npy_longlong __pyx_t_5numpy_longlong_t;
  */
 typedef npy_ulong __pyx_t_5numpy_uint_t;
 
-/* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":719
+/* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":718
  * 
  * ctypedef npy_ulong      uint_t
  * ctypedef npy_ulonglong  ulong_t             # <<<<<<<<<<<<<<
@@ -1045,7 +1172,7 @@ typedef npy_ulong __pyx_t_5numpy_uint_t;
  */
 typedef npy_ulonglong __pyx_t_5numpy_ulong_t;
 
-/* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":720
+/* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":719
  * ctypedef npy_ulong      uint_t
  * ctypedef npy_ulonglong  ulong_t
  * ctypedef npy_ulonglong  ulonglong_t             # <<<<<<<<<<<<<<
@@ -1054,7 +1181,7 @@ typedef npy_ulonglong __pyx_t_5numpy_ulong_t;
  */
 typedef npy_ulonglong __pyx_t_5numpy_ulonglong_t;
 
-/* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":722
+/* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":721
  * ctypedef npy_ulonglong  ulonglong_t
  * 
  * ctypedef npy_intp       intp_t             # <<<<<<<<<<<<<<
@@ -1063,7 +1190,7 @@ typedef npy_ulonglong __pyx_t_5numpy_ulonglong_t;
  */
 typedef npy_intp __pyx_t_5numpy_intp_t;
 
-/* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":723
+/* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":722
  * 
  * ctypedef npy_intp       intp_t
  * ctypedef npy_uintp      uintp_t             # <<<<<<<<<<<<<<
@@ -1072,7 +1199,7 @@ typedef npy_intp __pyx_t_5numpy_intp_t;
  */
 typedef npy_uintp __pyx_t_5numpy_uintp_t;
 
-/* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":725
+/* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":724
  * ctypedef npy_uintp      uintp_t
  * 
  * ctypedef npy_double     float_t             # <<<<<<<<<<<<<<
@@ -1081,7 +1208,7 @@ typedef npy_uintp __pyx_t_5numpy_uintp_t;
  */
 typedef npy_double __pyx_t_5numpy_float_t;
 
-/* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":726
+/* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":725
  * 
  * ctypedef npy_double     float_t
  * ctypedef npy_double     double_t             # <<<<<<<<<<<<<<
@@ -1090,7 +1217,7 @@ typedef npy_double __pyx_t_5numpy_float_t;
  */
 typedef npy_double __pyx_t_5numpy_double_t;
 
-/* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":727
+/* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":726
  * ctypedef npy_double     float_t
  * ctypedef npy_double     double_t
  * ctypedef npy_longdouble longdouble_t             # <<<<<<<<<<<<<<
@@ -1099,14 +1226,14 @@ typedef npy_double __pyx_t_5numpy_double_t;
  */
 typedef npy_longdouble __pyx_t_5numpy_longdouble_t;
 
-/* "src/screening/gap_test_p_1.pyx":16
+/* "slopescreening/screening/gap_test_p_1.pyx":16
  * cimport cython
  * 
  * ctypedef np.npy_bool bool_t             # <<<<<<<<<<<<<<
  * 
  * from cpython.mem cimport PyMem_Malloc, PyMem_Realloc, PyMem_Free
  */
-typedef npy_bool __pyx_t_3src_9screening_12gap_test_p_1_bool_t;
+typedef npy_bool __pyx_t_14slopescreening_9screening_12gap_test_p_1_bool_t;
 /* Declarations.proto */
 #if CYTHON_CCOMPLEX
   #ifdef __cplusplus
@@ -1133,9 +1260,9 @@ static CYTHON_INLINE __pyx_t_double_complex __pyx_t_double_complex_from_parts(do
 
 
 /*--- Type declarations ---*/
-struct __pyx_obj_3src_9screening_12gap_test_p_1_GapTestPequalOne;
+struct __pyx_obj_14slopescreening_9screening_12gap_test_p_1_GapTestPequalOne;
 
-/* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":729
+/* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":728
  * ctypedef npy_longdouble longdouble_t
  * 
  * ctypedef npy_cfloat      cfloat_t             # <<<<<<<<<<<<<<
@@ -1144,7 +1271,7 @@ struct __pyx_obj_3src_9screening_12gap_test_p_1_GapTestPequalOne;
  */
 typedef npy_cfloat __pyx_t_5numpy_cfloat_t;
 
-/* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":730
+/* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":729
  * 
  * ctypedef npy_cfloat      cfloat_t
  * ctypedef npy_cdouble     cdouble_t             # <<<<<<<<<<<<<<
@@ -1153,7 +1280,7 @@ typedef npy_cfloat __pyx_t_5numpy_cfloat_t;
  */
 typedef npy_cdouble __pyx_t_5numpy_cdouble_t;
 
-/* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":731
+/* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":730
  * ctypedef npy_cfloat      cfloat_t
  * ctypedef npy_cdouble     cdouble_t
  * ctypedef npy_clongdouble clongdouble_t             # <<<<<<<<<<<<<<
@@ -1162,7 +1289,7 @@ typedef npy_cdouble __pyx_t_5numpy_cdouble_t;
  */
 typedef npy_clongdouble __pyx_t_5numpy_clongdouble_t;
 
-/* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":733
+/* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":732
  * ctypedef npy_clongdouble clongdouble_t
  * 
  * ctypedef npy_cdouble     complex_t             # <<<<<<<<<<<<<<
@@ -1171,14 +1298,14 @@ typedef npy_clongdouble __pyx_t_5numpy_clongdouble_t;
  */
 typedef npy_cdouble __pyx_t_5numpy_complex_t;
 
-/* "src/screening/gap_test_p_1.pyx":23
+/* "slopescreening/screening/gap_test_p_1.pyx":23
  * #(AbstractGapScreening)
  * 
  * cdef class GapTestPequalOne:             # <<<<<<<<<<<<<<
  *    """ Generalized test
  *    """
  */
-struct __pyx_obj_3src_9screening_12gap_test_p_1_GapTestPequalOne {
+struct __pyx_obj_14slopescreening_9screening_12gap_test_p_1_GapTestPequalOne {
   PyObject_HEAD
   double *vec_cumsum_gammas;
   double *vec_kappa_q;
@@ -1368,13 +1495,21 @@ static PyObject *__Pyx_PyFunction_FastCallDict(PyObject *func, PyObject **args,
 #ifndef Py_MEMBER_SIZE
 #define Py_MEMBER_SIZE(type, member) sizeof(((type *)0)->member)
 #endif
+#if CYTHON_FAST_PYCALL
   static size_t __pyx_pyframe_localsplus_offset = 0;
   #include "frameobject.h"
+#if PY_VERSION_HEX >= 0x030b00a6
+  #ifndef Py_BUILD_CORE
+    #define Py_BUILD_CORE 1
+  #endif
+  #include "internal/pycore_frame.h"
+#endif
   #define __Pxy_PyFrame_Initialize_Offsets()\
     ((void)__Pyx_BUILD_ASSERT_EXPR(sizeof(PyFrameObject) == offsetof(PyFrameObject, f_localsplus) + Py_MEMBER_SIZE(PyFrameObject, f_localsplus)),\
      (void)(__pyx_pyframe_localsplus_offset = ((size_t)PyFrame_Type.tp_basicsize) - Py_MEMBER_SIZE(PyFrameObject, f_localsplus)))
   #define __Pyx_PyFrame_GetLocalsplus(frame)\
     (assert(__pyx_pyframe_localsplus_offset), (PyObject **)(((char *)(frame)) + __pyx_pyframe_localsplus_offset))
+#endif // CYTHON_FAST_PYCALL
 #endif
 
 /* PyObjectCall.proto */
@@ -1762,16 +1897,16 @@ static PyTypeObject *__pyx_ptype_5numpy_ufunc = 0;
 
 /* Module declarations from 'cython' */
 
-/* Module declarations from 'src.screening.gap_test_p_1' */
-static PyTypeObject *__pyx_ptype_3src_9screening_12gap_test_p_1_GapTestPequalOne = 0;
+/* Module declarations from 'slopescreening.screening.gap_test_p_1' */
+static PyTypeObject *__pyx_ptype_14slopescreening_9screening_12gap_test_p_1_GapTestPequalOne = 0;
 static __Pyx_TypeInfo __Pyx_TypeInfo_nn_npy_double = { "npy_double", NULL, sizeof(npy_double), { 0 }, 0, 'R', 0, 0 };
 static __Pyx_TypeInfo __Pyx_TypeInfo_long = { "long", NULL, sizeof(long), { 0 }, 0, IS_UNSIGNED(long) ? 'U' : 'I', IS_UNSIGNED(long), 0 };
 static __Pyx_TypeInfo __Pyx_TypeInfo_nn_npy_bool = { "npy_bool", NULL, sizeof(npy_bool), { 0 }, 0, IS_UNSIGNED(npy_bool) ? 'U' : 'I', IS_UNSIGNED(npy_bool), 0 };
-#define __Pyx_MODULE_NAME "src.screening.gap_test_p_1"
-extern int __pyx_module_is_main_src__screening__gap_test_p_1;
-int __pyx_module_is_main_src__screening__gap_test_p_1 = 0;
+#define __Pyx_MODULE_NAME "slopescreening.screening.gap_test_p_1"
+extern int __pyx_module_is_main_slopescreening__screening__gap_test_p_1;
+int __pyx_module_is_main_slopescreening__screening__gap_test_p_1 = 0;
 
-/* Implementation of 'src.screening.gap_test_p_1' */
+/* Implementation of 'slopescreening.screening.gap_test_p_1' */
 static PyObject *__pyx_builtin_range;
 static PyObject *__pyx_builtin_TypeError;
 static PyObject *__pyx_builtin_ImportError;
@@ -1807,10 +1942,10 @@ static const char __pyx_k_cline_in_traceback[] = "cline_in_traceback";
 static const char __pyx_k_coeff_dual_scaling[] = "coeff_dual_scaling";
 static const char __pyx_k_AbstractGapScreening[] = "AbstractGapScreening";
 static const char __pyx_k_vec_coherence_function[] = "vec_coherence_function";
-static const char __pyx_k_src_screening_ascreening[] = "src.screening.ascreening";
 static const char __pyx_k_numpy_core_multiarray_failed_to[] = "numpy.core.multiarray failed to import";
 static const char __pyx_k_self_vec_cumsum_gammas_self_vec[] = "self.vec_cumsum_gammas,self.vec_kappa_q cannot be converted to a Python object for pickling";
 static const char __pyx_k_numpy_core_umath_failed_to_impor[] = "numpy.core.umath failed to import";
+static const char __pyx_k_slopescreening_screening_ascreen[] = "slopescreening.screening.ascreening";
 static PyObject *__pyx_n_s_AbstractGapScreening;
 static PyObject *__pyx_n_s_Atcabs;
 static PyObject *__pyx_n_s_GapTestPequalOne;
@@ -1841,18 +1976,18 @@ static PyObject *__pyx_n_s_reduce_ex;
 static PyObject *__pyx_kp_s_self_vec_cumsum_gammas_self_vec;
 static PyObject *__pyx_n_s_setstate;
 static PyObject *__pyx_n_s_setstate_cython;
+static PyObject *__pyx_n_s_slopescreening_screening_ascreen;
 static PyObject *__pyx_n_s_sqrt;
-static PyObject *__pyx_n_s_src_screening_ascreening;
 static PyObject *__pyx_n_s_test;
 static PyObject *__pyx_n_s_vec_coherence_function;
 static PyObject *__pyx_n_s_vec_gammas;
 static PyObject *__pyx_n_s_zeros;
-static int __pyx_pf_3src_9screening_12gap_test_p_1_16GapTestPequalOne___init__(struct __pyx_obj_3src_9screening_12gap_test_p_1_GapTestPequalOne *__pyx_v_self, PyArrayObject *__pyx_v_vec_gammas, PyArrayObject *__pyx_v_vec_coherence_function); /* proto */
-static void __pyx_pf_3src_9screening_12gap_test_p_1_16GapTestPequalOne_2__dealloc__(struct __pyx_obj_3src_9screening_12gap_test_p_1_GapTestPequalOne *__pyx_v_self); /* proto */
-static PyObject *__pyx_pf_3src_9screening_12gap_test_p_1_16GapTestPequalOne_4apply_test(struct __pyx_obj_3src_9screening_12gap_test_p_1_GapTestPequalOne *__pyx_v_self, PyArrayObject *__pyx_v_Atcabs, double __pyx_v_gap, double __pyx_v_lbd, CYTHON_UNUSED PyArrayObject *__pyx_v_vec_gammas, double __pyx_v_coeff_dual_scaling, double __pyx_v_offset_radius, PyArrayObject *__pyx_v_index); /* proto */
-static PyObject *__pyx_pf_3src_9screening_12gap_test_p_1_16GapTestPequalOne_6__reduce_cython__(CYTHON_UNUSED struct __pyx_obj_3src_9screening_12gap_test_p_1_GapTestPequalOne *__pyx_v_self); /* proto */
-static PyObject *__pyx_pf_3src_9screening_12gap_test_p_1_16GapTestPequalOne_8__setstate_cython__(CYTHON_UNUSED struct __pyx_obj_3src_9screening_12gap_test_p_1_GapTestPequalOne *__pyx_v_self, CYTHON_UNUSED PyObject *__pyx_v___pyx_state); /* proto */
-static PyObject *__pyx_tp_new_3src_9screening_12gap_test_p_1_GapTestPequalOne(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/
+static int __pyx_pf_14slopescreening_9screening_12gap_test_p_1_16GapTestPequalOne___init__(struct __pyx_obj_14slopescreening_9screening_12gap_test_p_1_GapTestPequalOne *__pyx_v_self, PyArrayObject *__pyx_v_vec_gammas, PyArrayObject *__pyx_v_vec_coherence_function); /* proto */
+static void __pyx_pf_14slopescreening_9screening_12gap_test_p_1_16GapTestPequalOne_2__dealloc__(struct __pyx_obj_14slopescreening_9screening_12gap_test_p_1_GapTestPequalOne *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_14slopescreening_9screening_12gap_test_p_1_16GapTestPequalOne_4apply_test(struct __pyx_obj_14slopescreening_9screening_12gap_test_p_1_GapTestPequalOne *__pyx_v_self, PyArrayObject *__pyx_v_Atcabs, double __pyx_v_gap, double __pyx_v_lbd, CYTHON_UNUSED PyArrayObject *__pyx_v_vec_gammas, double __pyx_v_coeff_dual_scaling, double __pyx_v_offset_radius, PyArrayObject *__pyx_v_index); /* proto */
+static PyObject *__pyx_pf_14slopescreening_9screening_12gap_test_p_1_16GapTestPequalOne_6__reduce_cython__(CYTHON_UNUSED struct __pyx_obj_14slopescreening_9screening_12gap_test_p_1_GapTestPequalOne *__pyx_v_self); /* proto */
+static PyObject *__pyx_pf_14slopescreening_9screening_12gap_test_p_1_16GapTestPequalOne_8__setstate_cython__(CYTHON_UNUSED struct __pyx_obj_14slopescreening_9screening_12gap_test_p_1_GapTestPequalOne *__pyx_v_self, CYTHON_UNUSED PyObject *__pyx_v___pyx_state); /* proto */
+static PyObject *__pyx_tp_new_14slopescreening_9screening_12gap_test_p_1_GapTestPequalOne(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/
 static PyObject *__pyx_int_1;
 static PyObject *__pyx_int_neg_1;
 static PyObject *__pyx_slice_;
@@ -1863,7 +1998,7 @@ static PyObject *__pyx_tuple__5;
 static PyObject *__pyx_tuple__6;
 /* Late includes */
 
-/* "src/screening/gap_test_p_1.pyx":39
+/* "slopescreening/screening/gap_test_p_1.pyx":39
  *    @cython.boundscheck(False) # turn off bounds-checking for entire function
  *    @cython.wraparound(False)  # turn off negative index wrapping for entire function
  *    def __init__(             # <<<<<<<<<<<<<<
@@ -1872,8 +2007,8 @@ static PyObject *__pyx_tuple__6;
  */
 
 /* Python wrapper */
-static int __pyx_pw_3src_9screening_12gap_test_p_1_16GapTestPequalOne_1__init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static int __pyx_pw_3src_9screening_12gap_test_p_1_16GapTestPequalOne_1__init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+static int __pyx_pw_14slopescreening_9screening_12gap_test_p_1_16GapTestPequalOne_1__init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static int __pyx_pw_14slopescreening_9screening_12gap_test_p_1_16GapTestPequalOne_1__init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
   PyArrayObject *__pyx_v_vec_gammas = 0;
   PyArrayObject *__pyx_v_vec_coherence_function = 0;
   int __pyx_lineno = 0;
@@ -1924,13 +2059,13 @@ static int __pyx_pw_3src_9screening_12gap_test_p_1_16GapTestPequalOne_1__init__(
   __pyx_L5_argtuple_error:;
   __Pyx_RaiseArgtupleInvalid("__init__", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 39, __pyx_L3_error)
   __pyx_L3_error:;
-  __Pyx_AddTraceback("src.screening.gap_test_p_1.GapTestPequalOne.__init__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_AddTraceback("slopescreening.screening.gap_test_p_1.GapTestPequalOne.__init__", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __Pyx_RefNannyFinishContext();
   return -1;
   __pyx_L4_argument_unpacking_done:;
   if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_vec_gammas), __pyx_ptype_5numpy_ndarray, 1, "vec_gammas", 0))) __PYX_ERR(0, 41, __pyx_L1_error)
   if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_vec_coherence_function), __pyx_ptype_5numpy_ndarray, 1, "vec_coherence_function", 0))) __PYX_ERR(0, 42, __pyx_L1_error)
-  __pyx_r = __pyx_pf_3src_9screening_12gap_test_p_1_16GapTestPequalOne___init__(((struct __pyx_obj_3src_9screening_12gap_test_p_1_GapTestPequalOne *)__pyx_v_self), __pyx_v_vec_gammas, __pyx_v_vec_coherence_function);
+  __pyx_r = __pyx_pf_14slopescreening_9screening_12gap_test_p_1_16GapTestPequalOne___init__(((struct __pyx_obj_14slopescreening_9screening_12gap_test_p_1_GapTestPequalOne *)__pyx_v_self), __pyx_v_vec_gammas, __pyx_v_vec_coherence_function);
 
   /* function exit code */
   goto __pyx_L0;
@@ -1941,7 +2076,7 @@ static int __pyx_pw_3src_9screening_12gap_test_p_1_16GapTestPequalOne_1__init__(
   return __pyx_r;
 }
 
-static int __pyx_pf_3src_9screening_12gap_test_p_1_16GapTestPequalOne___init__(struct __pyx_obj_3src_9screening_12gap_test_p_1_GapTestPequalOne *__pyx_v_self, PyArrayObject *__pyx_v_vec_gammas, PyArrayObject *__pyx_v_vec_coherence_function) {
+static int __pyx_pf_14slopescreening_9screening_12gap_test_p_1_16GapTestPequalOne___init__(struct __pyx_obj_14slopescreening_9screening_12gap_test_p_1_GapTestPequalOne *__pyx_v_self, PyArrayObject *__pyx_v_vec_gammas, PyArrayObject *__pyx_v_vec_coherence_function) {
   int __pyx_v_n;
   int __pyx_v_i;
   __Pyx_LocalBuf_ND __pyx_pybuffernd_vec_coherence_function;
@@ -1982,7 +2117,7 @@ static int __pyx_pf_3src_9screening_12gap_test_p_1_16GapTestPequalOne___init__(s
   }
   __pyx_pybuffernd_vec_coherence_function.diminfo[0].strides = __pyx_pybuffernd_vec_coherence_function.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_vec_coherence_function.diminfo[0].shape = __pyx_pybuffernd_vec_coherence_function.rcbuffer->pybuffer.shape[0];
 
-  /* "src/screening/gap_test_p_1.pyx":45
+  /* "slopescreening/screening/gap_test_p_1.pyx":45
  *       ):
  * 
  *       cdef int n = vec_gammas.shape[0]             # <<<<<<<<<<<<<<
@@ -1991,7 +2126,7 @@ static int __pyx_pf_3src_9screening_12gap_test_p_1_16GapTestPequalOne___init__(s
  */
   __pyx_v_n = (__pyx_v_vec_gammas->dimensions[0]);
 
-  /* "src/screening/gap_test_p_1.pyx":57
+  /* "slopescreening/screening/gap_test_p_1.pyx":57
  *       # self.vec_kappa_q = &buf2[0]
  * 
  *       self.vec_cumsum_gammas = <double*> PyMem_Malloc(n * sizeof(double))             # <<<<<<<<<<<<<<
@@ -2000,7 +2135,7 @@ static int __pyx_pf_3src_9screening_12gap_test_p_1_16GapTestPequalOne___init__(s
  */
   __pyx_v_self->vec_cumsum_gammas = ((double *)PyMem_Malloc((__pyx_v_n * (sizeof(double)))));
 
-  /* "src/screening/gap_test_p_1.pyx":58
+  /* "slopescreening/screening/gap_test_p_1.pyx":58
  * 
  *       self.vec_cumsum_gammas = <double*> PyMem_Malloc(n * sizeof(double))
  *       self.vec_cumsum_gammas[0] = vec_gammas[0]             # <<<<<<<<<<<<<<
@@ -2010,7 +2145,7 @@ static int __pyx_pf_3src_9screening_12gap_test_p_1_16GapTestPequalOne___init__(s
   __pyx_t_1 = 0;
   (__pyx_v_self->vec_cumsum_gammas[0]) = (*__Pyx_BufPtrStrided1d(npy_double *, __pyx_pybuffernd_vec_gammas.rcbuffer->pybuffer.buf, __pyx_t_1, __pyx_pybuffernd_vec_gammas.diminfo[0].strides));
 
-  /* "src/screening/gap_test_p_1.pyx":60
+  /* "slopescreening/screening/gap_test_p_1.pyx":60
  *       self.vec_cumsum_gammas[0] = vec_gammas[0]
  * 
  *       self.vec_kappa_q = <double*> PyMem_Malloc(n * sizeof(double))             # <<<<<<<<<<<<<<
@@ -2019,7 +2154,7 @@ static int __pyx_pf_3src_9screening_12gap_test_p_1_16GapTestPequalOne___init__(s
  */
   __pyx_v_self->vec_kappa_q = ((double *)PyMem_Malloc((__pyx_v_n * (sizeof(double)))));
 
-  /* "src/screening/gap_test_p_1.pyx":62
+  /* "slopescreening/screening/gap_test_p_1.pyx":62
  *       self.vec_kappa_q = <double*> PyMem_Malloc(n * sizeof(double))
  * 
  *       cdef int i = 0             # <<<<<<<<<<<<<<
@@ -2028,7 +2163,7 @@ static int __pyx_pf_3src_9screening_12gap_test_p_1_16GapTestPequalOne___init__(s
  */
   __pyx_v_i = 0;
 
-  /* "src/screening/gap_test_p_1.pyx":63
+  /* "slopescreening/screening/gap_test_p_1.pyx":63
  * 
  *       cdef int i = 0
  *       for i in range(1, n):             # <<<<<<<<<<<<<<
@@ -2040,7 +2175,7 @@ static int __pyx_pf_3src_9screening_12gap_test_p_1_16GapTestPequalOne___init__(s
   for (__pyx_t_4 = 1; __pyx_t_4 < __pyx_t_3; __pyx_t_4+=1) {
     __pyx_v_i = __pyx_t_4;
 
-    /* "src/screening/gap_test_p_1.pyx":64
+    /* "slopescreening/screening/gap_test_p_1.pyx":64
  *       cdef int i = 0
  *       for i in range(1, n):
  *          self.vec_cumsum_gammas[i] = self.vec_cumsum_gammas[i-1] + vec_gammas[i]             # <<<<<<<<<<<<<<
@@ -2051,7 +2186,7 @@ static int __pyx_pf_3src_9screening_12gap_test_p_1_16GapTestPequalOne___init__(s
     (__pyx_v_self->vec_cumsum_gammas[__pyx_v_i]) = ((__pyx_v_self->vec_cumsum_gammas[(__pyx_v_i - 1)]) + (*__Pyx_BufPtrStrided1d(npy_double *, __pyx_pybuffernd_vec_gammas.rcbuffer->pybuffer.buf, __pyx_t_1, __pyx_pybuffernd_vec_gammas.diminfo[0].strides)));
   }
 
-  /* "src/screening/gap_test_p_1.pyx":66
+  /* "slopescreening/screening/gap_test_p_1.pyx":66
  *          self.vec_cumsum_gammas[i] = self.vec_cumsum_gammas[i-1] + vec_gammas[i]
  * 
  *       for i in range(n):             # <<<<<<<<<<<<<<
@@ -2063,7 +2198,7 @@ static int __pyx_pf_3src_9screening_12gap_test_p_1_16GapTestPequalOne___init__(s
   for (__pyx_t_4 = 0; __pyx_t_4 < __pyx_t_3; __pyx_t_4+=1) {
     __pyx_v_i = __pyx_t_4;
 
-    /* "src/screening/gap_test_p_1.pyx":67
+    /* "slopescreening/screening/gap_test_p_1.pyx":67
  * 
  *       for i in range(n):
  *          self.vec_kappa_q[i] = np.sqrt(             # <<<<<<<<<<<<<<
@@ -2076,7 +2211,7 @@ static int __pyx_pf_3src_9screening_12gap_test_p_1_16GapTestPequalOne___init__(s
     __Pyx_GOTREF(__pyx_t_7);
     __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
 
-    /* "src/screening/gap_test_p_1.pyx":68
+    /* "slopescreening/screening/gap_test_p_1.pyx":68
  *       for i in range(n):
  *          self.vec_kappa_q[i] = np.sqrt(
  *          (1. + vec_coherence_function[i]) * (i + 1.)             # <<<<<<<<<<<<<<
@@ -2103,7 +2238,7 @@ static int __pyx_pf_3src_9screening_12gap_test_p_1_16GapTestPequalOne___init__(s
     __Pyx_GOTREF(__pyx_t_5);
     __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
 
-    /* "src/screening/gap_test_p_1.pyx":67
+    /* "slopescreening/screening/gap_test_p_1.pyx":67
  * 
  *       for i in range(n):
  *          self.vec_kappa_q[i] = np.sqrt(             # <<<<<<<<<<<<<<
@@ -2115,7 +2250,7 @@ static int __pyx_pf_3src_9screening_12gap_test_p_1_16GapTestPequalOne___init__(s
     (__pyx_v_self->vec_kappa_q[__pyx_v_i]) = __pyx_t_9;
   }
 
-  /* "src/screening/gap_test_p_1.pyx":76
+  /* "slopescreening/screening/gap_test_p_1.pyx":76
  *       # ).copy()
  * 
  *       self.name = "Gap test p=1 (cython)"             # <<<<<<<<<<<<<<
@@ -2124,7 +2259,7 @@ static int __pyx_pf_3src_9screening_12gap_test_p_1_16GapTestPequalOne___init__(s
  */
   __pyx_v_self->name = ((char *)"Gap test p=1 (cython)");
 
-  /* "src/screening/gap_test_p_1.pyx":39
+  /* "slopescreening/screening/gap_test_p_1.pyx":39
  *    @cython.boundscheck(False) # turn off bounds-checking for entire function
  *    @cython.wraparound(False)  # turn off negative index wrapping for entire function
  *    def __init__(             # <<<<<<<<<<<<<<
@@ -2147,7 +2282,7 @@ static int __pyx_pf_3src_9screening_12gap_test_p_1_16GapTestPequalOne___init__(s
     __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_vec_coherence_function.rcbuffer->pybuffer);
     __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_vec_gammas.rcbuffer->pybuffer);
   __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);}
-  __Pyx_AddTraceback("src.screening.gap_test_p_1.GapTestPequalOne.__init__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_AddTraceback("slopescreening.screening.gap_test_p_1.GapTestPequalOne.__init__", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __pyx_r = -1;
   goto __pyx_L2;
   __pyx_L0:;
@@ -2158,7 +2293,7 @@ static int __pyx_pf_3src_9screening_12gap_test_p_1_16GapTestPequalOne___init__(s
   return __pyx_r;
 }
 
-/* "src/screening/gap_test_p_1.pyx":79
+/* "slopescreening/screening/gap_test_p_1.pyx":79
  * 
  * 
  *    def __dealloc__(self):             # <<<<<<<<<<<<<<
@@ -2167,21 +2302,21 @@ static int __pyx_pf_3src_9screening_12gap_test_p_1_16GapTestPequalOne___init__(s
  */
 
 /* Python wrapper */
-static void __pyx_pw_3src_9screening_12gap_test_p_1_16GapTestPequalOne_3__dealloc__(PyObject *__pyx_v_self); /*proto*/
-static void __pyx_pw_3src_9screening_12gap_test_p_1_16GapTestPequalOne_3__dealloc__(PyObject *__pyx_v_self) {
+static void __pyx_pw_14slopescreening_9screening_12gap_test_p_1_16GapTestPequalOne_3__dealloc__(PyObject *__pyx_v_self); /*proto*/
+static void __pyx_pw_14slopescreening_9screening_12gap_test_p_1_16GapTestPequalOne_3__dealloc__(PyObject *__pyx_v_self) {
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("__dealloc__ (wrapper)", 0);
-  __pyx_pf_3src_9screening_12gap_test_p_1_16GapTestPequalOne_2__dealloc__(((struct __pyx_obj_3src_9screening_12gap_test_p_1_GapTestPequalOne *)__pyx_v_self));
+  __pyx_pf_14slopescreening_9screening_12gap_test_p_1_16GapTestPequalOne_2__dealloc__(((struct __pyx_obj_14slopescreening_9screening_12gap_test_p_1_GapTestPequalOne *)__pyx_v_self));
 
   /* function exit code */
   __Pyx_RefNannyFinishContext();
 }
 
-static void __pyx_pf_3src_9screening_12gap_test_p_1_16GapTestPequalOne_2__dealloc__(struct __pyx_obj_3src_9screening_12gap_test_p_1_GapTestPequalOne *__pyx_v_self) {
+static void __pyx_pf_14slopescreening_9screening_12gap_test_p_1_16GapTestPequalOne_2__dealloc__(struct __pyx_obj_14slopescreening_9screening_12gap_test_p_1_GapTestPequalOne *__pyx_v_self) {
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("__dealloc__", 0);
 
-  /* "src/screening/gap_test_p_1.pyx":80
+  /* "slopescreening/screening/gap_test_p_1.pyx":80
  * 
  *    def __dealloc__(self):
  *       PyMem_Free(self.vec_cumsum_gammas)  # no-op if self.data is NULL             # <<<<<<<<<<<<<<
@@ -2190,7 +2325,7 @@ static void __pyx_pf_3src_9screening_12gap_test_p_1_16GapTestPequalOne_2__deallo
  */
   PyMem_Free(__pyx_v_self->vec_cumsum_gammas);
 
-  /* "src/screening/gap_test_p_1.pyx":81
+  /* "slopescreening/screening/gap_test_p_1.pyx":81
  *    def __dealloc__(self):
  *       PyMem_Free(self.vec_cumsum_gammas)  # no-op if self.data is NULL
  *       PyMem_Free(self.vec_kappa_q)  # no-op if self.data is NULL             # <<<<<<<<<<<<<<
@@ -2199,7 +2334,7 @@ static void __pyx_pf_3src_9screening_12gap_test_p_1_16GapTestPequalOne_2__deallo
  */
   PyMem_Free(__pyx_v_self->vec_kappa_q);
 
-  /* "src/screening/gap_test_p_1.pyx":79
+  /* "slopescreening/screening/gap_test_p_1.pyx":79
  * 
  * 
  *    def __dealloc__(self):             # <<<<<<<<<<<<<<
@@ -2211,7 +2346,7 @@ static void __pyx_pf_3src_9screening_12gap_test_p_1_16GapTestPequalOne_2__deallo
   __Pyx_RefNannyFinishContext();
 }
 
-/* "src/screening/gap_test_p_1.pyx":86
+/* "slopescreening/screening/gap_test_p_1.pyx":86
  *    @cython.boundscheck(False) # turn off bounds-checking for entire function
  *    @cython.wraparound(False)  # turn off negative index wrapping for entire function
  *    def apply_test(self,             # <<<<<<<<<<<<<<
@@ -2220,9 +2355,9 @@ static void __pyx_pf_3src_9screening_12gap_test_p_1_16GapTestPequalOne_2__deallo
  */
 
 /* Python wrapper */
-static PyObject *__pyx_pw_3src_9screening_12gap_test_p_1_16GapTestPequalOne_5apply_test(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static char __pyx_doc_3src_9screening_12gap_test_p_1_16GapTestPequalOne_4apply_test[] = " Apply the Gap safe sphere screening test\n\n      Implementation of the safe screening test\n      \n      Parameters\n      ----------\n      Atcabs : np.ndarray\n         vector matA.T @ vecc where vec is dual admissible in absolute value\n         size [n]\n      gap : positive float\n         duality gap\n      lbd : positive float\n         regularization parameters\n      vec_gammas : np.ndarray\n         slope parameters\n         size [n,]\n      vec_gammas : np.ndarray\n         slope parameters\n         size [n,]\n      coeff_dual_scaling : positif float\n         If coeff_dual_scaling is not feasible, dual scaling factor\n         such taht vecu / coeff_dual_scaling os dual feasible\n         Here for code optimization purposes\n         Default value is 1. (vecu is feasible)\n      offset_radius : float\n         additive term added to the redius\n         default is 0\n      index : np.ndarray\n         Array of indices that sort Atu in absolute value\n         default is None\n      \n      Returns\n      -------\n      calI_screen : np.ndarray\n         vector of boolean\n         True if screening test passes and False otherwise\n         size [n,]\n      ";
-static PyObject *__pyx_pw_3src_9screening_12gap_test_p_1_16GapTestPequalOne_5apply_test(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+static PyObject *__pyx_pw_14slopescreening_9screening_12gap_test_p_1_16GapTestPequalOne_5apply_test(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static char __pyx_doc_14slopescreening_9screening_12gap_test_p_1_16GapTestPequalOne_4apply_test[] = " Apply the Gap safe sphere screening test\n\n      Implementation of the safe screening test\n      \n      Parameters\n      ----------\n      Atcabs : np.ndarray\n         vector matA.T @ vecc where vec is dual admissible in absolute value\n         size [n]\n      gap : positive float\n         duality gap\n      lbd : positive float\n         regularization parameters\n      vec_gammas : np.ndarray\n         slope parameters\n         size [n,]\n      vec_gammas : np.ndarray\n         slope parameters\n         size [n,]\n      coeff_dual_scaling : positif float\n         If coeff_dual_scaling is not feasible, dual scaling factor\n         such taht vecu / coeff_dual_scaling os dual feasible\n         Here for code optimization purposes\n         Default value is 1. (vecu is feasible)\n      offset_radius : float\n         additive term added to the redius\n         default is 0\n      index : np.ndarray\n         Array of indices that sort Atu in absolute value\n         default is None\n      \n      Returns\n      -------\n      calI_screen : np.ndarray\n         vector of boolean\n         True if screening test passes and False otherwise\n         size [n,]\n      ";
+static PyObject *__pyx_pw_14slopescreening_9screening_12gap_test_p_1_16GapTestPequalOne_5apply_test(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
   PyArrayObject *__pyx_v_Atcabs = 0;
   double __pyx_v_gap;
   double __pyx_v_lbd;
@@ -2240,7 +2375,7 @@ static PyObject *__pyx_pw_3src_9screening_12gap_test_p_1_16GapTestPequalOne_5app
     static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_Atcabs,&__pyx_n_s_gap,&__pyx_n_s_lbd,&__pyx_n_s_vec_gammas,&__pyx_n_s_coeff_dual_scaling,&__pyx_n_s_offset_radius,&__pyx_n_s_index,0};
     PyObject* values[7] = {0,0,0,0,0,0,0};
 
-    /* "src/screening/gap_test_p_1.pyx":93
+    /* "slopescreening/screening/gap_test_p_1.pyx":93
  *       double coeff_dual_scaling = 1.,
  *       double offset_radius=0.,
  *       np.ndarray[long, ndim=1] index=None             # <<<<<<<<<<<<<<
@@ -2350,16 +2485,16 @@ static PyObject *__pyx_pw_3src_9screening_12gap_test_p_1_16GapTestPequalOne_5app
   __pyx_L5_argtuple_error:;
   __Pyx_RaiseArgtupleInvalid("apply_test", 0, 4, 7, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 86, __pyx_L3_error)
   __pyx_L3_error:;
-  __Pyx_AddTraceback("src.screening.gap_test_p_1.GapTestPequalOne.apply_test", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_AddTraceback("slopescreening.screening.gap_test_p_1.GapTestPequalOne.apply_test", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __Pyx_RefNannyFinishContext();
   return NULL;
   __pyx_L4_argument_unpacking_done:;
   if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_Atcabs), __pyx_ptype_5numpy_ndarray, 1, "Atcabs", 0))) __PYX_ERR(0, 87, __pyx_L1_error)
   if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_vec_gammas), __pyx_ptype_5numpy_ndarray, 1, "vec_gammas", 0))) __PYX_ERR(0, 90, __pyx_L1_error)
   if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_index), __pyx_ptype_5numpy_ndarray, 1, "index", 0))) __PYX_ERR(0, 93, __pyx_L1_error)
-  __pyx_r = __pyx_pf_3src_9screening_12gap_test_p_1_16GapTestPequalOne_4apply_test(((struct __pyx_obj_3src_9screening_12gap_test_p_1_GapTestPequalOne *)__pyx_v_self), __pyx_v_Atcabs, __pyx_v_gap, __pyx_v_lbd, __pyx_v_vec_gammas, __pyx_v_coeff_dual_scaling, __pyx_v_offset_radius, __pyx_v_index);
+  __pyx_r = __pyx_pf_14slopescreening_9screening_12gap_test_p_1_16GapTestPequalOne_4apply_test(((struct __pyx_obj_14slopescreening_9screening_12gap_test_p_1_GapTestPequalOne *)__pyx_v_self), __pyx_v_Atcabs, __pyx_v_gap, __pyx_v_lbd, __pyx_v_vec_gammas, __pyx_v_coeff_dual_scaling, __pyx_v_offset_radius, __pyx_v_index);
 
-  /* "src/screening/gap_test_p_1.pyx":86
+  /* "slopescreening/screening/gap_test_p_1.pyx":86
  *    @cython.boundscheck(False) # turn off bounds-checking for entire function
  *    @cython.wraparound(False)  # turn off negative index wrapping for entire function
  *    def apply_test(self,             # <<<<<<<<<<<<<<
@@ -2376,7 +2511,7 @@ static PyObject *__pyx_pw_3src_9screening_12gap_test_p_1_16GapTestPequalOne_5app
   return __pyx_r;
 }
 
-static PyObject *__pyx_pf_3src_9screening_12gap_test_p_1_16GapTestPequalOne_4apply_test(struct __pyx_obj_3src_9screening_12gap_test_p_1_GapTestPequalOne *__pyx_v_self, PyArrayObject *__pyx_v_Atcabs, double __pyx_v_gap, double __pyx_v_lbd, CYTHON_UNUSED PyArrayObject *__pyx_v_vec_gammas, double __pyx_v_coeff_dual_scaling, double __pyx_v_offset_radius, PyArrayObject *__pyx_v_index) {
+static PyObject *__pyx_pf_14slopescreening_9screening_12gap_test_p_1_16GapTestPequalOne_4apply_test(struct __pyx_obj_14slopescreening_9screening_12gap_test_p_1_GapTestPequalOne *__pyx_v_self, PyArrayObject *__pyx_v_Atcabs, double __pyx_v_gap, double __pyx_v_lbd, CYTHON_UNUSED PyArrayObject *__pyx_v_vec_gammas, double __pyx_v_coeff_dual_scaling, double __pyx_v_offset_radius, PyArrayObject *__pyx_v_index) {
   int __pyx_v_n;
   int __pyx_v_q;
   int __pyx_v_l_q;
@@ -2460,7 +2595,7 @@ static PyObject *__pyx_pf_3src_9screening_12gap_test_p_1_16GapTestPequalOne_4app
   }
   __pyx_pybuffernd_index.diminfo[0].strides = __pyx_pybuffernd_index.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_index.diminfo[0].shape = __pyx_pybuffernd_index.rcbuffer->pybuffer.shape[0];
 
-  /* "src/screening/gap_test_p_1.pyx":134
+  /* "slopescreening/screening/gap_test_p_1.pyx":134
  *       """
  * 
  *       cdef int n = Atcabs.shape[0]             # <<<<<<<<<<<<<<
@@ -2469,7 +2604,7 @@ static PyObject *__pyx_pf_3src_9screening_12gap_test_p_1_16GapTestPequalOne_4app
  */
   __pyx_v_n = (__pyx_v_Atcabs->dimensions[0]);
 
-  /* "src/screening/gap_test_p_1.pyx":136
+  /* "slopescreening/screening/gap_test_p_1.pyx":136
  *       cdef int n = Atcabs.shape[0]
  *       cdef int q, l_q
  *       cdef int l_min = 0             # <<<<<<<<<<<<<<
@@ -2478,7 +2613,7 @@ static PyObject *__pyx_pf_3src_9screening_12gap_test_p_1_16GapTestPequalOne_4app
  */
   __pyx_v_l_min = 0;
 
-  /* "src/screening/gap_test_p_1.pyx":139
+  /* "slopescreening/screening/gap_test_p_1.pyx":139
  * 
  *       cdef double bound
  *       cdef double radius = coeff_dual_scaling * np.sqrt(2 * gap) + offset_radius             # <<<<<<<<<<<<<<
@@ -2524,7 +2659,7 @@ static PyObject *__pyx_pf_3src_9screening_12gap_test_p_1_16GapTestPequalOne_4app
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   __pyx_v_radius = __pyx_t_6;
 
-  /* "src/screening/gap_test_p_1.pyx":140
+  /* "slopescreening/screening/gap_test_p_1.pyx":140
  *       cdef double bound
  *       cdef double radius = coeff_dual_scaling * np.sqrt(2 * gap) + offset_radius
  *       cdef double coeff_lbd = coeff_dual_scaling * lbd             # <<<<<<<<<<<<<<
@@ -2533,7 +2668,7 @@ static PyObject *__pyx_pf_3src_9screening_12gap_test_p_1_16GapTestPequalOne_4app
  */
   __pyx_v_coeff_lbd = (__pyx_v_coeff_dual_scaling * __pyx_v_lbd);
 
-  /* "src/screening/gap_test_p_1.pyx":142
+  /* "slopescreening/screening/gap_test_p_1.pyx":142
  *       cdef double coeff_lbd = coeff_dual_scaling * lbd
  * 
  *       cdef np.ndarray[np.npy_double, ndim=1] sigmas = np.zeros(n+1)             # <<<<<<<<<<<<<<
@@ -2577,7 +2712,7 @@ static PyObject *__pyx_pf_3src_9screening_12gap_test_p_1_16GapTestPequalOne_4app
   __pyx_v_sigmas = ((PyArrayObject *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "src/screening/gap_test_p_1.pyx":145
+  /* "slopescreening/screening/gap_test_p_1.pyx":145
  * 
  *       # output
  *       cdef np.ndarray[np.npy_bool, ndim=1] calI_screen = np.zeros(n, dtype=bool)             # <<<<<<<<<<<<<<
@@ -2618,7 +2753,7 @@ static PyObject *__pyx_pf_3src_9screening_12gap_test_p_1_16GapTestPequalOne_4app
   __pyx_v_calI_screen = ((PyArrayObject *)__pyx_t_3);
   __pyx_t_3 = 0;
 
-  /* "src/screening/gap_test_p_1.pyx":148
+  /* "slopescreening/screening/gap_test_p_1.pyx":148
  * 
  *       # 1. Sort in descending order
  *       if index is None:             # <<<<<<<<<<<<<<
@@ -2629,7 +2764,7 @@ static PyObject *__pyx_pf_3src_9screening_12gap_test_p_1_16GapTestPequalOne_4app
   __pyx_t_10 = (__pyx_t_9 != 0);
   if (__pyx_t_10) {
 
-    /* "src/screening/gap_test_p_1.pyx":149
+    /* "slopescreening/screening/gap_test_p_1.pyx":149
  *       # 1. Sort in descending order
  *       if index is None:
  *          index = np.argsort(Atcabs)[::-1]             # <<<<<<<<<<<<<<
@@ -2682,7 +2817,7 @@ static PyObject *__pyx_pf_3src_9screening_12gap_test_p_1_16GapTestPequalOne_4app
     __Pyx_DECREF_SET(__pyx_v_index, ((PyArrayObject *)__pyx_t_2));
     __pyx_t_2 = 0;
 
-    /* "src/screening/gap_test_p_1.pyx":148
+    /* "slopescreening/screening/gap_test_p_1.pyx":148
  * 
  *       # 1. Sort in descending order
  *       if index is None:             # <<<<<<<<<<<<<<
@@ -2691,7 +2826,7 @@ static PyObject *__pyx_pf_3src_9screening_12gap_test_p_1_16GapTestPequalOne_4app
  */
   }
 
-  /* "src/screening/gap_test_p_1.pyx":152
+  /* "slopescreening/screening/gap_test_p_1.pyx":152
  * 
  *          # Cdric' notations compliant
  *       sigmas[1:] = np.cumsum(Atcabs[index])             # <<<<<<<<<<<<<<
@@ -2724,7 +2859,7 @@ static PyObject *__pyx_pf_3src_9screening_12gap_test_p_1_16GapTestPequalOne_4app
   if (unlikely(PyObject_SetItem(((PyObject *)__pyx_v_sigmas), __pyx_slice__2, __pyx_t_2) < 0)) __PYX_ERR(0, 152, __pyx_L1_error)
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
 
-  /* "src/screening/gap_test_p_1.pyx":154
+  /* "slopescreening/screening/gap_test_p_1.pyx":154
  *       sigmas[1:] = np.cumsum(Atcabs[index])
  * 
  *       for q in range(n-1, -1, -1):             # <<<<<<<<<<<<<<
@@ -2734,7 +2869,7 @@ static PyObject *__pyx_pf_3src_9screening_12gap_test_p_1_16GapTestPequalOne_4app
   for (__pyx_t_12 = (__pyx_v_n - 1); __pyx_t_12 > -1; __pyx_t_12-=1) {
     __pyx_v_q = __pyx_t_12;
 
-    /* "src/screening/gap_test_p_1.pyx":155
+    /* "slopescreening/screening/gap_test_p_1.pyx":155
  * 
  *       for q in range(n-1, -1, -1):
  *          bound = coeff_lbd * self.vec_cumsum_gammas[q] - self.vec_kappa_q[q] * radius - sigmas[q]             # <<<<<<<<<<<<<<
@@ -2744,7 +2879,7 @@ static PyObject *__pyx_pf_3src_9screening_12gap_test_p_1_16GapTestPequalOne_4app
     __pyx_t_16 = __pyx_v_q;
     __pyx_v_bound = (((__pyx_v_coeff_lbd * (__pyx_v_self->vec_cumsum_gammas[__pyx_v_q])) - ((__pyx_v_self->vec_kappa_q[__pyx_v_q]) * __pyx_v_radius)) - (*__Pyx_BufPtrStrided1d(npy_double *, __pyx_pybuffernd_sigmas.rcbuffer->pybuffer.buf, __pyx_t_16, __pyx_pybuffernd_sigmas.diminfo[0].strides)));
 
-    /* "src/screening/gap_test_p_1.pyx":157
+    /* "slopescreening/screening/gap_test_p_1.pyx":157
  *          bound = coeff_lbd * self.vec_cumsum_gammas[q] - self.vec_kappa_q[q] * radius - sigmas[q]
  * 
  *          if Atcabs[index[q]] < bound:             # <<<<<<<<<<<<<<
@@ -2756,7 +2891,7 @@ static PyObject *__pyx_pf_3src_9screening_12gap_test_p_1_16GapTestPequalOne_4app
     __pyx_t_10 = (((*__Pyx_BufPtrStrided1d(npy_double *, __pyx_pybuffernd_Atcabs.rcbuffer->pybuffer.buf, __pyx_t_17, __pyx_pybuffernd_Atcabs.diminfo[0].strides)) < __pyx_v_bound) != 0);
     if (__pyx_t_10) {
 
-      /* "src/screening/gap_test_p_1.pyx":158
+      /* "slopescreening/screening/gap_test_p_1.pyx":158
  * 
  *          if Atcabs[index[q]] < bound:
  *             l_q = 0             # <<<<<<<<<<<<<<
@@ -2765,7 +2900,7 @@ static PyObject *__pyx_pf_3src_9screening_12gap_test_p_1_16GapTestPequalOne_4app
  */
       __pyx_v_l_q = 0;
 
-      /* "src/screening/gap_test_p_1.pyx":157
+      /* "slopescreening/screening/gap_test_p_1.pyx":157
  *          bound = coeff_lbd * self.vec_cumsum_gammas[q] - self.vec_kappa_q[q] * radius - sigmas[q]
  * 
  *          if Atcabs[index[q]] < bound:             # <<<<<<<<<<<<<<
@@ -2775,7 +2910,7 @@ static PyObject *__pyx_pf_3src_9screening_12gap_test_p_1_16GapTestPequalOne_4app
       goto __pyx_L6;
     }
 
-    /* "src/screening/gap_test_p_1.pyx":160
+    /* "slopescreening/screening/gap_test_p_1.pyx":160
  *             l_q = 0
  * 
  *          elif Atcabs[index[n-1]] >= bound:             # <<<<<<<<<<<<<<
@@ -2787,7 +2922,7 @@ static PyObject *__pyx_pf_3src_9screening_12gap_test_p_1_16GapTestPequalOne_4app
     __pyx_t_10 = (((*__Pyx_BufPtrStrided1d(npy_double *, __pyx_pybuffernd_Atcabs.rcbuffer->pybuffer.buf, __pyx_t_17, __pyx_pybuffernd_Atcabs.diminfo[0].strides)) >= __pyx_v_bound) != 0);
     if (__pyx_t_10) {
 
-      /* "src/screening/gap_test_p_1.pyx":161
+      /* "slopescreening/screening/gap_test_p_1.pyx":161
  * 
  *          elif Atcabs[index[n-1]] >= bound:
  *             return calI_screen             # <<<<<<<<<<<<<<
@@ -2799,7 +2934,7 @@ static PyObject *__pyx_pf_3src_9screening_12gap_test_p_1_16GapTestPequalOne_4app
       __pyx_r = ((PyObject *)__pyx_v_calI_screen);
       goto __pyx_L0;
 
-      /* "src/screening/gap_test_p_1.pyx":160
+      /* "slopescreening/screening/gap_test_p_1.pyx":160
  *             l_q = 0
  * 
  *          elif Atcabs[index[n-1]] >= bound:             # <<<<<<<<<<<<<<
@@ -2808,7 +2943,7 @@ static PyObject *__pyx_pf_3src_9screening_12gap_test_p_1_16GapTestPequalOne_4app
  */
     }
 
-    /* "src/screening/gap_test_p_1.pyx":164
+    /* "slopescreening/screening/gap_test_p_1.pyx":164
  * 
  *          else:
  *             l_q = q + np.argmax(Atcabs[index[q:]] < bound)             # <<<<<<<<<<<<<<
@@ -2865,7 +3000,7 @@ static PyObject *__pyx_pf_3src_9screening_12gap_test_p_1_16GapTestPequalOne_4app
     }
     __pyx_L6:;
 
-    /* "src/screening/gap_test_p_1.pyx":166
+    /* "slopescreening/screening/gap_test_p_1.pyx":166
  *             l_q = q + np.argmax(Atcabs[index[q:]] < bound)
  * 
  *          l_min = max(l_min, l_q)             # <<<<<<<<<<<<<<
@@ -2882,7 +3017,7 @@ static PyObject *__pyx_pf_3src_9screening_12gap_test_p_1_16GapTestPequalOne_4app
     __pyx_v_l_min = __pyx_t_21;
   }
 
-  /* "src/screening/gap_test_p_1.pyx":168
+  /* "slopescreening/screening/gap_test_p_1.pyx":168
  *          l_min = max(l_min, l_q)
  * 
  *       calI_screen[index[l_min:]] = True             # <<<<<<<<<<<<<<
@@ -2899,7 +3034,7 @@ static PyObject *__pyx_pf_3src_9screening_12gap_test_p_1_16GapTestPequalOne_4app
   if (unlikely(PyObject_SetItem(((PyObject *)__pyx_v_calI_screen), __pyx_t_4, Py_True) < 0)) __PYX_ERR(0, 168, __pyx_L1_error)
   __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
 
-  /* "src/screening/gap_test_p_1.pyx":169
+  /* "slopescreening/screening/gap_test_p_1.pyx":169
  * 
  *       calI_screen[index[l_min:]] = True
  *       return calI_screen             # <<<<<<<<<<<<<<
@@ -2909,7 +3044,7 @@ static PyObject *__pyx_pf_3src_9screening_12gap_test_p_1_16GapTestPequalOne_4app
   __pyx_r = ((PyObject *)__pyx_v_calI_screen);
   goto __pyx_L0;
 
-  /* "src/screening/gap_test_p_1.pyx":86
+  /* "slopescreening/screening/gap_test_p_1.pyx":86
  *    @cython.boundscheck(False) # turn off bounds-checking for entire function
  *    @cython.wraparound(False)  # turn off negative index wrapping for entire function
  *    def apply_test(self,             # <<<<<<<<<<<<<<
@@ -2935,7 +3070,7 @@ static PyObject *__pyx_pf_3src_9screening_12gap_test_p_1_16GapTestPequalOne_4app
     __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_sigmas.rcbuffer->pybuffer);
     __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_vec_gammas.rcbuffer->pybuffer);
   __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);}
-  __Pyx_AddTraceback("src.screening.gap_test_p_1.GapTestPequalOne.apply_test", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_AddTraceback("slopescreening.screening.gap_test_p_1.GapTestPequalOne.apply_test", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __pyx_r = NULL;
   goto __pyx_L2;
   __pyx_L0:;
@@ -2960,19 +3095,19 @@ static PyObject *__pyx_pf_3src_9screening_12gap_test_p_1_16GapTestPequalOne_4app
  */
 
 /* Python wrapper */
-static PyObject *__pyx_pw_3src_9screening_12gap_test_p_1_16GapTestPequalOne_7__reduce_cython__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
-static PyObject *__pyx_pw_3src_9screening_12gap_test_p_1_16GapTestPequalOne_7__reduce_cython__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
+static PyObject *__pyx_pw_14slopescreening_9screening_12gap_test_p_1_16GapTestPequalOne_7__reduce_cython__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
+static PyObject *__pyx_pw_14slopescreening_9screening_12gap_test_p_1_16GapTestPequalOne_7__reduce_cython__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
   PyObject *__pyx_r = 0;
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("__reduce_cython__ (wrapper)", 0);
-  __pyx_r = __pyx_pf_3src_9screening_12gap_test_p_1_16GapTestPequalOne_6__reduce_cython__(((struct __pyx_obj_3src_9screening_12gap_test_p_1_GapTestPequalOne *)__pyx_v_self));
+  __pyx_r = __pyx_pf_14slopescreening_9screening_12gap_test_p_1_16GapTestPequalOne_6__reduce_cython__(((struct __pyx_obj_14slopescreening_9screening_12gap_test_p_1_GapTestPequalOne *)__pyx_v_self));
 
   /* function exit code */
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-static PyObject *__pyx_pf_3src_9screening_12gap_test_p_1_16GapTestPequalOne_6__reduce_cython__(CYTHON_UNUSED struct __pyx_obj_3src_9screening_12gap_test_p_1_GapTestPequalOne *__pyx_v_self) {
+static PyObject *__pyx_pf_14slopescreening_9screening_12gap_test_p_1_16GapTestPequalOne_6__reduce_cython__(CYTHON_UNUSED struct __pyx_obj_14slopescreening_9screening_12gap_test_p_1_GapTestPequalOne *__pyx_v_self) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   PyObject *__pyx_t_1 = NULL;
@@ -3002,7 +3137,7 @@ static PyObject *__pyx_pf_3src_9screening_12gap_test_p_1_16GapTestPequalOne_6__r
   /* function exit code */
   __pyx_L1_error:;
   __Pyx_XDECREF(__pyx_t_1);
-  __Pyx_AddTraceback("src.screening.gap_test_p_1.GapTestPequalOne.__reduce_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_AddTraceback("slopescreening.screening.gap_test_p_1.GapTestPequalOne.__reduce_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __pyx_r = NULL;
   __Pyx_XGIVEREF(__pyx_r);
   __Pyx_RefNannyFinishContext();
@@ -3017,19 +3152,19 @@ static PyObject *__pyx_pf_3src_9screening_12gap_test_p_1_16GapTestPequalOne_6__r
  */
 
 /* Python wrapper */
-static PyObject *__pyx_pw_3src_9screening_12gap_test_p_1_16GapTestPequalOne_9__setstate_cython__(PyObject *__pyx_v_self, PyObject *__pyx_v___pyx_state); /*proto*/
-static PyObject *__pyx_pw_3src_9screening_12gap_test_p_1_16GapTestPequalOne_9__setstate_cython__(PyObject *__pyx_v_self, PyObject *__pyx_v___pyx_state) {
+static PyObject *__pyx_pw_14slopescreening_9screening_12gap_test_p_1_16GapTestPequalOne_9__setstate_cython__(PyObject *__pyx_v_self, PyObject *__pyx_v___pyx_state); /*proto*/
+static PyObject *__pyx_pw_14slopescreening_9screening_12gap_test_p_1_16GapTestPequalOne_9__setstate_cython__(PyObject *__pyx_v_self, PyObject *__pyx_v___pyx_state) {
   PyObject *__pyx_r = 0;
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("__setstate_cython__ (wrapper)", 0);
-  __pyx_r = __pyx_pf_3src_9screening_12gap_test_p_1_16GapTestPequalOne_8__setstate_cython__(((struct __pyx_obj_3src_9screening_12gap_test_p_1_GapTestPequalOne *)__pyx_v_self), ((PyObject *)__pyx_v___pyx_state));
+  __pyx_r = __pyx_pf_14slopescreening_9screening_12gap_test_p_1_16GapTestPequalOne_8__setstate_cython__(((struct __pyx_obj_14slopescreening_9screening_12gap_test_p_1_GapTestPequalOne *)__pyx_v_self), ((PyObject *)__pyx_v___pyx_state));
 
   /* function exit code */
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-static PyObject *__pyx_pf_3src_9screening_12gap_test_p_1_16GapTestPequalOne_8__setstate_cython__(CYTHON_UNUSED struct __pyx_obj_3src_9screening_12gap_test_p_1_GapTestPequalOne *__pyx_v_self, CYTHON_UNUSED PyObject *__pyx_v___pyx_state) {
+static PyObject *__pyx_pf_14slopescreening_9screening_12gap_test_p_1_16GapTestPequalOne_8__setstate_cython__(CYTHON_UNUSED struct __pyx_obj_14slopescreening_9screening_12gap_test_p_1_GapTestPequalOne *__pyx_v_self, CYTHON_UNUSED PyObject *__pyx_v___pyx_state) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   PyObject *__pyx_t_1 = NULL;
@@ -3059,14 +3194,14 @@ static PyObject *__pyx_pf_3src_9screening_12gap_test_p_1_16GapTestPequalOne_8__s
   /* function exit code */
   __pyx_L1_error:;
   __Pyx_XDECREF(__pyx_t_1);
-  __Pyx_AddTraceback("src.screening.gap_test_p_1.GapTestPequalOne.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_AddTraceback("slopescreening.screening.gap_test_p_1.GapTestPequalOne.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __pyx_r = NULL;
   __Pyx_XGIVEREF(__pyx_r);
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":735
+/* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":734
  * ctypedef npy_cdouble     complex_t
  * 
  * cdef inline object PyArray_MultiIterNew1(a):             # <<<<<<<<<<<<<<
@@ -3083,7 +3218,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew1(PyObject *__
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("PyArray_MultiIterNew1", 0);
 
-  /* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":736
+  /* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":735
  * 
  * cdef inline object PyArray_MultiIterNew1(a):
  *     return PyArray_MultiIterNew(1, <void*>a)             # <<<<<<<<<<<<<<
@@ -3091,13 +3226,13 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew1(PyObject *__
  * cdef inline object PyArray_MultiIterNew2(a, b):
  */
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyArray_MultiIterNew(1, ((void *)__pyx_v_a)); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 736, __pyx_L1_error)
+  __pyx_t_1 = PyArray_MultiIterNew(1, ((void *)__pyx_v_a)); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 735, __pyx_L1_error)
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_r = __pyx_t_1;
   __pyx_t_1 = 0;
   goto __pyx_L0;
 
-  /* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":735
+  /* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":734
  * ctypedef npy_cdouble     complex_t
  * 
  * cdef inline object PyArray_MultiIterNew1(a):             # <<<<<<<<<<<<<<
@@ -3116,7 +3251,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew1(PyObject *__
   return __pyx_r;
 }
 
-/* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":738
+/* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":737
  *     return PyArray_MultiIterNew(1, <void*>a)
  * 
  * cdef inline object PyArray_MultiIterNew2(a, b):             # <<<<<<<<<<<<<<
@@ -3133,7 +3268,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew2(PyObject *__
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("PyArray_MultiIterNew2", 0);
 
-  /* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":739
+  /* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":738
  * 
  * cdef inline object PyArray_MultiIterNew2(a, b):
  *     return PyArray_MultiIterNew(2, <void*>a, <void*>b)             # <<<<<<<<<<<<<<
@@ -3141,13 +3276,13 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew2(PyObject *__
  * cdef inline object PyArray_MultiIterNew3(a, b, c):
  */
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyArray_MultiIterNew(2, ((void *)__pyx_v_a), ((void *)__pyx_v_b)); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 739, __pyx_L1_error)
+  __pyx_t_1 = PyArray_MultiIterNew(2, ((void *)__pyx_v_a), ((void *)__pyx_v_b)); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 738, __pyx_L1_error)
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_r = __pyx_t_1;
   __pyx_t_1 = 0;
   goto __pyx_L0;
 
-  /* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":738
+  /* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":737
  *     return PyArray_MultiIterNew(1, <void*>a)
  * 
  * cdef inline object PyArray_MultiIterNew2(a, b):             # <<<<<<<<<<<<<<
@@ -3166,7 +3301,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew2(PyObject *__
   return __pyx_r;
 }
 
-/* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":741
+/* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":740
  *     return PyArray_MultiIterNew(2, <void*>a, <void*>b)
  * 
  * cdef inline object PyArray_MultiIterNew3(a, b, c):             # <<<<<<<<<<<<<<
@@ -3183,7 +3318,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew3(PyObject *__
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("PyArray_MultiIterNew3", 0);
 
-  /* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":742
+  /* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":741
  * 
  * cdef inline object PyArray_MultiIterNew3(a, b, c):
  *     return PyArray_MultiIterNew(3, <void*>a, <void*>b, <void*> c)             # <<<<<<<<<<<<<<
@@ -3191,13 +3326,13 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew3(PyObject *__
  * cdef inline object PyArray_MultiIterNew4(a, b, c, d):
  */
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyArray_MultiIterNew(3, ((void *)__pyx_v_a), ((void *)__pyx_v_b), ((void *)__pyx_v_c)); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 742, __pyx_L1_error)
+  __pyx_t_1 = PyArray_MultiIterNew(3, ((void *)__pyx_v_a), ((void *)__pyx_v_b), ((void *)__pyx_v_c)); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 741, __pyx_L1_error)
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_r = __pyx_t_1;
   __pyx_t_1 = 0;
   goto __pyx_L0;
 
-  /* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":741
+  /* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":740
  *     return PyArray_MultiIterNew(2, <void*>a, <void*>b)
  * 
  * cdef inline object PyArray_MultiIterNew3(a, b, c):             # <<<<<<<<<<<<<<
@@ -3216,7 +3351,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew3(PyObject *__
   return __pyx_r;
 }
 
-/* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":744
+/* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":743
  *     return PyArray_MultiIterNew(3, <void*>a, <void*>b, <void*> c)
  * 
  * cdef inline object PyArray_MultiIterNew4(a, b, c, d):             # <<<<<<<<<<<<<<
@@ -3233,7 +3368,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew4(PyObject *__
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("PyArray_MultiIterNew4", 0);
 
-  /* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":745
+  /* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":744
  * 
  * cdef inline object PyArray_MultiIterNew4(a, b, c, d):
  *     return PyArray_MultiIterNew(4, <void*>a, <void*>b, <void*>c, <void*> d)             # <<<<<<<<<<<<<<
@@ -3241,13 +3376,13 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew4(PyObject *__
  * cdef inline object PyArray_MultiIterNew5(a, b, c, d, e):
  */
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyArray_MultiIterNew(4, ((void *)__pyx_v_a), ((void *)__pyx_v_b), ((void *)__pyx_v_c), ((void *)__pyx_v_d)); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 745, __pyx_L1_error)
+  __pyx_t_1 = PyArray_MultiIterNew(4, ((void *)__pyx_v_a), ((void *)__pyx_v_b), ((void *)__pyx_v_c), ((void *)__pyx_v_d)); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 744, __pyx_L1_error)
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_r = __pyx_t_1;
   __pyx_t_1 = 0;
   goto __pyx_L0;
 
-  /* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":744
+  /* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":743
  *     return PyArray_MultiIterNew(3, <void*>a, <void*>b, <void*> c)
  * 
  * cdef inline object PyArray_MultiIterNew4(a, b, c, d):             # <<<<<<<<<<<<<<
@@ -3266,7 +3401,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew4(PyObject *__
   return __pyx_r;
 }
 
-/* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":747
+/* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":746
  *     return PyArray_MultiIterNew(4, <void*>a, <void*>b, <void*>c, <void*> d)
  * 
  * cdef inline object PyArray_MultiIterNew5(a, b, c, d, e):             # <<<<<<<<<<<<<<
@@ -3283,7 +3418,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew5(PyObject *__
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("PyArray_MultiIterNew5", 0);
 
-  /* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":748
+  /* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":747
  * 
  * cdef inline object PyArray_MultiIterNew5(a, b, c, d, e):
  *     return PyArray_MultiIterNew(5, <void*>a, <void*>b, <void*>c, <void*> d, <void*> e)             # <<<<<<<<<<<<<<
@@ -3291,13 +3426,13 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew5(PyObject *__
  * cdef inline tuple PyDataType_SHAPE(dtype d):
  */
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyArray_MultiIterNew(5, ((void *)__pyx_v_a), ((void *)__pyx_v_b), ((void *)__pyx_v_c), ((void *)__pyx_v_d), ((void *)__pyx_v_e)); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 748, __pyx_L1_error)
+  __pyx_t_1 = PyArray_MultiIterNew(5, ((void *)__pyx_v_a), ((void *)__pyx_v_b), ((void *)__pyx_v_c), ((void *)__pyx_v_d), ((void *)__pyx_v_e)); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 747, __pyx_L1_error)
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_r = __pyx_t_1;
   __pyx_t_1 = 0;
   goto __pyx_L0;
 
-  /* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":747
+  /* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":746
  *     return PyArray_MultiIterNew(4, <void*>a, <void*>b, <void*>c, <void*> d)
  * 
  * cdef inline object PyArray_MultiIterNew5(a, b, c, d, e):             # <<<<<<<<<<<<<<
@@ -3316,7 +3451,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew5(PyObject *__
   return __pyx_r;
 }
 
-/* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":750
+/* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":749
  *     return PyArray_MultiIterNew(5, <void*>a, <void*>b, <void*>c, <void*> d, <void*> e)
  * 
  * cdef inline tuple PyDataType_SHAPE(dtype d):             # <<<<<<<<<<<<<<
@@ -3330,7 +3465,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyDataType_SHAPE(PyArray_Descr *__
   int __pyx_t_1;
   __Pyx_RefNannySetupContext("PyDataType_SHAPE", 0);
 
-  /* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":751
+  /* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":750
  * 
  * cdef inline tuple PyDataType_SHAPE(dtype d):
  *     if PyDataType_HASSUBARRAY(d):             # <<<<<<<<<<<<<<
@@ -3340,7 +3475,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyDataType_SHAPE(PyArray_Descr *__
   __pyx_t_1 = (PyDataType_HASSUBARRAY(__pyx_v_d) != 0);
   if (__pyx_t_1) {
 
-    /* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":752
+    /* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":751
  * cdef inline tuple PyDataType_SHAPE(dtype d):
  *     if PyDataType_HASSUBARRAY(d):
  *         return <tuple>d.subarray.shape             # <<<<<<<<<<<<<<
@@ -3352,7 +3487,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyDataType_SHAPE(PyArray_Descr *__
     __pyx_r = ((PyObject*)__pyx_v_d->subarray->shape);
     goto __pyx_L0;
 
-    /* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":751
+    /* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":750
  * 
  * cdef inline tuple PyDataType_SHAPE(dtype d):
  *     if PyDataType_HASSUBARRAY(d):             # <<<<<<<<<<<<<<
@@ -3361,7 +3496,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyDataType_SHAPE(PyArray_Descr *__
  */
   }
 
-  /* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":754
+  /* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":753
  *         return <tuple>d.subarray.shape
  *     else:
  *         return ()             # <<<<<<<<<<<<<<
@@ -3375,7 +3510,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyDataType_SHAPE(PyArray_Descr *__
     goto __pyx_L0;
   }
 
-  /* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":750
+  /* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":749
  *     return PyArray_MultiIterNew(5, <void*>a, <void*>b, <void*>c, <void*> d, <void*> e)
  * 
  * cdef inline tuple PyDataType_SHAPE(dtype d):             # <<<<<<<<<<<<<<
@@ -3390,7 +3525,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyDataType_SHAPE(PyArray_Descr *__
   return __pyx_r;
 }
 
-/* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":929
+/* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":928
  *     int _import_umath() except -1
  * 
  * cdef inline void set_array_base(ndarray arr, object base):             # <<<<<<<<<<<<<<
@@ -3402,7 +3537,7 @@ static CYTHON_INLINE void __pyx_f_5numpy_set_array_base(PyArrayObject *__pyx_v_a
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("set_array_base", 0);
 
-  /* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":930
+  /* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":929
  * 
  * cdef inline void set_array_base(ndarray arr, object base):
  *     Py_INCREF(base) # important to do this before stealing the reference below!             # <<<<<<<<<<<<<<
@@ -3411,7 +3546,7 @@ static CYTHON_INLINE void __pyx_f_5numpy_set_array_base(PyArrayObject *__pyx_v_a
  */
   Py_INCREF(__pyx_v_base);
 
-  /* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":931
+  /* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":930
  * cdef inline void set_array_base(ndarray arr, object base):
  *     Py_INCREF(base) # important to do this before stealing the reference below!
  *     PyArray_SetBaseObject(arr, base)             # <<<<<<<<<<<<<<
@@ -3420,7 +3555,7 @@ static CYTHON_INLINE void __pyx_f_5numpy_set_array_base(PyArrayObject *__pyx_v_a
  */
   (void)(PyArray_SetBaseObject(__pyx_v_arr, __pyx_v_base));
 
-  /* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":929
+  /* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":928
  *     int _import_umath() except -1
  * 
  * cdef inline void set_array_base(ndarray arr, object base):             # <<<<<<<<<<<<<<
@@ -3432,7 +3567,7 @@ static CYTHON_INLINE void __pyx_f_5numpy_set_array_base(PyArrayObject *__pyx_v_a
   __Pyx_RefNannyFinishContext();
 }
 
-/* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":933
+/* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":932
  *     PyArray_SetBaseObject(arr, base)
  * 
  * cdef inline object get_array_base(ndarray arr):             # <<<<<<<<<<<<<<
@@ -3447,7 +3582,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_get_array_base(PyArrayObject *__py
   int __pyx_t_1;
   __Pyx_RefNannySetupContext("get_array_base", 0);
 
-  /* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":934
+  /* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":933
  * 
  * cdef inline object get_array_base(ndarray arr):
  *     base = PyArray_BASE(arr)             # <<<<<<<<<<<<<<
@@ -3456,7 +3591,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_get_array_base(PyArrayObject *__py
  */
   __pyx_v_base = PyArray_BASE(__pyx_v_arr);
 
-  /* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":935
+  /* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":934
  * cdef inline object get_array_base(ndarray arr):
  *     base = PyArray_BASE(arr)
  *     if base is NULL:             # <<<<<<<<<<<<<<
@@ -3466,7 +3601,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_get_array_base(PyArrayObject *__py
   __pyx_t_1 = ((__pyx_v_base == NULL) != 0);
   if (__pyx_t_1) {
 
-    /* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":936
+    /* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":935
  *     base = PyArray_BASE(arr)
  *     if base is NULL:
  *         return None             # <<<<<<<<<<<<<<
@@ -3477,7 +3612,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_get_array_base(PyArrayObject *__py
     __pyx_r = Py_None; __Pyx_INCREF(Py_None);
     goto __pyx_L0;
 
-    /* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":935
+    /* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":934
  * cdef inline object get_array_base(ndarray arr):
  *     base = PyArray_BASE(arr)
  *     if base is NULL:             # <<<<<<<<<<<<<<
@@ -3486,7 +3621,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_get_array_base(PyArrayObject *__py
  */
   }
 
-  /* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":937
+  /* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":936
  *     if base is NULL:
  *         return None
  *     return <object>base             # <<<<<<<<<<<<<<
@@ -3498,7 +3633,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_get_array_base(PyArrayObject *__py
   __pyx_r = ((PyObject *)__pyx_v_base);
   goto __pyx_L0;
 
-  /* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":933
+  /* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":932
  *     PyArray_SetBaseObject(arr, base)
  * 
  * cdef inline object get_array_base(ndarray arr):             # <<<<<<<<<<<<<<
@@ -3513,7 +3648,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_get_array_base(PyArrayObject *__py
   return __pyx_r;
 }
 
-/* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":941
+/* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":940
  * # Versions of the import_* functions which are more suitable for
  * # Cython code.
  * cdef inline int import_array() except -1:             # <<<<<<<<<<<<<<
@@ -3537,7 +3672,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_array(void) {
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("import_array", 0);
 
-  /* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":942
+  /* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":941
  * # Cython code.
  * cdef inline int import_array() except -1:
  *     try:             # <<<<<<<<<<<<<<
@@ -3553,16 +3688,16 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_array(void) {
     __Pyx_XGOTREF(__pyx_t_3);
     /*try:*/ {
 
-      /* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":943
+      /* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":942
  * cdef inline int import_array() except -1:
  *     try:
  *         __pyx_import_array()             # <<<<<<<<<<<<<<
  *     except Exception:
  *         raise ImportError("numpy.core.multiarray failed to import")
  */
-      __pyx_t_4 = _import_array(); if (unlikely(__pyx_t_4 == ((int)-1))) __PYX_ERR(2, 943, __pyx_L3_error)
+      __pyx_t_4 = _import_array(); if (unlikely(__pyx_t_4 == ((int)-1))) __PYX_ERR(2, 942, __pyx_L3_error)
 
-      /* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":942
+      /* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":941
  * # Cython code.
  * cdef inline int import_array() except -1:
  *     try:             # <<<<<<<<<<<<<<
@@ -3576,7 +3711,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_array(void) {
     goto __pyx_L8_try_end;
     __pyx_L3_error:;
 
-    /* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":944
+    /* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":943
  *     try:
  *         __pyx_import_array()
  *     except Exception:             # <<<<<<<<<<<<<<
@@ -3586,28 +3721,28 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_array(void) {
     __pyx_t_4 = __Pyx_PyErr_ExceptionMatches(((PyObject *)(&((PyTypeObject*)PyExc_Exception)[0])));
     if (__pyx_t_4) {
       __Pyx_AddTraceback("numpy.import_array", __pyx_clineno, __pyx_lineno, __pyx_filename);
-      if (__Pyx_GetException(&__pyx_t_5, &__pyx_t_6, &__pyx_t_7) < 0) __PYX_ERR(2, 944, __pyx_L5_except_error)
+      if (__Pyx_GetException(&__pyx_t_5, &__pyx_t_6, &__pyx_t_7) < 0) __PYX_ERR(2, 943, __pyx_L5_except_error)
       __Pyx_GOTREF(__pyx_t_5);
       __Pyx_GOTREF(__pyx_t_6);
       __Pyx_GOTREF(__pyx_t_7);
 
-      /* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":945
+      /* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":944
  *         __pyx_import_array()
  *     except Exception:
  *         raise ImportError("numpy.core.multiarray failed to import")             # <<<<<<<<<<<<<<
  * 
  * cdef inline int import_umath() except -1:
  */
-      __pyx_t_8 = __Pyx_PyObject_Call(__pyx_builtin_ImportError, __pyx_tuple__5, NULL); if (unlikely(!__pyx_t_8)) __PYX_ERR(2, 945, __pyx_L5_except_error)
+      __pyx_t_8 = __Pyx_PyObject_Call(__pyx_builtin_ImportError, __pyx_tuple__5, NULL); if (unlikely(!__pyx_t_8)) __PYX_ERR(2, 944, __pyx_L5_except_error)
       __Pyx_GOTREF(__pyx_t_8);
       __Pyx_Raise(__pyx_t_8, 0, 0, 0);
       __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
-      __PYX_ERR(2, 945, __pyx_L5_except_error)
+      __PYX_ERR(2, 944, __pyx_L5_except_error)
     }
     goto __pyx_L5_except_error;
     __pyx_L5_except_error:;
 
-    /* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":942
+    /* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":941
  * # Cython code.
  * cdef inline int import_array() except -1:
  *     try:             # <<<<<<<<<<<<<<
@@ -3622,7 +3757,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_array(void) {
     __pyx_L8_try_end:;
   }
 
-  /* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":941
+  /* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":940
  * # Versions of the import_* functions which are more suitable for
  * # Cython code.
  * cdef inline int import_array() except -1:             # <<<<<<<<<<<<<<
@@ -3645,7 +3780,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_array(void) {
   return __pyx_r;
 }
 
-/* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":947
+/* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":946
  *         raise ImportError("numpy.core.multiarray failed to import")
  * 
  * cdef inline int import_umath() except -1:             # <<<<<<<<<<<<<<
@@ -3669,7 +3804,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_umath(void) {
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("import_umath", 0);
 
-  /* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":948
+  /* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":947
  * 
  * cdef inline int import_umath() except -1:
  *     try:             # <<<<<<<<<<<<<<
@@ -3685,16 +3820,16 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_umath(void) {
     __Pyx_XGOTREF(__pyx_t_3);
     /*try:*/ {
 
-      /* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":949
+      /* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":948
  * cdef inline int import_umath() except -1:
  *     try:
  *         _import_umath()             # <<<<<<<<<<<<<<
  *     except Exception:
  *         raise ImportError("numpy.core.umath failed to import")
  */
-      __pyx_t_4 = _import_umath(); if (unlikely(__pyx_t_4 == ((int)-1))) __PYX_ERR(2, 949, __pyx_L3_error)
+      __pyx_t_4 = _import_umath(); if (unlikely(__pyx_t_4 == ((int)-1))) __PYX_ERR(2, 948, __pyx_L3_error)
 
-      /* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":948
+      /* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":947
  * 
  * cdef inline int import_umath() except -1:
  *     try:             # <<<<<<<<<<<<<<
@@ -3708,7 +3843,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_umath(void) {
     goto __pyx_L8_try_end;
     __pyx_L3_error:;
 
-    /* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":950
+    /* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":949
  *     try:
  *         _import_umath()
  *     except Exception:             # <<<<<<<<<<<<<<
@@ -3718,28 +3853,28 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_umath(void) {
     __pyx_t_4 = __Pyx_PyErr_ExceptionMatches(((PyObject *)(&((PyTypeObject*)PyExc_Exception)[0])));
     if (__pyx_t_4) {
       __Pyx_AddTraceback("numpy.import_umath", __pyx_clineno, __pyx_lineno, __pyx_filename);
-      if (__Pyx_GetException(&__pyx_t_5, &__pyx_t_6, &__pyx_t_7) < 0) __PYX_ERR(2, 950, __pyx_L5_except_error)
+      if (__Pyx_GetException(&__pyx_t_5, &__pyx_t_6, &__pyx_t_7) < 0) __PYX_ERR(2, 949, __pyx_L5_except_error)
       __Pyx_GOTREF(__pyx_t_5);
       __Pyx_GOTREF(__pyx_t_6);
       __Pyx_GOTREF(__pyx_t_7);
 
-      /* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":951
+      /* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":950
  *         _import_umath()
  *     except Exception:
  *         raise ImportError("numpy.core.umath failed to import")             # <<<<<<<<<<<<<<
  * 
  * cdef inline int import_ufunc() except -1:
  */
-      __pyx_t_8 = __Pyx_PyObject_Call(__pyx_builtin_ImportError, __pyx_tuple__6, NULL); if (unlikely(!__pyx_t_8)) __PYX_ERR(2, 951, __pyx_L5_except_error)
+      __pyx_t_8 = __Pyx_PyObject_Call(__pyx_builtin_ImportError, __pyx_tuple__6, NULL); if (unlikely(!__pyx_t_8)) __PYX_ERR(2, 950, __pyx_L5_except_error)
       __Pyx_GOTREF(__pyx_t_8);
       __Pyx_Raise(__pyx_t_8, 0, 0, 0);
       __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
-      __PYX_ERR(2, 951, __pyx_L5_except_error)
+      __PYX_ERR(2, 950, __pyx_L5_except_error)
     }
     goto __pyx_L5_except_error;
     __pyx_L5_except_error:;
 
-    /* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":948
+    /* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":947
  * 
  * cdef inline int import_umath() except -1:
  *     try:             # <<<<<<<<<<<<<<
@@ -3754,7 +3889,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_umath(void) {
     __pyx_L8_try_end:;
   }
 
-  /* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":947
+  /* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":946
  *         raise ImportError("numpy.core.multiarray failed to import")
  * 
  * cdef inline int import_umath() except -1:             # <<<<<<<<<<<<<<
@@ -3777,7 +3912,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_umath(void) {
   return __pyx_r;
 }
 
-/* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":953
+/* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":952
  *         raise ImportError("numpy.core.umath failed to import")
  * 
  * cdef inline int import_ufunc() except -1:             # <<<<<<<<<<<<<<
@@ -3801,7 +3936,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_ufunc(void) {
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("import_ufunc", 0);
 
-  /* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":954
+  /* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":953
  * 
  * cdef inline int import_ufunc() except -1:
  *     try:             # <<<<<<<<<<<<<<
@@ -3817,16 +3952,16 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_ufunc(void) {
     __Pyx_XGOTREF(__pyx_t_3);
     /*try:*/ {
 
-      /* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":955
+      /* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":954
  * cdef inline int import_ufunc() except -1:
  *     try:
  *         _import_umath()             # <<<<<<<<<<<<<<
  *     except Exception:
  *         raise ImportError("numpy.core.umath failed to import")
  */
-      __pyx_t_4 = _import_umath(); if (unlikely(__pyx_t_4 == ((int)-1))) __PYX_ERR(2, 955, __pyx_L3_error)
+      __pyx_t_4 = _import_umath(); if (unlikely(__pyx_t_4 == ((int)-1))) __PYX_ERR(2, 954, __pyx_L3_error)
 
-      /* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":954
+      /* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":953
  * 
  * cdef inline int import_ufunc() except -1:
  *     try:             # <<<<<<<<<<<<<<
@@ -3840,7 +3975,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_ufunc(void) {
     goto __pyx_L8_try_end;
     __pyx_L3_error:;
 
-    /* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":956
+    /* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":955
  *     try:
  *         _import_umath()
  *     except Exception:             # <<<<<<<<<<<<<<
@@ -3850,28 +3985,28 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_ufunc(void) {
     __pyx_t_4 = __Pyx_PyErr_ExceptionMatches(((PyObject *)(&((PyTypeObject*)PyExc_Exception)[0])));
     if (__pyx_t_4) {
       __Pyx_AddTraceback("numpy.import_ufunc", __pyx_clineno, __pyx_lineno, __pyx_filename);
-      if (__Pyx_GetException(&__pyx_t_5, &__pyx_t_6, &__pyx_t_7) < 0) __PYX_ERR(2, 956, __pyx_L5_except_error)
+      if (__Pyx_GetException(&__pyx_t_5, &__pyx_t_6, &__pyx_t_7) < 0) __PYX_ERR(2, 955, __pyx_L5_except_error)
       __Pyx_GOTREF(__pyx_t_5);
       __Pyx_GOTREF(__pyx_t_6);
       __Pyx_GOTREF(__pyx_t_7);
 
-      /* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":957
+      /* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":956
  *         _import_umath()
  *     except Exception:
  *         raise ImportError("numpy.core.umath failed to import")             # <<<<<<<<<<<<<<
  * 
  * cdef extern from *:
  */
-      __pyx_t_8 = __Pyx_PyObject_Call(__pyx_builtin_ImportError, __pyx_tuple__6, NULL); if (unlikely(!__pyx_t_8)) __PYX_ERR(2, 957, __pyx_L5_except_error)
+      __pyx_t_8 = __Pyx_PyObject_Call(__pyx_builtin_ImportError, __pyx_tuple__6, NULL); if (unlikely(!__pyx_t_8)) __PYX_ERR(2, 956, __pyx_L5_except_error)
       __Pyx_GOTREF(__pyx_t_8);
       __Pyx_Raise(__pyx_t_8, 0, 0, 0);
       __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
-      __PYX_ERR(2, 957, __pyx_L5_except_error)
+      __PYX_ERR(2, 956, __pyx_L5_except_error)
     }
     goto __pyx_L5_except_error;
     __pyx_L5_except_error:;
 
-    /* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":954
+    /* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":953
  * 
  * cdef inline int import_ufunc() except -1:
  *     try:             # <<<<<<<<<<<<<<
@@ -3886,7 +4021,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_ufunc(void) {
     __pyx_L8_try_end:;
   }
 
-  /* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":953
+  /* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":952
  *         raise ImportError("numpy.core.umath failed to import")
  * 
  * cdef inline int import_ufunc() except -1:             # <<<<<<<<<<<<<<
@@ -3909,7 +4044,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_ufunc(void) {
   return __pyx_r;
 }
 
-/* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":967
+/* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":966
  * 
  * 
  * cdef inline bint is_timedelta64_object(object obj):             # <<<<<<<<<<<<<<
@@ -3922,7 +4057,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_is_timedelta64_object(PyObject *__pyx_v_
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("is_timedelta64_object", 0);
 
-  /* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":979
+  /* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":978
  *     bool
  *     """
  *     return PyObject_TypeCheck(obj, &PyTimedeltaArrType_Type)             # <<<<<<<<<<<<<<
@@ -3932,7 +4067,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_is_timedelta64_object(PyObject *__pyx_v_
   __pyx_r = PyObject_TypeCheck(__pyx_v_obj, (&PyTimedeltaArrType_Type));
   goto __pyx_L0;
 
-  /* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":967
+  /* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":966
  * 
  * 
  * cdef inline bint is_timedelta64_object(object obj):             # <<<<<<<<<<<<<<
@@ -3946,7 +4081,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_is_timedelta64_object(PyObject *__pyx_v_
   return __pyx_r;
 }
 
-/* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":982
+/* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":981
  * 
  * 
  * cdef inline bint is_datetime64_object(object obj):             # <<<<<<<<<<<<<<
@@ -3959,7 +4094,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_is_datetime64_object(PyObject *__pyx_v_o
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("is_datetime64_object", 0);
 
-  /* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":994
+  /* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":993
  *     bool
  *     """
  *     return PyObject_TypeCheck(obj, &PyDatetimeArrType_Type)             # <<<<<<<<<<<<<<
@@ -3969,7 +4104,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_is_datetime64_object(PyObject *__pyx_v_o
   __pyx_r = PyObject_TypeCheck(__pyx_v_obj, (&PyDatetimeArrType_Type));
   goto __pyx_L0;
 
-  /* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":982
+  /* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":981
  * 
  * 
  * cdef inline bint is_datetime64_object(object obj):             # <<<<<<<<<<<<<<
@@ -3983,7 +4118,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_is_datetime64_object(PyObject *__pyx_v_o
   return __pyx_r;
 }
 
-/* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":997
+/* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":996
  * 
  * 
  * cdef inline npy_datetime get_datetime64_value(object obj) nogil:             # <<<<<<<<<<<<<<
@@ -3994,7 +4129,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_is_datetime64_object(PyObject *__pyx_v_o
 static CYTHON_INLINE npy_datetime __pyx_f_5numpy_get_datetime64_value(PyObject *__pyx_v_obj) {
   npy_datetime __pyx_r;
 
-  /* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":1004
+  /* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":1003
  *     also needed.  That can be found using `get_datetime64_unit`.
  *     """
  *     return (<PyDatetimeScalarObject*>obj).obval             # <<<<<<<<<<<<<<
@@ -4004,7 +4139,7 @@ static CYTHON_INLINE npy_datetime __pyx_f_5numpy_get_datetime64_value(PyObject *
   __pyx_r = ((PyDatetimeScalarObject *)__pyx_v_obj)->obval;
   goto __pyx_L0;
 
-  /* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":997
+  /* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":996
  * 
  * 
  * cdef inline npy_datetime get_datetime64_value(object obj) nogil:             # <<<<<<<<<<<<<<
@@ -4017,7 +4152,7 @@ static CYTHON_INLINE npy_datetime __pyx_f_5numpy_get_datetime64_value(PyObject *
   return __pyx_r;
 }
 
-/* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":1007
+/* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":1006
  * 
  * 
  * cdef inline npy_timedelta get_timedelta64_value(object obj) nogil:             # <<<<<<<<<<<<<<
@@ -4028,7 +4163,7 @@ static CYTHON_INLINE npy_datetime __pyx_f_5numpy_get_datetime64_value(PyObject *
 static CYTHON_INLINE npy_timedelta __pyx_f_5numpy_get_timedelta64_value(PyObject *__pyx_v_obj) {
   npy_timedelta __pyx_r;
 
-  /* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":1011
+  /* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":1010
  *     returns the int64 value underlying scalar numpy timedelta64 object
  *     """
  *     return (<PyTimedeltaScalarObject*>obj).obval             # <<<<<<<<<<<<<<
@@ -4038,7 +4173,7 @@ static CYTHON_INLINE npy_timedelta __pyx_f_5numpy_get_timedelta64_value(PyObject
   __pyx_r = ((PyTimedeltaScalarObject *)__pyx_v_obj)->obval;
   goto __pyx_L0;
 
-  /* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":1007
+  /* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":1006
  * 
  * 
  * cdef inline npy_timedelta get_timedelta64_value(object obj) nogil:             # <<<<<<<<<<<<<<
@@ -4051,7 +4186,7 @@ static CYTHON_INLINE npy_timedelta __pyx_f_5numpy_get_timedelta64_value(PyObject
   return __pyx_r;
 }
 
-/* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":1014
+/* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":1013
  * 
  * 
  * cdef inline NPY_DATETIMEUNIT get_datetime64_unit(object obj) nogil:             # <<<<<<<<<<<<<<
@@ -4062,7 +4197,7 @@ static CYTHON_INLINE npy_timedelta __pyx_f_5numpy_get_timedelta64_value(PyObject
 static CYTHON_INLINE NPY_DATETIMEUNIT __pyx_f_5numpy_get_datetime64_unit(PyObject *__pyx_v_obj) {
   NPY_DATETIMEUNIT __pyx_r;
 
-  /* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":1018
+  /* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":1017
  *     returns the unit part of the dtype for a numpy datetime64 object.
  *     """
  *     return <NPY_DATETIMEUNIT>(<PyDatetimeScalarObject*>obj).obmeta.base             # <<<<<<<<<<<<<<
@@ -4070,7 +4205,7 @@ static CYTHON_INLINE NPY_DATETIMEUNIT __pyx_f_5numpy_get_datetime64_unit(PyObjec
   __pyx_r = ((NPY_DATETIMEUNIT)((PyDatetimeScalarObject *)__pyx_v_obj)->obmeta.base);
   goto __pyx_L0;
 
-  /* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":1014
+  /* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":1013
  * 
  * 
  * cdef inline NPY_DATETIMEUNIT get_datetime64_unit(object obj) nogil:             # <<<<<<<<<<<<<<
@@ -4083,7 +4218,7 @@ static CYTHON_INLINE NPY_DATETIMEUNIT __pyx_f_5numpy_get_datetime64_unit(PyObjec
   return __pyx_r;
 }
 
-static PyObject *__pyx_tp_new_3src_9screening_12gap_test_p_1_GapTestPequalOne(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
+static PyObject *__pyx_tp_new_14slopescreening_9screening_12gap_test_p_1_GapTestPequalOne(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
   PyObject *o;
   if (likely((t->tp_flags & Py_TPFLAGS_IS_ABSTRACT) == 0)) {
     o = (*t->tp_alloc)(t, 0);
@@ -4094,7 +4229,7 @@ static PyObject *__pyx_tp_new_3src_9screening_12gap_test_p_1_GapTestPequalOne(Py
   return o;
 }
 
-static void __pyx_tp_dealloc_3src_9screening_12gap_test_p_1_GapTestPequalOne(PyObject *o) {
+static void __pyx_tp_dealloc_14slopescreening_9screening_12gap_test_p_1_GapTestPequalOne(PyObject *o) {
   #if CYTHON_USE_TP_FINALIZE
   if (unlikely(PyType_HasFeature(Py_TYPE(o), Py_TPFLAGS_HAVE_FINALIZE) && Py_TYPE(o)->tp_finalize) && (!PyType_IS_GC(Py_TYPE(o)) || !_PyGC_FINALIZED(o))) {
     if (PyObject_CallFinalizerFromDealloc(o)) return;
@@ -4104,26 +4239,26 @@ static void __pyx_tp_dealloc_3src_9screening_12gap_test_p_1_GapTestPequalOne(PyO
     PyObject *etype, *eval, *etb;
     PyErr_Fetch(&etype, &eval, &etb);
     __Pyx_SET_REFCNT(o, Py_REFCNT(o) + 1);
-    __pyx_pw_3src_9screening_12gap_test_p_1_16GapTestPequalOne_3__dealloc__(o);
+    __pyx_pw_14slopescreening_9screening_12gap_test_p_1_16GapTestPequalOne_3__dealloc__(o);
     __Pyx_SET_REFCNT(o, Py_REFCNT(o) - 1);
     PyErr_Restore(etype, eval, etb);
   }
   (*Py_TYPE(o)->tp_free)(o);
 }
 
-static PyMethodDef __pyx_methods_3src_9screening_12gap_test_p_1_GapTestPequalOne[] = {
-  {"apply_test", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_pw_3src_9screening_12gap_test_p_1_16GapTestPequalOne_5apply_test, METH_VARARGS|METH_KEYWORDS, __pyx_doc_3src_9screening_12gap_test_p_1_16GapTestPequalOne_4apply_test},
-  {"__reduce_cython__", (PyCFunction)__pyx_pw_3src_9screening_12gap_test_p_1_16GapTestPequalOne_7__reduce_cython__, METH_NOARGS, 0},
-  {"__setstate_cython__", (PyCFunction)__pyx_pw_3src_9screening_12gap_test_p_1_16GapTestPequalOne_9__setstate_cython__, METH_O, 0},
+static PyMethodDef __pyx_methods_14slopescreening_9screening_12gap_test_p_1_GapTestPequalOne[] = {
+  {"apply_test", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_pw_14slopescreening_9screening_12gap_test_p_1_16GapTestPequalOne_5apply_test, METH_VARARGS|METH_KEYWORDS, __pyx_doc_14slopescreening_9screening_12gap_test_p_1_16GapTestPequalOne_4apply_test},
+  {"__reduce_cython__", (PyCFunction)__pyx_pw_14slopescreening_9screening_12gap_test_p_1_16GapTestPequalOne_7__reduce_cython__, METH_NOARGS, 0},
+  {"__setstate_cython__", (PyCFunction)__pyx_pw_14slopescreening_9screening_12gap_test_p_1_16GapTestPequalOne_9__setstate_cython__, METH_O, 0},
   {0, 0, 0, 0}
 };
 
-static PyTypeObject __pyx_type_3src_9screening_12gap_test_p_1_GapTestPequalOne = {
+static PyTypeObject __pyx_type_14slopescreening_9screening_12gap_test_p_1_GapTestPequalOne = {
   PyVarObject_HEAD_INIT(0, 0)
-  "src.screening.gap_test_p_1.GapTestPequalOne", /*tp_name*/
-  sizeof(struct __pyx_obj_3src_9screening_12gap_test_p_1_GapTestPequalOne), /*tp_basicsize*/
+  "slopescreening.screening.gap_test_p_1.GapTestPequalOne", /*tp_name*/
+  sizeof(struct __pyx_obj_14slopescreening_9screening_12gap_test_p_1_GapTestPequalOne), /*tp_basicsize*/
   0, /*tp_itemsize*/
-  __pyx_tp_dealloc_3src_9screening_12gap_test_p_1_GapTestPequalOne, /*tp_dealloc*/
+  __pyx_tp_dealloc_14slopescreening_9screening_12gap_test_p_1_GapTestPequalOne, /*tp_dealloc*/
   #if PY_VERSION_HEX < 0x030800b4
   0, /*tp_print*/
   #endif
@@ -4156,7 +4291,7 @@ static PyTypeObject __pyx_type_3src_9screening_12gap_test_p_1_GapTestPequalOne =
   0, /*tp_weaklistoffset*/
   0, /*tp_iter*/
   0, /*tp_iternext*/
-  __pyx_methods_3src_9screening_12gap_test_p_1_GapTestPequalOne, /*tp_methods*/
+  __pyx_methods_14slopescreening_9screening_12gap_test_p_1_GapTestPequalOne, /*tp_methods*/
   0, /*tp_members*/
   0, /*tp_getset*/
   0, /*tp_base*/
@@ -4164,9 +4299,9 @@ static PyTypeObject __pyx_type_3src_9screening_12gap_test_p_1_GapTestPequalOne =
   0, /*tp_descr_get*/
   0, /*tp_descr_set*/
   0, /*tp_dictoffset*/
-  __pyx_pw_3src_9screening_12gap_test_p_1_16GapTestPequalOne_1__init__, /*tp_init*/
+  __pyx_pw_14slopescreening_9screening_12gap_test_p_1_16GapTestPequalOne_1__init__, /*tp_init*/
   0, /*tp_alloc*/
-  __pyx_tp_new_3src_9screening_12gap_test_p_1_GapTestPequalOne, /*tp_new*/
+  __pyx_tp_new_14slopescreening_9screening_12gap_test_p_1_GapTestPequalOne, /*tp_new*/
   0, /*tp_free*/
   0, /*tp_is_gc*/
   0, /*tp_bases*/
@@ -4179,12 +4314,15 @@ static PyTypeObject __pyx_type_3src_9screening_12gap_test_p_1_GapTestPequalOne =
   #if PY_VERSION_HEX >= 0x030400a1
   0, /*tp_finalize*/
   #endif
-  #if PY_VERSION_HEX >= 0x030800b1
+  #if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800)
   0, /*tp_vectorcall*/
   #endif
   #if PY_VERSION_HEX >= 0x030800b4 && PY_VERSION_HEX < 0x03090000
   0, /*tp_print*/
   #endif
+  #if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000
+  0, /*tp_pypy_flags*/
+  #endif
 };
 
 static PyMethodDef __pyx_methods[] = {
@@ -4263,8 +4401,8 @@ static __Pyx_StringTabEntry __pyx_string_tab[] = {
   {&__pyx_kp_s_self_vec_cumsum_gammas_self_vec, __pyx_k_self_vec_cumsum_gammas_self_vec, sizeof(__pyx_k_self_vec_cumsum_gammas_self_vec), 0, 0, 1, 0},
   {&__pyx_n_s_setstate, __pyx_k_setstate, sizeof(__pyx_k_setstate), 0, 0, 1, 1},
   {&__pyx_n_s_setstate_cython, __pyx_k_setstate_cython, sizeof(__pyx_k_setstate_cython), 0, 0, 1, 1},
+  {&__pyx_n_s_slopescreening_screening_ascreen, __pyx_k_slopescreening_screening_ascreen, sizeof(__pyx_k_slopescreening_screening_ascreen), 0, 0, 1, 1},
   {&__pyx_n_s_sqrt, __pyx_k_sqrt, sizeof(__pyx_k_sqrt), 0, 0, 1, 1},
-  {&__pyx_n_s_src_screening_ascreening, __pyx_k_src_screening_ascreening, sizeof(__pyx_k_src_screening_ascreening), 0, 0, 1, 1},
   {&__pyx_n_s_test, __pyx_k_test, sizeof(__pyx_k_test), 0, 0, 1, 1},
   {&__pyx_n_s_vec_coherence_function, __pyx_k_vec_coherence_function, sizeof(__pyx_k_vec_coherence_function), 0, 0, 1, 1},
   {&__pyx_n_s_vec_gammas, __pyx_k_vec_gammas, sizeof(__pyx_k_vec_gammas), 0, 0, 1, 1},
@@ -4274,7 +4412,7 @@ static __Pyx_StringTabEntry __pyx_string_tab[] = {
 static CYTHON_SMALL_CODE int __Pyx_InitCachedBuiltins(void) {
   __pyx_builtin_range = __Pyx_GetBuiltinName(__pyx_n_s_range); if (!__pyx_builtin_range) __PYX_ERR(0, 63, __pyx_L1_error)
   __pyx_builtin_TypeError = __Pyx_GetBuiltinName(__pyx_n_s_TypeError); if (!__pyx_builtin_TypeError) __PYX_ERR(1, 2, __pyx_L1_error)
-  __pyx_builtin_ImportError = __Pyx_GetBuiltinName(__pyx_n_s_ImportError); if (!__pyx_builtin_ImportError) __PYX_ERR(2, 945, __pyx_L1_error)
+  __pyx_builtin_ImportError = __Pyx_GetBuiltinName(__pyx_n_s_ImportError); if (!__pyx_builtin_ImportError) __PYX_ERR(2, 944, __pyx_L1_error)
   return 0;
   __pyx_L1_error:;
   return -1;
@@ -4284,7 +4422,7 @@ static CYTHON_SMALL_CODE int __Pyx_InitCachedConstants(void) {
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("__Pyx_InitCachedConstants", 0);
 
-  /* "src/screening/gap_test_p_1.pyx":149
+  /* "slopescreening/screening/gap_test_p_1.pyx":149
  *       # 1. Sort in descending order
  *       if index is None:
  *          index = np.argsort(Atcabs)[::-1]             # <<<<<<<<<<<<<<
@@ -4295,7 +4433,7 @@ static CYTHON_SMALL_CODE int __Pyx_InitCachedConstants(void) {
   __Pyx_GOTREF(__pyx_slice_);
   __Pyx_GIVEREF(__pyx_slice_);
 
-  /* "src/screening/gap_test_p_1.pyx":152
+  /* "slopescreening/screening/gap_test_p_1.pyx":152
  * 
  *          # Cdric' notations compliant
  *       sigmas[1:] = np.cumsum(Atcabs[index])             # <<<<<<<<<<<<<<
@@ -4325,25 +4463,25 @@ static CYTHON_SMALL_CODE int __Pyx_InitCachedConstants(void) {
   __Pyx_GOTREF(__pyx_tuple__4);
   __Pyx_GIVEREF(__pyx_tuple__4);
 
-  /* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":945
+  /* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":944
  *         __pyx_import_array()
  *     except Exception:
  *         raise ImportError("numpy.core.multiarray failed to import")             # <<<<<<<<<<<<<<
  * 
  * cdef inline int import_umath() except -1:
  */
-  __pyx_tuple__5 = PyTuple_Pack(1, __pyx_kp_s_numpy_core_multiarray_failed_to); if (unlikely(!__pyx_tuple__5)) __PYX_ERR(2, 945, __pyx_L1_error)
+  __pyx_tuple__5 = PyTuple_Pack(1, __pyx_kp_s_numpy_core_multiarray_failed_to); if (unlikely(!__pyx_tuple__5)) __PYX_ERR(2, 944, __pyx_L1_error)
   __Pyx_GOTREF(__pyx_tuple__5);
   __Pyx_GIVEREF(__pyx_tuple__5);
 
-  /* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":951
+  /* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":950
  *         _import_umath()
  *     except Exception:
  *         raise ImportError("numpy.core.umath failed to import")             # <<<<<<<<<<<<<<
  * 
  * cdef inline int import_ufunc() except -1:
  */
-  __pyx_tuple__6 = PyTuple_Pack(1, __pyx_kp_s_numpy_core_umath_failed_to_impor); if (unlikely(!__pyx_tuple__6)) __PYX_ERR(2, 951, __pyx_L1_error)
+  __pyx_tuple__6 = PyTuple_Pack(1, __pyx_kp_s_numpy_core_umath_failed_to_impor); if (unlikely(!__pyx_tuple__6)) __PYX_ERR(2, 950, __pyx_L1_error)
   __Pyx_GOTREF(__pyx_tuple__6);
   __Pyx_GIVEREF(__pyx_tuple__6);
   __Pyx_RefNannyFinishContext();
@@ -4401,16 +4539,16 @@ static int __Pyx_modinit_type_init_code(void) {
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("__Pyx_modinit_type_init_code", 0);
   /*--- Type init code ---*/
-  if (PyType_Ready(&__pyx_type_3src_9screening_12gap_test_p_1_GapTestPequalOne) < 0) __PYX_ERR(0, 23, __pyx_L1_error)
+  if (PyType_Ready(&__pyx_type_14slopescreening_9screening_12gap_test_p_1_GapTestPequalOne) < 0) __PYX_ERR(0, 23, __pyx_L1_error)
   #if PY_VERSION_HEX < 0x030800B1
-  __pyx_type_3src_9screening_12gap_test_p_1_GapTestPequalOne.tp_print = 0;
+  __pyx_type_14slopescreening_9screening_12gap_test_p_1_GapTestPequalOne.tp_print = 0;
   #endif
-  if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_type_3src_9screening_12gap_test_p_1_GapTestPequalOne.tp_dictoffset && __pyx_type_3src_9screening_12gap_test_p_1_GapTestPequalOne.tp_getattro == PyObject_GenericGetAttr)) {
-    __pyx_type_3src_9screening_12gap_test_p_1_GapTestPequalOne.tp_getattro = __Pyx_PyObject_GenericGetAttr;
+  if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_type_14slopescreening_9screening_12gap_test_p_1_GapTestPequalOne.tp_dictoffset && __pyx_type_14slopescreening_9screening_12gap_test_p_1_GapTestPequalOne.tp_getattro == PyObject_GenericGetAttr)) {
+    __pyx_type_14slopescreening_9screening_12gap_test_p_1_GapTestPequalOne.tp_getattro = __Pyx_PyObject_GenericGetAttr;
   }
-  if (PyObject_SetAttr(__pyx_m, __pyx_n_s_GapTestPequalOne, (PyObject *)&__pyx_type_3src_9screening_12gap_test_p_1_GapTestPequalOne) < 0) __PYX_ERR(0, 23, __pyx_L1_error)
-  if (__Pyx_setup_reduce((PyObject*)&__pyx_type_3src_9screening_12gap_test_p_1_GapTestPequalOne) < 0) __PYX_ERR(0, 23, __pyx_L1_error)
-  __pyx_ptype_3src_9screening_12gap_test_p_1_GapTestPequalOne = &__pyx_type_3src_9screening_12gap_test_p_1_GapTestPequalOne;
+  if (PyObject_SetAttr(__pyx_m, __pyx_n_s_GapTestPequalOne, (PyObject *)&__pyx_type_14slopescreening_9screening_12gap_test_p_1_GapTestPequalOne) < 0) __PYX_ERR(0, 23, __pyx_L1_error)
+  if (__Pyx_setup_reduce((PyObject*)&__pyx_type_14slopescreening_9screening_12gap_test_p_1_GapTestPequalOne) < 0) __PYX_ERR(0, 23, __pyx_L1_error)
+  __pyx_ptype_14slopescreening_9screening_12gap_test_p_1_GapTestPequalOne = &__pyx_type_14slopescreening_9screening_12gap_test_p_1_GapTestPequalOne;
   __Pyx_RefNannyFinishContext();
   return 0;
   __pyx_L1_error:;
@@ -4437,38 +4575,38 @@ static int __Pyx_modinit_type_import_code(void) {
   __Pyx_ImportType_CheckSize_Warn);
    if (!__pyx_ptype_7cpython_4type_type) __PYX_ERR(3, 9, __pyx_L1_error)
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  __pyx_t_1 = PyImport_ImportModule("numpy"); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 200, __pyx_L1_error)
+  __pyx_t_1 = PyImport_ImportModule("numpy"); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 199, __pyx_L1_error)
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_ptype_5numpy_dtype = __Pyx_ImportType(__pyx_t_1, "numpy", "dtype", sizeof(PyArray_Descr), __Pyx_ImportType_CheckSize_Ignore);
-   if (!__pyx_ptype_5numpy_dtype) __PYX_ERR(2, 200, __pyx_L1_error)
+   if (!__pyx_ptype_5numpy_dtype) __PYX_ERR(2, 199, __pyx_L1_error)
   __pyx_ptype_5numpy_flatiter = __Pyx_ImportType(__pyx_t_1, "numpy", "flatiter", sizeof(PyArrayIterObject), __Pyx_ImportType_CheckSize_Ignore);
-   if (!__pyx_ptype_5numpy_flatiter) __PYX_ERR(2, 223, __pyx_L1_error)
+   if (!__pyx_ptype_5numpy_flatiter) __PYX_ERR(2, 222, __pyx_L1_error)
   __pyx_ptype_5numpy_broadcast = __Pyx_ImportType(__pyx_t_1, "numpy", "broadcast", sizeof(PyArrayMultiIterObject), __Pyx_ImportType_CheckSize_Ignore);
-   if (!__pyx_ptype_5numpy_broadcast) __PYX_ERR(2, 227, __pyx_L1_error)
+   if (!__pyx_ptype_5numpy_broadcast) __PYX_ERR(2, 226, __pyx_L1_error)
   __pyx_ptype_5numpy_ndarray = __Pyx_ImportType(__pyx_t_1, "numpy", "ndarray", sizeof(PyArrayObject), __Pyx_ImportType_CheckSize_Ignore);
-   if (!__pyx_ptype_5numpy_ndarray) __PYX_ERR(2, 239, __pyx_L1_error)
+   if (!__pyx_ptype_5numpy_ndarray) __PYX_ERR(2, 238, __pyx_L1_error)
   __pyx_ptype_5numpy_generic = __Pyx_ImportType(__pyx_t_1, "numpy", "generic", sizeof(PyObject), __Pyx_ImportType_CheckSize_Warn);
-   if (!__pyx_ptype_5numpy_generic) __PYX_ERR(2, 771, __pyx_L1_error)
+   if (!__pyx_ptype_5numpy_generic) __PYX_ERR(2, 770, __pyx_L1_error)
   __pyx_ptype_5numpy_number = __Pyx_ImportType(__pyx_t_1, "numpy", "number", sizeof(PyObject), __Pyx_ImportType_CheckSize_Warn);
-   if (!__pyx_ptype_5numpy_number) __PYX_ERR(2, 773, __pyx_L1_error)
+   if (!__pyx_ptype_5numpy_number) __PYX_ERR(2, 772, __pyx_L1_error)
   __pyx_ptype_5numpy_integer = __Pyx_ImportType(__pyx_t_1, "numpy", "integer", sizeof(PyObject), __Pyx_ImportType_CheckSize_Warn);
-   if (!__pyx_ptype_5numpy_integer) __PYX_ERR(2, 775, __pyx_L1_error)
+   if (!__pyx_ptype_5numpy_integer) __PYX_ERR(2, 774, __pyx_L1_error)
   __pyx_ptype_5numpy_signedinteger = __Pyx_ImportType(__pyx_t_1, "numpy", "signedinteger", sizeof(PyObject), __Pyx_ImportType_CheckSize_Warn);
-   if (!__pyx_ptype_5numpy_signedinteger) __PYX_ERR(2, 777, __pyx_L1_error)
+   if (!__pyx_ptype_5numpy_signedinteger) __PYX_ERR(2, 776, __pyx_L1_error)
   __pyx_ptype_5numpy_unsignedinteger = __Pyx_ImportType(__pyx_t_1, "numpy", "unsignedinteger", sizeof(PyObject), __Pyx_ImportType_CheckSize_Warn);
-   if (!__pyx_ptype_5numpy_unsignedinteger) __PYX_ERR(2, 779, __pyx_L1_error)
+   if (!__pyx_ptype_5numpy_unsignedinteger) __PYX_ERR(2, 778, __pyx_L1_error)
   __pyx_ptype_5numpy_inexact = __Pyx_ImportType(__pyx_t_1, "numpy", "inexact", sizeof(PyObject), __Pyx_ImportType_CheckSize_Warn);
-   if (!__pyx_ptype_5numpy_inexact) __PYX_ERR(2, 781, __pyx_L1_error)
+   if (!__pyx_ptype_5numpy_inexact) __PYX_ERR(2, 780, __pyx_L1_error)
   __pyx_ptype_5numpy_floating = __Pyx_ImportType(__pyx_t_1, "numpy", "floating", sizeof(PyObject), __Pyx_ImportType_CheckSize_Warn);
-   if (!__pyx_ptype_5numpy_floating) __PYX_ERR(2, 783, __pyx_L1_error)
+   if (!__pyx_ptype_5numpy_floating) __PYX_ERR(2, 782, __pyx_L1_error)
   __pyx_ptype_5numpy_complexfloating = __Pyx_ImportType(__pyx_t_1, "numpy", "complexfloating", sizeof(PyObject), __Pyx_ImportType_CheckSize_Warn);
-   if (!__pyx_ptype_5numpy_complexfloating) __PYX_ERR(2, 785, __pyx_L1_error)
+   if (!__pyx_ptype_5numpy_complexfloating) __PYX_ERR(2, 784, __pyx_L1_error)
   __pyx_ptype_5numpy_flexible = __Pyx_ImportType(__pyx_t_1, "numpy", "flexible", sizeof(PyObject), __Pyx_ImportType_CheckSize_Warn);
-   if (!__pyx_ptype_5numpy_flexible) __PYX_ERR(2, 787, __pyx_L1_error)
+   if (!__pyx_ptype_5numpy_flexible) __PYX_ERR(2, 786, __pyx_L1_error)
   __pyx_ptype_5numpy_character = __Pyx_ImportType(__pyx_t_1, "numpy", "character", sizeof(PyObject), __Pyx_ImportType_CheckSize_Warn);
-   if (!__pyx_ptype_5numpy_character) __PYX_ERR(2, 789, __pyx_L1_error)
+   if (!__pyx_ptype_5numpy_character) __PYX_ERR(2, 788, __pyx_L1_error)
   __pyx_ptype_5numpy_ufunc = __Pyx_ImportType(__pyx_t_1, "numpy", "ufunc", sizeof(PyUFuncObject), __Pyx_ImportType_CheckSize_Ignore);
-   if (!__pyx_ptype_5numpy_ufunc) __PYX_ERR(2, 827, __pyx_L1_error)
+   if (!__pyx_ptype_5numpy_ufunc) __PYX_ERR(2, 826, __pyx_L1_error)
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   __Pyx_RefNannyFinishContext();
   return 0;
@@ -4667,14 +4805,14 @@ if (!__Pyx_RefNanny) {
   #if PY_MAJOR_VERSION < 3 && (__PYX_DEFAULT_STRING_ENCODING_IS_ASCII || __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT)
   if (__Pyx_init_sys_getdefaultencoding_params() < 0) __PYX_ERR(0, 1, __pyx_L1_error)
   #endif
-  if (__pyx_module_is_main_src__screening__gap_test_p_1) {
+  if (__pyx_module_is_main_slopescreening__screening__gap_test_p_1) {
     if (PyObject_SetAttr(__pyx_m, __pyx_n_s_name, __pyx_n_s_main) < 0) __PYX_ERR(0, 1, __pyx_L1_error)
   }
   #if PY_MAJOR_VERSION >= 3
   {
     PyObject *modules = PyImport_GetModuleDict(); if (unlikely(!modules)) __PYX_ERR(0, 1, __pyx_L1_error)
-    if (!PyDict_GetItemString(modules, "src.screening.gap_test_p_1")) {
-      if (unlikely(PyDict_SetItemString(modules, "src.screening.gap_test_p_1", __pyx_m) < 0)) __PYX_ERR(0, 1, __pyx_L1_error)
+    if (!PyDict_GetItemString(modules, "slopescreening.screening.gap_test_p_1")) {
+      if (unlikely(PyDict_SetItemString(modules, "slopescreening.screening.gap_test_p_1", __pyx_m) < 0)) __PYX_ERR(0, 1, __pyx_L1_error)
     }
   }
   #endif
@@ -4695,22 +4833,22 @@ if (!__Pyx_RefNanny) {
   if (__Pyx_patch_abc() < 0) __PYX_ERR(0, 1, __pyx_L1_error)
   #endif
 
-  /* "src/screening/gap_test_p_1.pyx":3
+  /* "slopescreening/screening/gap_test_p_1.pyx":3
  * # -*- coding: utf-8 -*-
  * # Based on https://cython.readthedocs.io/en/latest/src/tutorial/numpy.html
  * import numpy as np             # <<<<<<<<<<<<<<
  * 
- * from src.screening.ascreening import AbstractGapScreening
+ * from slopescreening.screening.ascreening import AbstractGapScreening
  */
   __pyx_t_1 = __Pyx_Import(__pyx_n_s_numpy, 0, -1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 3, __pyx_L1_error)
   __Pyx_GOTREF(__pyx_t_1);
   if (PyDict_SetItem(__pyx_d, __pyx_n_s_np, __pyx_t_1) < 0) __PYX_ERR(0, 3, __pyx_L1_error)
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "src/screening/gap_test_p_1.pyx":5
+  /* "slopescreening/screening/gap_test_p_1.pyx":5
  * import numpy as np
  * 
- * from src.screening.ascreening import AbstractGapScreening             # <<<<<<<<<<<<<<
+ * from slopescreening.screening.ascreening import AbstractGapScreening             # <<<<<<<<<<<<<<
  * 
  * 
  */
@@ -4719,7 +4857,7 @@ if (!__Pyx_RefNanny) {
   __Pyx_INCREF(__pyx_n_s_AbstractGapScreening);
   __Pyx_GIVEREF(__pyx_n_s_AbstractGapScreening);
   PyList_SET_ITEM(__pyx_t_1, 0, __pyx_n_s_AbstractGapScreening);
-  __pyx_t_2 = __Pyx_Import(__pyx_n_s_src_screening_ascreening, __pyx_t_1, -1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 5, __pyx_L1_error)
+  __pyx_t_2 = __Pyx_Import(__pyx_n_s_slopescreening_screening_ascreen, __pyx_t_1, -1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 5, __pyx_L1_error)
   __Pyx_GOTREF(__pyx_t_2);
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   __pyx_t_1 = __Pyx_ImportFrom(__pyx_t_2, __pyx_n_s_AbstractGapScreening); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 5, __pyx_L1_error)
@@ -4728,7 +4866,7 @@ if (!__Pyx_RefNanny) {
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
 
-  /* "src/screening/gap_test_p_1.pyx":1
+  /* "slopescreening/screening/gap_test_p_1.pyx":1
  * # -*- coding: utf-8 -*-             # <<<<<<<<<<<<<<
  * # Based on https://cython.readthedocs.io/en/latest/src/tutorial/numpy.html
  * import numpy as np
@@ -4738,7 +4876,7 @@ if (!__Pyx_RefNanny) {
   if (PyDict_SetItem(__pyx_d, __pyx_n_s_test, __pyx_t_2) < 0) __PYX_ERR(0, 1, __pyx_L1_error)
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
 
-  /* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":1014
+  /* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":1013
  * 
  * 
  * cdef inline NPY_DATETIMEUNIT get_datetime64_unit(object obj) nogil:             # <<<<<<<<<<<<<<
@@ -4754,11 +4892,11 @@ if (!__Pyx_RefNanny) {
   __Pyx_XDECREF(__pyx_t_2);
   if (__pyx_m) {
     if (__pyx_d) {
-      __Pyx_AddTraceback("init src.screening.gap_test_p_1", __pyx_clineno, __pyx_lineno, __pyx_filename);
+      __Pyx_AddTraceback("init slopescreening.screening.gap_test_p_1", __pyx_clineno, __pyx_lineno, __pyx_filename);
     }
     Py_CLEAR(__pyx_m);
   } else if (!PyErr_Occurred()) {
-    PyErr_SetString(PyExc_ImportError, "init src.screening.gap_test_p_1");
+    PyErr_SetString(PyExc_ImportError, "init slopescreening.screening.gap_test_p_1");
   }
   __pyx_L0:;
   __Pyx_RefNannyFinishContext();
@@ -6417,17 +6555,35 @@ static CYTHON_INLINE PyObject* __Pyx_PyObject_GetAttrStrNoError(PyObject* obj, P
 static int __Pyx_setup_reduce(PyObject* type_obj) {
     int ret = 0;
     PyObject *object_reduce = NULL;
+    PyObject *object_getstate = NULL;
     PyObject *object_reduce_ex = NULL;
     PyObject *reduce = NULL;
     PyObject *reduce_ex = NULL;
     PyObject *reduce_cython = NULL;
     PyObject *setstate = NULL;
     PyObject *setstate_cython = NULL;
+    PyObject *getstate = NULL;
 #if CYTHON_USE_PYTYPE_LOOKUP
-    if (_PyType_Lookup((PyTypeObject*)type_obj, __pyx_n_s_getstate)) goto __PYX_GOOD;
+    getstate = _PyType_Lookup((PyTypeObject*)type_obj, __pyx_n_s_getstate);
 #else
-    if (PyObject_HasAttr(type_obj, __pyx_n_s_getstate)) goto __PYX_GOOD;
+    getstate = __Pyx_PyObject_GetAttrStrNoError(type_obj, __pyx_n_s_getstate);
+    if (!getstate && PyErr_Occurred()) {
+        goto __PYX_BAD;
+    }
 #endif
+    if (getstate) {
+#if CYTHON_USE_PYTYPE_LOOKUP
+        object_getstate = _PyType_Lookup(&PyBaseObject_Type, __pyx_n_s_getstate);
+#else
+        object_getstate = __Pyx_PyObject_GetAttrStrNoError((PyObject*)&PyBaseObject_Type, __pyx_n_s_getstate);
+        if (!object_getstate && PyErr_Occurred()) {
+            goto __PYX_BAD;
+        }
+#endif
+        if (object_getstate != getstate) {
+            goto __PYX_GOOD;
+        }
+    }
 #if CYTHON_USE_PYTYPE_LOOKUP
     object_reduce_ex = _PyType_Lookup(&PyBaseObject_Type, __pyx_n_s_reduce_ex); if (!object_reduce_ex) goto __PYX_BAD;
 #else
@@ -6472,6 +6628,8 @@ __PYX_GOOD:
 #if !CYTHON_USE_PYTYPE_LOOKUP
     Py_XDECREF(object_reduce);
     Py_XDECREF(object_reduce_ex);
+    Py_XDECREF(object_getstate);
+    Py_XDECREF(getstate);
 #endif
     Py_XDECREF(reduce);
     Py_XDECREF(reduce_ex);
@@ -6653,7 +6811,7 @@ static int __Pyx_CLineForTraceback(CYTHON_NCP_UNUSED PyThreadState *tstate, int
     }
     if (!use_cline) {
         c_line = 0;
-        PyObject_SetAttr(__pyx_cython_runtime, __pyx_n_s_cline_in_traceback, Py_False);
+        (void) PyObject_SetAttr(__pyx_cython_runtime, __pyx_n_s_cline_in_traceback, Py_False);
     }
     else if (use_cline == Py_False || (use_cline != Py_True && PyObject_Not(use_cline) != 0)) {
         c_line = 0;
@@ -6747,33 +6905,40 @@ static void __pyx_insert_code_object(int code_line, PyCodeObject* code_object) {
   #include "compile.h"
 #include "frameobject.h"
 #include "traceback.h"
+#if PY_VERSION_HEX >= 0x030b00a6
+  #ifndef Py_BUILD_CORE
+    #define Py_BUILD_CORE 1
+  #endif
+  #include "internal/pycore_frame.h"
+#endif
 static PyCodeObject* __Pyx_CreateCodeObjectForTraceback(
             const char *funcname, int c_line,
             int py_line, const char *filename) {
-    PyCodeObject *py_code = 0;
-    PyObject *py_srcfile = 0;
-    PyObject *py_funcname = 0;
+    PyCodeObject *py_code = NULL;
+    PyObject *py_funcname = NULL;
     #if PY_MAJOR_VERSION < 3
+    PyObject *py_srcfile = NULL;
     py_srcfile = PyString_FromString(filename);
-    #else
-    py_srcfile = PyUnicode_FromString(filename);
-    #endif
     if (!py_srcfile) goto bad;
+    #endif
     if (c_line) {
         #if PY_MAJOR_VERSION < 3
         py_funcname = PyString_FromFormat( "%s (%s:%d)", funcname, __pyx_cfilenm, c_line);
+        if (!py_funcname) goto bad;
         #else
         py_funcname = PyUnicode_FromFormat( "%s (%s:%d)", funcname, __pyx_cfilenm, c_line);
+        if (!py_funcname) goto bad;
+        funcname = PyUnicode_AsUTF8(py_funcname);
+        if (!funcname) goto bad;
         #endif
     }
     else {
         #if PY_MAJOR_VERSION < 3
         py_funcname = PyString_FromString(funcname);
-        #else
-        py_funcname = PyUnicode_FromString(funcname);
+        if (!py_funcname) goto bad;
         #endif
     }
-    if (!py_funcname) goto bad;
+    #if PY_MAJOR_VERSION < 3
     py_code = __Pyx_PyCode_New(
         0,
         0,
@@ -6792,11 +6957,16 @@ static PyCodeObject* __Pyx_CreateCodeObjectForTraceback(
         __pyx_empty_bytes  /*PyObject *lnotab*/
     );
     Py_DECREF(py_srcfile);
-    Py_DECREF(py_funcname);
+    #else
+    py_code = PyCode_NewEmpty(filename, funcname, py_line);
+    #endif
+    Py_XDECREF(py_funcname);  // XDECREF since it's only set on Py3 if cline
     return py_code;
 bad:
-    Py_XDECREF(py_srcfile);
     Py_XDECREF(py_funcname);
+    #if PY_MAJOR_VERSION < 3
+    Py_XDECREF(py_srcfile);
+    #endif
     return NULL;
 }
 static void __Pyx_AddTraceback(const char *funcname, int c_line,
@@ -6804,14 +6974,24 @@ static void __Pyx_AddTraceback(const char *funcname, int c_line,
     PyCodeObject *py_code = 0;
     PyFrameObject *py_frame = 0;
     PyThreadState *tstate = __Pyx_PyThreadState_Current;
+    PyObject *ptype, *pvalue, *ptraceback;
     if (c_line) {
         c_line = __Pyx_CLineForTraceback(tstate, c_line);
     }
     py_code = __pyx_find_code_object(c_line ? -c_line : py_line);
     if (!py_code) {
+        __Pyx_ErrFetchInState(tstate, &ptype, &pvalue, &ptraceback);
         py_code = __Pyx_CreateCodeObjectForTraceback(
             funcname, c_line, py_line, filename);
-        if (!py_code) goto bad;
+        if (!py_code) {
+            /* If the code object creation fails, then we should clear the
+               fetched exception references and propagate the new exception */
+            Py_XDECREF(ptype);
+            Py_XDECREF(pvalue);
+            Py_XDECREF(ptraceback);
+            goto bad;
+        }
+        __Pyx_ErrRestoreInState(tstate, ptype, pvalue, ptraceback);
         __pyx_insert_code_object(c_line ? -c_line : py_line, py_code);
     }
     py_frame = PyFrame_New(
@@ -7748,11 +7928,33 @@ static CYTHON_INLINE int __Pyx_PyErr_GivenExceptionMatches2(PyObject *err, PyObj
 
 /* CheckBinaryVersion */
   static int __Pyx_check_binary_version(void) {
-    char ctversion[4], rtversion[4];
-    PyOS_snprintf(ctversion, 4, "%d.%d", PY_MAJOR_VERSION, PY_MINOR_VERSION);
-    PyOS_snprintf(rtversion, 4, "%s", Py_GetVersion());
-    if (ctversion[0] != rtversion[0] || ctversion[2] != rtversion[2]) {
+    char ctversion[5];
+    int same=1, i, found_dot;
+    const char* rt_from_call = Py_GetVersion();
+    PyOS_snprintf(ctversion, 5, "%d.%d", PY_MAJOR_VERSION, PY_MINOR_VERSION);
+    found_dot = 0;
+    for (i = 0; i < 4; i++) {
+        if (!ctversion[i]) {
+            same = (rt_from_call[i] < '0' || rt_from_call[i] > '9');
+            break;
+        }
+        if (rt_from_call[i] != ctversion[i]) {
+            same = 0;
+            break;
+        }
+    }
+    if (!same) {
+        char rtversion[5] = {'\0'};
         char message[200];
+        for (i=0; i<4; ++i) {
+            if (rt_from_call[i] == '.') {
+                if (found_dot) break;
+                found_dot = 1;
+            } else if (rt_from_call[i] < '0' || rt_from_call[i] > '9') {
+                break;
+            }
+            rtversion[i] = rt_from_call[i];
+        }
         PyOS_snprintf(message, sizeof(message),
                       "compiletime version %s of module '%.100s' "
                       "does not match runtime version %s",
@@ -8010,6 +8212,23 @@ static CYTHON_INLINE Py_ssize_t __Pyx_PyIndex_AsSsize_t(PyObject* b) {
   Py_DECREF(x);
   return ival;
 }
+static CYTHON_INLINE Py_hash_t __Pyx_PyIndex_AsHash_t(PyObject* o) {
+  if (sizeof(Py_hash_t) == sizeof(Py_ssize_t)) {
+    return (Py_hash_t) __Pyx_PyIndex_AsSsize_t(o);
+#if PY_MAJOR_VERSION < 3
+  } else if (likely(PyInt_CheckExact(o))) {
+    return PyInt_AS_LONG(o);
+#endif
+  } else {
+    Py_ssize_t ival;
+    PyObject *x;
+    x = PyNumber_Index(o);
+    if (!x) return -1;
+    ival = PyInt_AsLong(x);
+    Py_DECREF(x);
+    return ival;
+  }
+}
 static CYTHON_INLINE PyObject * __Pyx_PyBool_FromLong(long b) {
   return b ? __Pyx_NewRef(Py_True) : __Pyx_NewRef(Py_False);
 }
diff --git a/src/screening/gap_test_p_1.pyx b/slopescreening/screening/gap_test_p_1.pyx
similarity index 98%
rename from src/screening/gap_test_p_1.pyx
rename to slopescreening/screening/gap_test_p_1.pyx
index 9fc4aa1..d01208d 100644
--- a/src/screening/gap_test_p_1.pyx
+++ b/slopescreening/screening/gap_test_p_1.pyx
@@ -2,7 +2,7 @@
 # Based on https://cython.readthedocs.io/en/latest/src/tutorial/numpy.html
 import numpy as np
 
-from src.screening.ascreening import AbstractGapScreening
+from slopescreening.screening.ascreening import AbstractGapScreening
 
 
 # "cimport" is used to import special compile-time information
diff --git a/src/screening/gap_test_p_q.py b/slopescreening/screening/gap_test_p_q.py
similarity index 95%
rename from src/screening/gap_test_p_q.py
rename to slopescreening/screening/gap_test_p_q.py
index 6520ba0..1923359 100644
--- a/src/screening/gap_test_p_q.py
+++ b/slopescreening/screening/gap_test_p_q.py
@@ -1,7 +1,7 @@
 # -*- coding: utf-8 -*-
 import numpy as np
 
-from src.screening.ascreening import AbstractGapScreening
+from slopescreening.screening.ascreening import AbstractGapScreening
 
 
 class GapTestPequalQ(AbstractGapScreening):
diff --git a/src/screening/utils.c b/slopescreening/screening/utils.c
similarity index 91%
rename from src/screening/utils.c
rename to slopescreening/screening/utils.c
index f9e32a5..254c0ea 100644
--- a/src/screening/utils.c
+++ b/slopescreening/screening/utils.c
@@ -1,15 +1,15 @@
-/* Generated by Cython 0.29.24 */
+/* Generated by Cython 0.29.32 */
 
 /* BEGIN: Cython Metadata
 {
     "distutils": {
         "depends": [],
-        "name": "src.screening.utils",
+        "name": "slopescreening.screening.utils",
         "sources": [
-            "src/screening/utils.pyx"
+            "slopescreening/screening/utils.pyx"
         ]
     },
-    "module_name": "src.screening.utils"
+    "module_name": "slopescreening.screening.utils"
 }
 END: Cython Metadata */
 
@@ -22,8 +22,8 @@ END: Cython Metadata */
 #elif PY_VERSION_HEX < 0x02060000 || (0x03000000 <= PY_VERSION_HEX && PY_VERSION_HEX < 0x03030000)
     #error Cython requires Python 2.6+ or Python 3.3+.
 #else
-#define CYTHON_ABI "0_29_24"
-#define CYTHON_HEX_VERSION 0x001D18F0
+#define CYTHON_ABI "0_29_32"
+#define CYTHON_HEX_VERSION 0x001D20F0
 #define CYTHON_FUTURE_DIVISION 0
 #include <stddef.h>
 #ifndef offsetof
@@ -62,6 +62,7 @@ END: Cython Metadata */
   #define CYTHON_COMPILING_IN_PYPY 1
   #define CYTHON_COMPILING_IN_PYSTON 0
   #define CYTHON_COMPILING_IN_CPYTHON 0
+  #define CYTHON_COMPILING_IN_NOGIL 0
   #undef CYTHON_USE_TYPE_SLOTS
   #define CYTHON_USE_TYPE_SLOTS 0
   #undef CYTHON_USE_PYTYPE_LOOKUP
@@ -98,10 +99,14 @@ END: Cython Metadata */
   #define CYTHON_USE_DICT_VERSIONS 0
   #undef CYTHON_USE_EXC_INFO_STACK
   #define CYTHON_USE_EXC_INFO_STACK 0
+  #ifndef CYTHON_UPDATE_DESCRIPTOR_DOC
+    #define CYTHON_UPDATE_DESCRIPTOR_DOC (PYPY_VERSION_HEX >= 0x07030900)
+  #endif
 #elif defined(PYSTON_VERSION)
   #define CYTHON_COMPILING_IN_PYPY 0
   #define CYTHON_COMPILING_IN_PYSTON 1
   #define CYTHON_COMPILING_IN_CPYTHON 0
+  #define CYTHON_COMPILING_IN_NOGIL 0
   #ifndef CYTHON_USE_TYPE_SLOTS
     #define CYTHON_USE_TYPE_SLOTS 1
   #endif
@@ -139,10 +144,59 @@ END: Cython Metadata */
   #define CYTHON_USE_DICT_VERSIONS 0
   #undef CYTHON_USE_EXC_INFO_STACK
   #define CYTHON_USE_EXC_INFO_STACK 0
+  #ifndef CYTHON_UPDATE_DESCRIPTOR_DOC
+    #define CYTHON_UPDATE_DESCRIPTOR_DOC 0
+  #endif
+#elif defined(PY_NOGIL)
+  #define CYTHON_COMPILING_IN_PYPY 0
+  #define CYTHON_COMPILING_IN_PYSTON 0
+  #define CYTHON_COMPILING_IN_CPYTHON 0
+  #define CYTHON_COMPILING_IN_NOGIL 1
+  #ifndef CYTHON_USE_TYPE_SLOTS
+    #define CYTHON_USE_TYPE_SLOTS 1
+  #endif
+  #undef CYTHON_USE_PYTYPE_LOOKUP
+  #define CYTHON_USE_PYTYPE_LOOKUP 0
+  #ifndef CYTHON_USE_ASYNC_SLOTS
+    #define CYTHON_USE_ASYNC_SLOTS 1
+  #endif
+  #undef CYTHON_USE_PYLIST_INTERNALS
+  #define CYTHON_USE_PYLIST_INTERNALS 0
+  #ifndef CYTHON_USE_UNICODE_INTERNALS
+    #define CYTHON_USE_UNICODE_INTERNALS 1
+  #endif
+  #undef CYTHON_USE_UNICODE_WRITER
+  #define CYTHON_USE_UNICODE_WRITER 0
+  #undef CYTHON_USE_PYLONG_INTERNALS
+  #define CYTHON_USE_PYLONG_INTERNALS 0
+  #ifndef CYTHON_AVOID_BORROWED_REFS
+    #define CYTHON_AVOID_BORROWED_REFS 0
+  #endif
+  #ifndef CYTHON_ASSUME_SAFE_MACROS
+    #define CYTHON_ASSUME_SAFE_MACROS 1
+  #endif
+  #ifndef CYTHON_UNPACK_METHODS
+    #define CYTHON_UNPACK_METHODS 1
+  #endif
+  #undef CYTHON_FAST_THREAD_STATE
+  #define CYTHON_FAST_THREAD_STATE 0
+  #undef CYTHON_FAST_PYCALL
+  #define CYTHON_FAST_PYCALL 0
+  #ifndef CYTHON_PEP489_MULTI_PHASE_INIT
+    #define CYTHON_PEP489_MULTI_PHASE_INIT 1
+  #endif
+  #ifndef CYTHON_USE_TP_FINALIZE
+    #define CYTHON_USE_TP_FINALIZE 1
+  #endif
+  #undef CYTHON_USE_DICT_VERSIONS
+  #define CYTHON_USE_DICT_VERSIONS 0
+  #undef CYTHON_USE_EXC_INFO_STACK
+  #define CYTHON_USE_EXC_INFO_STACK 0
 #else
   #define CYTHON_COMPILING_IN_PYPY 0
   #define CYTHON_COMPILING_IN_PYSTON 0
   #define CYTHON_COMPILING_IN_CPYTHON 1
+  #define CYTHON_COMPILING_IN_NOGIL 0
   #ifndef CYTHON_USE_TYPE_SLOTS
     #define CYTHON_USE_TYPE_SLOTS 1
   #endif
@@ -170,7 +224,7 @@ END: Cython Metadata */
   #ifndef CYTHON_USE_UNICODE_INTERNALS
     #define CYTHON_USE_UNICODE_INTERNALS 1
   #endif
-  #if PY_VERSION_HEX < 0x030300F0
+  #if PY_VERSION_HEX < 0x030300F0 || PY_VERSION_HEX >= 0x030B00A2
     #undef CYTHON_USE_UNICODE_WRITER
     #define CYTHON_USE_UNICODE_WRITER 0
   #elif !defined(CYTHON_USE_UNICODE_WRITER)
@@ -185,11 +239,14 @@ END: Cython Metadata */
   #ifndef CYTHON_UNPACK_METHODS
     #define CYTHON_UNPACK_METHODS 1
   #endif
-  #ifndef CYTHON_FAST_THREAD_STATE
+  #if PY_VERSION_HEX >= 0x030B00A4
+    #undef CYTHON_FAST_THREAD_STATE
+    #define CYTHON_FAST_THREAD_STATE 0
+  #elif !defined(CYTHON_FAST_THREAD_STATE)
     #define CYTHON_FAST_THREAD_STATE 1
   #endif
   #ifndef CYTHON_FAST_PYCALL
-    #define CYTHON_FAST_PYCALL 1
+    #define CYTHON_FAST_PYCALL (PY_VERSION_HEX < 0x030A0000)
   #endif
   #ifndef CYTHON_PEP489_MULTI_PHASE_INIT
     #define CYTHON_PEP489_MULTI_PHASE_INIT (PY_VERSION_HEX >= 0x03050000)
@@ -200,15 +257,23 @@ END: Cython Metadata */
   #ifndef CYTHON_USE_DICT_VERSIONS
     #define CYTHON_USE_DICT_VERSIONS (PY_VERSION_HEX >= 0x030600B1)
   #endif
-  #ifndef CYTHON_USE_EXC_INFO_STACK
+  #if PY_VERSION_HEX >= 0x030B00A4
+    #undef CYTHON_USE_EXC_INFO_STACK
+    #define CYTHON_USE_EXC_INFO_STACK 0
+  #elif !defined(CYTHON_USE_EXC_INFO_STACK)
     #define CYTHON_USE_EXC_INFO_STACK (PY_VERSION_HEX >= 0x030700A3)
   #endif
+  #ifndef CYTHON_UPDATE_DESCRIPTOR_DOC
+    #define CYTHON_UPDATE_DESCRIPTOR_DOC 1
+  #endif
 #endif
 #if !defined(CYTHON_FAST_PYCCALL)
 #define CYTHON_FAST_PYCCALL  (CYTHON_FAST_PYCALL && PY_VERSION_HEX >= 0x030600B1)
 #endif
 #if CYTHON_USE_PYLONG_INTERNALS
-  #include "longintrepr.h"
+  #if PY_MAJOR_VERSION < 3
+    #include "longintrepr.h"
+  #endif
   #undef SHIFT
   #undef BASE
   #undef MASK
@@ -325,9 +390,68 @@ END: Cython Metadata */
   #define __Pyx_DefaultClassType PyClass_Type
 #else
   #define __Pyx_BUILTIN_MODULE_NAME "builtins"
-#if PY_VERSION_HEX >= 0x030800A4 && PY_VERSION_HEX < 0x030800B2
-  #define __Pyx_PyCode_New(a, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos)\
-          PyCode_New(a, 0, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos)
+  #define __Pyx_DefaultClassType PyType_Type
+#if PY_VERSION_HEX >= 0x030B00A1
+    static CYTHON_INLINE PyCodeObject* __Pyx_PyCode_New(int a, int k, int l, int s, int f,
+                                                    PyObject *code, PyObject *c, PyObject* n, PyObject *v,
+                                                    PyObject *fv, PyObject *cell, PyObject* fn,
+                                                    PyObject *name, int fline, PyObject *lnos) {
+        PyObject *kwds=NULL, *argcount=NULL, *posonlyargcount=NULL, *kwonlyargcount=NULL;
+        PyObject *nlocals=NULL, *stacksize=NULL, *flags=NULL, *replace=NULL, *call_result=NULL, *empty=NULL;
+        const char *fn_cstr=NULL;
+        const char *name_cstr=NULL;
+        PyCodeObject* co=NULL;
+        PyObject *type, *value, *traceback;
+        PyErr_Fetch(&type, &value, &traceback);
+        if (!(kwds=PyDict_New())) goto end;
+        if (!(argcount=PyLong_FromLong(a))) goto end;
+        if (PyDict_SetItemString(kwds, "co_argcount", argcount) != 0) goto end;
+        if (!(posonlyargcount=PyLong_FromLong(0))) goto end;
+        if (PyDict_SetItemString(kwds, "co_posonlyargcount", posonlyargcount) != 0) goto end;
+        if (!(kwonlyargcount=PyLong_FromLong(k))) goto end;
+        if (PyDict_SetItemString(kwds, "co_kwonlyargcount", kwonlyargcount) != 0) goto end;
+        if (!(nlocals=PyLong_FromLong(l))) goto end;
+        if (PyDict_SetItemString(kwds, "co_nlocals", nlocals) != 0) goto end;
+        if (!(stacksize=PyLong_FromLong(s))) goto end;
+        if (PyDict_SetItemString(kwds, "co_stacksize", stacksize) != 0) goto end;
+        if (!(flags=PyLong_FromLong(f))) goto end;
+        if (PyDict_SetItemString(kwds, "co_flags", flags) != 0) goto end;
+        if (PyDict_SetItemString(kwds, "co_code", code) != 0) goto end;
+        if (PyDict_SetItemString(kwds, "co_consts", c) != 0) goto end;
+        if (PyDict_SetItemString(kwds, "co_names", n) != 0) goto end;
+        if (PyDict_SetItemString(kwds, "co_varnames", v) != 0) goto end;
+        if (PyDict_SetItemString(kwds, "co_freevars", fv) != 0) goto end;
+        if (PyDict_SetItemString(kwds, "co_cellvars", cell) != 0) goto end;
+        if (PyDict_SetItemString(kwds, "co_linetable", lnos) != 0) goto end;
+        if (!(fn_cstr=PyUnicode_AsUTF8AndSize(fn, NULL))) goto end;
+        if (!(name_cstr=PyUnicode_AsUTF8AndSize(name, NULL))) goto end;
+        if (!(co = PyCode_NewEmpty(fn_cstr, name_cstr, fline))) goto end;
+        if (!(replace = PyObject_GetAttrString((PyObject*)co, "replace"))) goto cleanup_code_too;
+        if (!(empty = PyTuple_New(0))) goto cleanup_code_too; // unfortunately __pyx_empty_tuple isn't available here
+        if (!(call_result = PyObject_Call(replace, empty, kwds))) goto cleanup_code_too;
+        Py_XDECREF((PyObject*)co);
+        co = (PyCodeObject*)call_result;
+        call_result = NULL;
+        if (0) {
+            cleanup_code_too:
+            Py_XDECREF((PyObject*)co);
+            co = NULL;
+        }
+        end:
+        Py_XDECREF(kwds);
+        Py_XDECREF(argcount);
+        Py_XDECREF(posonlyargcount);
+        Py_XDECREF(kwonlyargcount);
+        Py_XDECREF(nlocals);
+        Py_XDECREF(stacksize);
+        Py_XDECREF(replace);
+        Py_XDECREF(call_result);
+        Py_XDECREF(empty);
+        if (type) {
+            PyErr_Restore(type, value, traceback);
+        }
+        return co;
+    }
 #else
   #define __Pyx_PyCode_New(a, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos)\
           PyCode_New(a, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos)
@@ -565,10 +689,10 @@ static CYTHON_INLINE void * PyThread_tss_get(Py_tss_t *key) {
 #if PY_VERSION_HEX < 0x030200A4
   typedef long Py_hash_t;
   #define __Pyx_PyInt_FromHash_t PyInt_FromLong
-  #define __Pyx_PyInt_AsHash_t   PyInt_AsLong
+  #define __Pyx_PyInt_AsHash_t   __Pyx_PyIndex_AsHash_t
 #else
   #define __Pyx_PyInt_FromHash_t PyInt_FromSsize_t
-  #define __Pyx_PyInt_AsHash_t   PyInt_AsSsize_t
+  #define __Pyx_PyInt_AsHash_t   __Pyx_PyIndex_AsSsize_t
 #endif
 #if PY_MAJOR_VERSION >= 3
   #define __Pyx_PyMethod_New(func, self, klass) ((self) ? ((void)(klass), PyMethod_New(func, self)) : __Pyx_NewRef(func))
@@ -593,8 +717,10 @@ static CYTHON_INLINE void * PyThread_tss_get(Py_tss_t *key) {
     } __Pyx_PyAsyncMethodsStruct;
 #endif
 
-#if defined(WIN32) || defined(MS_WINDOWS)
-  #define _USE_MATH_DEFINES
+#if defined(_WIN32) || defined(WIN32) || defined(MS_WINDOWS)
+  #if !defined(_USE_MATH_DEFINES)
+    #define _USE_MATH_DEFINES
+  #endif
 #endif
 #include <math.h>
 #ifdef NAN
@@ -625,8 +751,8 @@ static CYTHON_INLINE float __PYX_NAN() {
   #endif
 #endif
 
-#define __PYX_HAVE__src__screening__utils
-#define __PYX_HAVE_API__src__screening__utils
+#define __PYX_HAVE__slopescreening__screening__utils
+#define __PYX_HAVE_API__slopescreening__screening__utils
 /* Early includes */
 #include <string.h>
 #include <stdio.h>
@@ -734,6 +860,7 @@ static CYTHON_INLINE PyObject* __Pyx_PyNumber_IntOrLong(PyObject* x);
     (likely(PyTuple_CheckExact(obj)) ? __Pyx_NewRef(obj) : PySequence_Tuple(obj))
 static CYTHON_INLINE Py_ssize_t __Pyx_PyIndex_AsSsize_t(PyObject*);
 static CYTHON_INLINE PyObject * __Pyx_PyInt_FromSize_t(size_t);
+static CYTHON_INLINE Py_hash_t __Pyx_PyIndex_AsHash_t(PyObject*);
 #if CYTHON_ASSUME_SAFE_MACROS
 #define __pyx_PyFloat_AsDouble(x) (PyFloat_CheckExact(x) ? PyFloat_AS_DOUBLE(x) : PyFloat_AsDouble(x))
 #else
@@ -868,9 +995,9 @@ static const char *__pyx_filename;
 
 
 static const char *__pyx_f[] = {
-  "src/screening/utils.pyx",
-  "venv/lib/python3.8/site-packages/numpy/__init__.pxd",
-  "venv/lib/python3.8/site-packages/Cython/Includes/cpython/type.pxd",
+  "slopescreening/screening/utils.pyx",
+  "venv/lib/python3.10/site-packages/numpy/__init__.pxd",
+  "venv/lib/python3.10/site-packages/Cython/Includes/cpython/type.pxd",
 };
 /* BufferFormatStructs.proto */
 #define IS_UNSIGNED(type) (((type) -1) > 0)
@@ -909,7 +1036,7 @@ typedef struct {
 } __Pyx_BufFmt_Context;
 
 
-/* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":690
+/* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":689
  * # in Cython to enable them only on the right systems.
  * 
  * ctypedef npy_int8       int8_t             # <<<<<<<<<<<<<<
@@ -918,7 +1045,7 @@ typedef struct {
  */
 typedef npy_int8 __pyx_t_5numpy_int8_t;
 
-/* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":691
+/* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":690
  * 
  * ctypedef npy_int8       int8_t
  * ctypedef npy_int16      int16_t             # <<<<<<<<<<<<<<
@@ -927,7 +1054,7 @@ typedef npy_int8 __pyx_t_5numpy_int8_t;
  */
 typedef npy_int16 __pyx_t_5numpy_int16_t;
 
-/* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":692
+/* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":691
  * ctypedef npy_int8       int8_t
  * ctypedef npy_int16      int16_t
  * ctypedef npy_int32      int32_t             # <<<<<<<<<<<<<<
@@ -936,7 +1063,7 @@ typedef npy_int16 __pyx_t_5numpy_int16_t;
  */
 typedef npy_int32 __pyx_t_5numpy_int32_t;
 
-/* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":693
+/* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":692
  * ctypedef npy_int16      int16_t
  * ctypedef npy_int32      int32_t
  * ctypedef npy_int64      int64_t             # <<<<<<<<<<<<<<
@@ -945,7 +1072,7 @@ typedef npy_int32 __pyx_t_5numpy_int32_t;
  */
 typedef npy_int64 __pyx_t_5numpy_int64_t;
 
-/* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":697
+/* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":696
  * #ctypedef npy_int128     int128_t
  * 
  * ctypedef npy_uint8      uint8_t             # <<<<<<<<<<<<<<
@@ -954,7 +1081,7 @@ typedef npy_int64 __pyx_t_5numpy_int64_t;
  */
 typedef npy_uint8 __pyx_t_5numpy_uint8_t;
 
-/* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":698
+/* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":697
  * 
  * ctypedef npy_uint8      uint8_t
  * ctypedef npy_uint16     uint16_t             # <<<<<<<<<<<<<<
@@ -963,7 +1090,7 @@ typedef npy_uint8 __pyx_t_5numpy_uint8_t;
  */
 typedef npy_uint16 __pyx_t_5numpy_uint16_t;
 
-/* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":699
+/* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":698
  * ctypedef npy_uint8      uint8_t
  * ctypedef npy_uint16     uint16_t
  * ctypedef npy_uint32     uint32_t             # <<<<<<<<<<<<<<
@@ -972,7 +1099,7 @@ typedef npy_uint16 __pyx_t_5numpy_uint16_t;
  */
 typedef npy_uint32 __pyx_t_5numpy_uint32_t;
 
-/* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":700
+/* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":699
  * ctypedef npy_uint16     uint16_t
  * ctypedef npy_uint32     uint32_t
  * ctypedef npy_uint64     uint64_t             # <<<<<<<<<<<<<<
@@ -981,7 +1108,7 @@ typedef npy_uint32 __pyx_t_5numpy_uint32_t;
  */
 typedef npy_uint64 __pyx_t_5numpy_uint64_t;
 
-/* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":704
+/* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":703
  * #ctypedef npy_uint128    uint128_t
  * 
  * ctypedef npy_float32    float32_t             # <<<<<<<<<<<<<<
@@ -990,7 +1117,7 @@ typedef npy_uint64 __pyx_t_5numpy_uint64_t;
  */
 typedef npy_float32 __pyx_t_5numpy_float32_t;
 
-/* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":705
+/* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":704
  * 
  * ctypedef npy_float32    float32_t
  * ctypedef npy_float64    float64_t             # <<<<<<<<<<<<<<
@@ -999,7 +1126,7 @@ typedef npy_float32 __pyx_t_5numpy_float32_t;
  */
 typedef npy_float64 __pyx_t_5numpy_float64_t;
 
-/* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":714
+/* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":713
  * # The int types are mapped a bit surprising --
  * # numpy.int corresponds to 'l' and numpy.long to 'q'
  * ctypedef npy_long       int_t             # <<<<<<<<<<<<<<
@@ -1008,7 +1135,7 @@ typedef npy_float64 __pyx_t_5numpy_float64_t;
  */
 typedef npy_long __pyx_t_5numpy_int_t;
 
-/* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":715
+/* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":714
  * # numpy.int corresponds to 'l' and numpy.long to 'q'
  * ctypedef npy_long       int_t
  * ctypedef npy_longlong   long_t             # <<<<<<<<<<<<<<
@@ -1017,7 +1144,7 @@ typedef npy_long __pyx_t_5numpy_int_t;
  */
 typedef npy_longlong __pyx_t_5numpy_long_t;
 
-/* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":716
+/* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":715
  * ctypedef npy_long       int_t
  * ctypedef npy_longlong   long_t
  * ctypedef npy_longlong   longlong_t             # <<<<<<<<<<<<<<
@@ -1026,7 +1153,7 @@ typedef npy_longlong __pyx_t_5numpy_long_t;
  */
 typedef npy_longlong __pyx_t_5numpy_longlong_t;
 
-/* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":718
+/* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":717
  * ctypedef npy_longlong   longlong_t
  * 
  * ctypedef npy_ulong      uint_t             # <<<<<<<<<<<<<<
@@ -1035,7 +1162,7 @@ typedef npy_longlong __pyx_t_5numpy_longlong_t;
  */
 typedef npy_ulong __pyx_t_5numpy_uint_t;
 
-/* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":719
+/* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":718
  * 
  * ctypedef npy_ulong      uint_t
  * ctypedef npy_ulonglong  ulong_t             # <<<<<<<<<<<<<<
@@ -1044,7 +1171,7 @@ typedef npy_ulong __pyx_t_5numpy_uint_t;
  */
 typedef npy_ulonglong __pyx_t_5numpy_ulong_t;
 
-/* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":720
+/* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":719
  * ctypedef npy_ulong      uint_t
  * ctypedef npy_ulonglong  ulong_t
  * ctypedef npy_ulonglong  ulonglong_t             # <<<<<<<<<<<<<<
@@ -1053,7 +1180,7 @@ typedef npy_ulonglong __pyx_t_5numpy_ulong_t;
  */
 typedef npy_ulonglong __pyx_t_5numpy_ulonglong_t;
 
-/* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":722
+/* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":721
  * ctypedef npy_ulonglong  ulonglong_t
  * 
  * ctypedef npy_intp       intp_t             # <<<<<<<<<<<<<<
@@ -1062,7 +1189,7 @@ typedef npy_ulonglong __pyx_t_5numpy_ulonglong_t;
  */
 typedef npy_intp __pyx_t_5numpy_intp_t;
 
-/* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":723
+/* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":722
  * 
  * ctypedef npy_intp       intp_t
  * ctypedef npy_uintp      uintp_t             # <<<<<<<<<<<<<<
@@ -1071,7 +1198,7 @@ typedef npy_intp __pyx_t_5numpy_intp_t;
  */
 typedef npy_uintp __pyx_t_5numpy_uintp_t;
 
-/* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":725
+/* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":724
  * ctypedef npy_uintp      uintp_t
  * 
  * ctypedef npy_double     float_t             # <<<<<<<<<<<<<<
@@ -1080,7 +1207,7 @@ typedef npy_uintp __pyx_t_5numpy_uintp_t;
  */
 typedef npy_double __pyx_t_5numpy_float_t;
 
-/* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":726
+/* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":725
  * 
  * ctypedef npy_double     float_t
  * ctypedef npy_double     double_t             # <<<<<<<<<<<<<<
@@ -1089,7 +1216,7 @@ typedef npy_double __pyx_t_5numpy_float_t;
  */
 typedef npy_double __pyx_t_5numpy_double_t;
 
-/* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":727
+/* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":726
  * ctypedef npy_double     float_t
  * ctypedef npy_double     double_t
  * ctypedef npy_longdouble longdouble_t             # <<<<<<<<<<<<<<
@@ -1098,14 +1225,14 @@ typedef npy_double __pyx_t_5numpy_double_t;
  */
 typedef npy_longdouble __pyx_t_5numpy_longdouble_t;
 
-/* "src/screening/utils.pyx":13
+/* "slopescreening/screening/utils.pyx":13
  * cimport cython
  * 
  * ctypedef np.npy_bool bool_t             # <<<<<<<<<<<<<<
  * 
  * 
  */
-typedef npy_bool __pyx_t_3src_9screening_5utils_bool_t;
+typedef npy_bool __pyx_t_14slopescreening_9screening_5utils_bool_t;
 /* Declarations.proto */
 #if CYTHON_CCOMPLEX
   #ifdef __cplusplus
@@ -1133,7 +1260,7 @@ static CYTHON_INLINE __pyx_t_double_complex __pyx_t_double_complex_from_parts(do
 
 /*--- Type declarations ---*/
 
-/* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":729
+/* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":728
  * ctypedef npy_longdouble longdouble_t
  * 
  * ctypedef npy_cfloat      cfloat_t             # <<<<<<<<<<<<<<
@@ -1142,7 +1269,7 @@ static CYTHON_INLINE __pyx_t_double_complex __pyx_t_double_complex_from_parts(do
  */
 typedef npy_cfloat __pyx_t_5numpy_cfloat_t;
 
-/* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":730
+/* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":729
  * 
  * ctypedef npy_cfloat      cfloat_t
  * ctypedef npy_cdouble     cdouble_t             # <<<<<<<<<<<<<<
@@ -1151,7 +1278,7 @@ typedef npy_cfloat __pyx_t_5numpy_cfloat_t;
  */
 typedef npy_cdouble __pyx_t_5numpy_cdouble_t;
 
-/* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":731
+/* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":730
  * ctypedef npy_cfloat      cfloat_t
  * ctypedef npy_cdouble     cdouble_t
  * ctypedef npy_clongdouble clongdouble_t             # <<<<<<<<<<<<<<
@@ -1160,7 +1287,7 @@ typedef npy_cdouble __pyx_t_5numpy_cdouble_t;
  */
 typedef npy_clongdouble __pyx_t_5numpy_clongdouble_t;
 
-/* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":733
+/* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":732
  * ctypedef npy_clongdouble clongdouble_t
  * 
  * ctypedef npy_cdouble     complex_t             # <<<<<<<<<<<<<<
@@ -1389,13 +1516,21 @@ static PyObject *__Pyx_PyFunction_FastCallDict(PyObject *func, PyObject **args,
 #ifndef Py_MEMBER_SIZE
 #define Py_MEMBER_SIZE(type, member) sizeof(((type *)0)->member)
 #endif
+#if CYTHON_FAST_PYCALL
   static size_t __pyx_pyframe_localsplus_offset = 0;
   #include "frameobject.h"
+#if PY_VERSION_HEX >= 0x030b00a6
+  #ifndef Py_BUILD_CORE
+    #define Py_BUILD_CORE 1
+  #endif
+  #include "internal/pycore_frame.h"
+#endif
   #define __Pxy_PyFrame_Initialize_Offsets()\
     ((void)__Pyx_BUILD_ASSERT_EXPR(sizeof(PyFrameObject) == offsetof(PyFrameObject, f_localsplus) + Py_MEMBER_SIZE(PyFrameObject, f_localsplus)),\
      (void)(__pyx_pyframe_localsplus_offset = ((size_t)PyFrame_Type.tp_basicsize) - Py_MEMBER_SIZE(PyFrameObject, f_localsplus)))
   #define __Pyx_PyFrame_GetLocalsplus(frame)\
     (assert(__pyx_pyframe_localsplus_offset), (PyObject **)(((char *)(frame)) + __pyx_pyframe_localsplus_offset))
+#endif // CYTHON_FAST_PYCALL
 #endif
 
 /* PyObjectCall2Args.proto */
@@ -1719,15 +1854,15 @@ static PyTypeObject *__pyx_ptype_5numpy_ufunc = 0;
 
 /* Module declarations from 'cython' */
 
-/* Module declarations from 'src.screening.utils' */
+/* Module declarations from 'slopescreening.screening.utils' */
 static __Pyx_TypeInfo __Pyx_TypeInfo_nn_npy_double = { "npy_double", NULL, sizeof(npy_double), { 0 }, 0, 'R', 0, 0 };
 static __Pyx_TypeInfo __Pyx_TypeInfo_nn___pyx_t_5numpy_int_t = { "int_t", NULL, sizeof(__pyx_t_5numpy_int_t), { 0 }, 0, IS_UNSIGNED(__pyx_t_5numpy_int_t) ? 'U' : 'I', IS_UNSIGNED(__pyx_t_5numpy_int_t), 0 };
 static __Pyx_TypeInfo __Pyx_TypeInfo_nn_npy_bool = { "npy_bool", NULL, sizeof(npy_bool), { 0 }, 0, IS_UNSIGNED(npy_bool) ? 'U' : 'I', IS_UNSIGNED(npy_bool), 0 };
-#define __Pyx_MODULE_NAME "src.screening.utils"
-extern int __pyx_module_is_main_src__screening__utils;
-int __pyx_module_is_main_src__screening__utils = 0;
+#define __Pyx_MODULE_NAME "slopescreening.screening.utils"
+extern int __pyx_module_is_main_slopescreening__screening__utils;
+int __pyx_module_is_main_slopescreening__screening__utils = 0;
 
-/* Implementation of 'src.screening.utils' */
+/* Implementation of 'slopescreening.screening.utils' */
 static PyObject *__pyx_builtin_range;
 static PyObject *__pyx_builtin_ImportError;
 static const char __pyx_k_k[] = "k";
@@ -1768,11 +1903,11 @@ static const char __pyx_k_vec_kappa_q[] = "vec_kappa_q";
 static const char __pyx_k_gap_kappa_test[] = "gap_kappa_test";
 static const char __pyx_k_vec_cumsum_gammas[] = "vec_cumsum_gammas";
 static const char __pyx_k_cline_in_traceback[] = "cline_in_traceback";
-static const char __pyx_k_src_screening_utils[] = "src.screening.utils";
 static const char __pyx_k_GAP_Ptest_mixed_impl[] = "GAP_Ptest_mixed_impl";
-static const char __pyx_k_src_screening_utils_pyx[] = "src/screening/utils.pyx";
+static const char __pyx_k_slopescreening_screening_utils[] = "slopescreening.screening.utils";
 static const char __pyx_k_numpy_core_multiarray_failed_to[] = "numpy.core.multiarray failed to import";
 static const char __pyx_k_numpy_core_umath_failed_to_impor[] = "numpy.core.umath failed to import";
+static const char __pyx_k_slopescreening_screening_utils_p[] = "slopescreening/screening/utils.pyx";
 static PyObject *__pyx_n_s_Atcabs;
 static PyObject *__pyx_n_s_GAP_Ptest_mixed_impl;
 static PyObject *__pyx_n_s_ImportError;
@@ -1805,8 +1940,8 @@ static PyObject *__pyx_n_s_r;
 static PyObject *__pyx_n_s_radius;
 static PyObject *__pyx_n_s_range;
 static PyObject *__pyx_n_s_sigmas;
-static PyObject *__pyx_n_s_src_screening_utils;
-static PyObject *__pyx_kp_s_src_screening_utils_pyx;
+static PyObject *__pyx_n_s_slopescreening_screening_utils;
+static PyObject *__pyx_kp_s_slopescreening_screening_utils_p;
 static PyObject *__pyx_n_s_tau;
 static PyObject *__pyx_n_s_test;
 static PyObject *__pyx_n_s_vec_cumsum_gammas;
@@ -1816,8 +1951,8 @@ static PyObject *__pyx_n_s_vec_kappa_q;
 static PyObject *__pyx_n_s_vec_q_star;
 static PyObject *__pyx_n_s_vec_r_star;
 static PyObject *__pyx_n_s_zeros;
-static PyObject *__pyx_pf_3src_9screening_5utils_GAP_Ptest_mixed_impl(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_vec_gammas, double __pyx_v_lbd, PyArrayObject *__pyx_v_Atcabs, double __pyx_v_radius, PyArrayObject *__pyx_v_index); /* proto */
-static PyObject *__pyx_pf_3src_9screening_5utils_2gap_kappa_test(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_vec_cumsum_gammas, PyArrayObject *__pyx_v_vec_kappa_q, double __pyx_v_lbd, PyArrayObject *__pyx_v_Atcabs, double __pyx_v_radius, PyArrayObject *__pyx_v_index); /* proto */
+static PyObject *__pyx_pf_14slopescreening_9screening_5utils_GAP_Ptest_mixed_impl(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_vec_gammas, double __pyx_v_lbd, PyArrayObject *__pyx_v_Atcabs, double __pyx_v_radius, PyArrayObject *__pyx_v_index); /* proto */
+static PyObject *__pyx_pf_14slopescreening_9screening_5utils_2gap_kappa_test(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_vec_cumsum_gammas, PyArrayObject *__pyx_v_vec_kappa_q, double __pyx_v_lbd, PyArrayObject *__pyx_v_Atcabs, double __pyx_v_radius, PyArrayObject *__pyx_v_index); /* proto */
 static PyObject *__pyx_int_1;
 static PyObject *__pyx_int_neg_1;
 static PyObject *__pyx_slice_;
@@ -1831,7 +1966,7 @@ static PyObject *__pyx_codeobj__7;
 static PyObject *__pyx_codeobj__9;
 /* Late includes */
 
-/* "src/screening/utils.pyx":18
+/* "slopescreening/screening/utils.pyx":18
  * @cython.boundscheck(False) # turn off bounds-checking for entire function
  * @cython.wraparound(False)  # turn off negative index wrapping for entire function
  * def GAP_Ptest_mixed_impl(             # <<<<<<<<<<<<<<
@@ -1840,9 +1975,9 @@ static PyObject *__pyx_codeobj__9;
  */
 
 /* Python wrapper */
-static PyObject *__pyx_pw_3src_9screening_5utils_1GAP_Ptest_mixed_impl(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static PyMethodDef __pyx_mdef_3src_9screening_5utils_1GAP_Ptest_mixed_impl = {"GAP_Ptest_mixed_impl", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_pw_3src_9screening_5utils_1GAP_Ptest_mixed_impl, METH_VARARGS|METH_KEYWORDS, 0};
-static PyObject *__pyx_pw_3src_9screening_5utils_1GAP_Ptest_mixed_impl(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+static PyObject *__pyx_pw_14slopescreening_9screening_5utils_1GAP_Ptest_mixed_impl(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static PyMethodDef __pyx_mdef_14slopescreening_9screening_5utils_1GAP_Ptest_mixed_impl = {"GAP_Ptest_mixed_impl", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_pw_14slopescreening_9screening_5utils_1GAP_Ptest_mixed_impl, METH_VARARGS|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_14slopescreening_9screening_5utils_1GAP_Ptest_mixed_impl(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
   PyArrayObject *__pyx_v_vec_gammas = 0;
   double __pyx_v_lbd;
   PyArrayObject *__pyx_v_Atcabs = 0;
@@ -1926,14 +2061,14 @@ static PyObject *__pyx_pw_3src_9screening_5utils_1GAP_Ptest_mixed_impl(PyObject
   __pyx_L5_argtuple_error:;
   __Pyx_RaiseArgtupleInvalid("GAP_Ptest_mixed_impl", 1, 5, 5, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 18, __pyx_L3_error)
   __pyx_L3_error:;
-  __Pyx_AddTraceback("src.screening.utils.GAP_Ptest_mixed_impl", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_AddTraceback("slopescreening.screening.utils.GAP_Ptest_mixed_impl", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __Pyx_RefNannyFinishContext();
   return NULL;
   __pyx_L4_argument_unpacking_done:;
   if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_vec_gammas), __pyx_ptype_5numpy_ndarray, 1, "vec_gammas", 0))) __PYX_ERR(0, 20, __pyx_L1_error)
   if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_Atcabs), __pyx_ptype_5numpy_ndarray, 1, "Atcabs", 0))) __PYX_ERR(0, 22, __pyx_L1_error)
   if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_index), __pyx_ptype_5numpy_ndarray, 1, "index", 0))) __PYX_ERR(0, 24, __pyx_L1_error)
-  __pyx_r = __pyx_pf_3src_9screening_5utils_GAP_Ptest_mixed_impl(__pyx_self, __pyx_v_vec_gammas, __pyx_v_lbd, __pyx_v_Atcabs, __pyx_v_radius, __pyx_v_index);
+  __pyx_r = __pyx_pf_14slopescreening_9screening_5utils_GAP_Ptest_mixed_impl(__pyx_self, __pyx_v_vec_gammas, __pyx_v_lbd, __pyx_v_Atcabs, __pyx_v_radius, __pyx_v_index);
 
   /* function exit code */
   goto __pyx_L0;
@@ -1944,12 +2079,12 @@ static PyObject *__pyx_pw_3src_9screening_5utils_1GAP_Ptest_mixed_impl(PyObject
   return __pyx_r;
 }
 
-static PyObject *__pyx_pf_3src_9screening_5utils_GAP_Ptest_mixed_impl(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_vec_gammas, double __pyx_v_lbd, PyArrayObject *__pyx_v_Atcabs, double __pyx_v_radius, PyArrayObject *__pyx_v_index) {
+static PyObject *__pyx_pf_14slopescreening_9screening_5utils_GAP_Ptest_mixed_impl(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_vec_gammas, double __pyx_v_lbd, PyArrayObject *__pyx_v_Atcabs, double __pyx_v_radius, PyArrayObject *__pyx_v_index) {
   int __pyx_v_n;
   int __pyx_v_k;
   int __pyx_v_q;
   int __pyx_v_r;
-  __pyx_t_3src_9screening_5utils_bool_t __pyx_v_bool_exit;
+  __pyx_t_14slopescreening_9screening_5utils_bool_t __pyx_v_bool_exit;
   double __pyx_v_tau;
   PyArrayObject *__pyx_v_vec_q_star = 0;
   PyArrayObject *__pyx_v_vec_r_star = 0;
@@ -2038,7 +2173,7 @@ static PyObject *__pyx_pf_3src_9screening_5utils_GAP_Ptest_mixed_impl(CYTHON_UNU
   }
   __pyx_pybuffernd_index.diminfo[0].strides = __pyx_pybuffernd_index.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_index.diminfo[0].shape = __pyx_pybuffernd_index.rcbuffer->pybuffer.shape[0];
 
-  /* "src/screening/utils.pyx":27
+  /* "slopescreening/screening/utils.pyx":27
  *     ):
  * 
  *     cdef int n = Atcabs.shape[0]             # <<<<<<<<<<<<<<
@@ -2047,7 +2182,7 @@ static PyObject *__pyx_pf_3src_9screening_5utils_GAP_Ptest_mixed_impl(CYTHON_UNU
  */
   __pyx_v_n = (__pyx_v_Atcabs->dimensions[0]);
 
-  /* "src/screening/utils.pyx":29
+  /* "slopescreening/screening/utils.pyx":29
  *     cdef int n = Atcabs.shape[0]
  *     cdef int k, q, r
  *     cdef bool_t bool_exit = False             # <<<<<<<<<<<<<<
@@ -2056,7 +2191,7 @@ static PyObject *__pyx_pf_3src_9screening_5utils_GAP_Ptest_mixed_impl(CYTHON_UNU
  */
   __pyx_v_bool_exit = 0;
 
-  /* "src/screening/utils.pyx":30
+  /* "slopescreening/screening/utils.pyx":30
  *     cdef int k, q, r
  *     cdef bool_t bool_exit = False
  *     cdef double tau = 0             # <<<<<<<<<<<<<<
@@ -2065,7 +2200,7 @@ static PyObject *__pyx_pf_3src_9screening_5utils_GAP_Ptest_mixed_impl(CYTHON_UNU
  */
   __pyx_v_tau = 0.0;
 
-  /* "src/screening/utils.pyx":33
+  /* "slopescreening/screening/utils.pyx":33
  * 
  *     # arange because I want entries 0, 1 being 0 and 1!
  *     cdef np.ndarray[np.int_t, ndim=1] vec_q_star = np.arange(n+1, dtype=np.int)             # <<<<<<<<<<<<<<
@@ -2112,7 +2247,7 @@ static PyObject *__pyx_pf_3src_9screening_5utils_GAP_Ptest_mixed_impl(CYTHON_UNU
   __pyx_v_vec_q_star = ((PyArrayObject *)__pyx_t_5);
   __pyx_t_5 = 0;
 
-  /* "src/screening/utils.pyx":34
+  /* "slopescreening/screening/utils.pyx":34
  *     # arange because I want entries 0, 1 being 0 and 1!
  *     cdef np.ndarray[np.int_t, ndim=1] vec_q_star = np.arange(n+1, dtype=np.int)
  *     cdef np.ndarray[np.int_t, ndim=1] vec_r_star = np.arange(n+1, dtype=np.int)             # <<<<<<<<<<<<<<
@@ -2159,7 +2294,7 @@ static PyObject *__pyx_pf_3src_9screening_5utils_GAP_Ptest_mixed_impl(CYTHON_UNU
   __pyx_v_vec_r_star = ((PyArrayObject *)__pyx_t_4);
   __pyx_t_4 = 0;
 
-  /* "src/screening/utils.pyx":37
+  /* "slopescreening/screening/utils.pyx":37
  * 
  *     # Sortie
  *     cdef np.ndarray[np.npy_bool, ndim=1] calI_screen = np.zeros(n, dtype=np.bool)             # <<<<<<<<<<<<<<
@@ -2206,7 +2341,7 @@ static PyObject *__pyx_pf_3src_9screening_5utils_GAP_Ptest_mixed_impl(CYTHON_UNU
   __pyx_v_calI_screen = ((PyArrayObject *)__pyx_t_2);
   __pyx_t_2 = 0;
 
-  /* "src/screening/utils.pyx":40
+  /* "slopescreening/screening/utils.pyx":40
  * 
  *     # 2. Precomputing quantities
  *     cdef np.ndarray[np.npy_double, ndim=1] vec_f = np.cumsum(             # <<<<<<<<<<<<<<
@@ -2219,7 +2354,7 @@ static PyObject *__pyx_pf_3src_9screening_5utils_GAP_Ptest_mixed_impl(CYTHON_UNU
   __Pyx_GOTREF(__pyx_t_3);
   __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
 
-  /* "src/screening/utils.pyx":41
+  /* "slopescreening/screening/utils.pyx":41
  *     # 2. Precomputing quantities
  *     cdef np.ndarray[np.npy_double, ndim=1] vec_f = np.cumsum(
  *         lbd * vec_gammas[::-1] - Atcabs[index[::-1]] - radius             # <<<<<<<<<<<<<<
@@ -2266,7 +2401,7 @@ static PyObject *__pyx_pf_3src_9screening_5utils_GAP_Ptest_mixed_impl(CYTHON_UNU
   __Pyx_GOTREF(__pyx_t_2);
   __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
 
-  /* "src/screening/utils.pyx":42
+  /* "slopescreening/screening/utils.pyx":42
  *     cdef np.ndarray[np.npy_double, ndim=1] vec_f = np.cumsum(
  *         lbd * vec_gammas[::-1] - Atcabs[index[::-1]] - radius
  *     )[::-1]             # <<<<<<<<<<<<<<
@@ -2290,7 +2425,7 @@ static PyObject *__pyx_pf_3src_9screening_5utils_GAP_Ptest_mixed_impl(CYTHON_UNU
   __pyx_v_vec_f = ((PyArrayObject *)__pyx_t_3);
   __pyx_t_3 = 0;
 
-  /* "src/screening/utils.pyx":44
+  /* "slopescreening/screening/utils.pyx":44
  *     )[::-1]
  * 
  *     for k in range(2, n+1):             # <<<<<<<<<<<<<<
@@ -2302,7 +2437,7 @@ static PyObject *__pyx_pf_3src_9screening_5utils_GAP_Ptest_mixed_impl(CYTHON_UNU
   for (__pyx_t_12 = 2; __pyx_t_12 < __pyx_t_11; __pyx_t_12+=1) {
     __pyx_v_k = __pyx_t_12;
 
-    /* "src/screening/utils.pyx":47
+    /* "slopescreening/screening/utils.pyx":47
  *         #+1 is to match paper index
  *         vec_q_star[k] = k \
  *             if vec_f[k-1] - vec_f[k-2]  >  lbd * (vec_gammas[k-1] - vec_gammas[k-2]) \             # <<<<<<<<<<<<<<
@@ -2315,7 +2450,7 @@ static PyObject *__pyx_pf_3src_9screening_5utils_GAP_Ptest_mixed_impl(CYTHON_UNU
     __pyx_t_17 = (__pyx_v_k - 2);
     if (((((*__Pyx_BufPtrStrided1d(npy_double *, __pyx_pybuffernd_vec_f.rcbuffer->pybuffer.buf, __pyx_t_14, __pyx_pybuffernd_vec_f.diminfo[0].strides)) - (*__Pyx_BufPtrStrided1d(npy_double *, __pyx_pybuffernd_vec_f.rcbuffer->pybuffer.buf, __pyx_t_15, __pyx_pybuffernd_vec_f.diminfo[0].strides))) > (__pyx_v_lbd * ((*__Pyx_BufPtrStrided1d(npy_double *, __pyx_pybuffernd_vec_gammas.rcbuffer->pybuffer.buf, __pyx_t_16, __pyx_pybuffernd_vec_gammas.diminfo[0].strides)) - (*__Pyx_BufPtrStrided1d(npy_double *, __pyx_pybuffernd_vec_gammas.rcbuffer->pybuffer.buf, __pyx_t_17, __pyx_pybuffernd_vec_gammas.diminfo[0].strides))))) != 0)) {
 
-      /* "src/screening/utils.pyx":46
+      /* "slopescreening/screening/utils.pyx":46
  *     for k in range(2, n+1):
  *         #+1 is to match paper index
  *         vec_q_star[k] = k \             # <<<<<<<<<<<<<<
@@ -2325,7 +2460,7 @@ static PyObject *__pyx_pf_3src_9screening_5utils_GAP_Ptest_mixed_impl(CYTHON_UNU
       __pyx_t_13 = __pyx_v_k;
     } else {
 
-      /* "src/screening/utils.pyx":48
+      /* "slopescreening/screening/utils.pyx":48
  *         vec_q_star[k] = k \
  *             if vec_f[k-1] - vec_f[k-2]  >  lbd * (vec_gammas[k-1] - vec_gammas[k-2]) \
  *             else vec_q_star[k-1]             # <<<<<<<<<<<<<<
@@ -2336,7 +2471,7 @@ static PyObject *__pyx_pf_3src_9screening_5utils_GAP_Ptest_mixed_impl(CYTHON_UNU
       __pyx_t_13 = (*__Pyx_BufPtrStrided1d(__pyx_t_5numpy_int_t *, __pyx_pybuffernd_vec_q_star.rcbuffer->pybuffer.buf, __pyx_t_18, __pyx_pybuffernd_vec_q_star.diminfo[0].strides));
     }
 
-    /* "src/screening/utils.pyx":46
+    /* "slopescreening/screening/utils.pyx":46
  *     for k in range(2, n+1):
  *         #+1 is to match paper index
  *         vec_q_star[k] = k \             # <<<<<<<<<<<<<<
@@ -2346,7 +2481,7 @@ static PyObject *__pyx_pf_3src_9screening_5utils_GAP_Ptest_mixed_impl(CYTHON_UNU
     __pyx_t_17 = __pyx_v_k;
     *__Pyx_BufPtrStrided1d(__pyx_t_5numpy_int_t *, __pyx_pybuffernd_vec_q_star.rcbuffer->pybuffer.buf, __pyx_t_17, __pyx_pybuffernd_vec_q_star.diminfo[0].strides) = __pyx_t_13;
 
-    /* "src/screening/utils.pyx":51
+    /* "slopescreening/screening/utils.pyx":51
  * 
  *         vec_r_star[k] = k \
  *             if vec_f[k-1] >  vec_f[k-2] \             # <<<<<<<<<<<<<<
@@ -2357,7 +2492,7 @@ static PyObject *__pyx_pf_3src_9screening_5utils_GAP_Ptest_mixed_impl(CYTHON_UNU
     __pyx_t_16 = (__pyx_v_k - 2);
     if ((((*__Pyx_BufPtrStrided1d(npy_double *, __pyx_pybuffernd_vec_f.rcbuffer->pybuffer.buf, __pyx_t_17, __pyx_pybuffernd_vec_f.diminfo[0].strides)) > (*__Pyx_BufPtrStrided1d(npy_double *, __pyx_pybuffernd_vec_f.rcbuffer->pybuffer.buf, __pyx_t_16, __pyx_pybuffernd_vec_f.diminfo[0].strides))) != 0)) {
 
-      /* "src/screening/utils.pyx":50
+      /* "slopescreening/screening/utils.pyx":50
  *             else vec_q_star[k-1]
  * 
  *         vec_r_star[k] = k \             # <<<<<<<<<<<<<<
@@ -2367,7 +2502,7 @@ static PyObject *__pyx_pf_3src_9screening_5utils_GAP_Ptest_mixed_impl(CYTHON_UNU
       __pyx_t_13 = __pyx_v_k;
     } else {
 
-      /* "src/screening/utils.pyx":52
+      /* "slopescreening/screening/utils.pyx":52
  *         vec_r_star[k] = k \
  *             if vec_f[k-1] >  vec_f[k-2] \
  *             else vec_r_star[k-1]             # <<<<<<<<<<<<<<
@@ -2378,7 +2513,7 @@ static PyObject *__pyx_pf_3src_9screening_5utils_GAP_Ptest_mixed_impl(CYTHON_UNU
       __pyx_t_13 = (*__Pyx_BufPtrStrided1d(__pyx_t_5numpy_int_t *, __pyx_pybuffernd_vec_r_star.rcbuffer->pybuffer.buf, __pyx_t_15, __pyx_pybuffernd_vec_r_star.diminfo[0].strides));
     }
 
-    /* "src/screening/utils.pyx":50
+    /* "slopescreening/screening/utils.pyx":50
  *             else vec_q_star[k-1]
  * 
  *         vec_r_star[k] = k \             # <<<<<<<<<<<<<<
@@ -2389,7 +2524,7 @@ static PyObject *__pyx_pf_3src_9screening_5utils_GAP_Ptest_mixed_impl(CYTHON_UNU
     *__Pyx_BufPtrStrided1d(__pyx_t_5numpy_int_t *, __pyx_pybuffernd_vec_r_star.rcbuffer->pybuffer.buf, __pyx_t_16, __pyx_pybuffernd_vec_r_star.diminfo[0].strides) = __pyx_t_13;
   }
 
-  /* "src/screening/utils.pyx":55
+  /* "slopescreening/screening/utils.pyx":55
  * 
  *     # 3. Tests
  *     for k in range(n, 0, -1):             # <<<<<<<<<<<<<<
@@ -2399,7 +2534,7 @@ static PyObject *__pyx_pf_3src_9screening_5utils_GAP_Ptest_mixed_impl(CYTHON_UNU
   for (__pyx_t_12 = __pyx_v_n; __pyx_t_12 > 0; __pyx_t_12-=1) {
     __pyx_v_k = __pyx_t_12;
 
-    /* "src/screening/utils.pyx":56
+    /* "slopescreening/screening/utils.pyx":56
  *     # 3. Tests
  *     for k in range(n, 0, -1):
  *         q = vec_q_star[k]             # <<<<<<<<<<<<<<
@@ -2409,7 +2544,7 @@ static PyObject *__pyx_pf_3src_9screening_5utils_GAP_Ptest_mixed_impl(CYTHON_UNU
     __pyx_t_16 = __pyx_v_k;
     __pyx_v_q = (*__Pyx_BufPtrStrided1d(__pyx_t_5numpy_int_t *, __pyx_pybuffernd_vec_q_star.rcbuffer->pybuffer.buf, __pyx_t_16, __pyx_pybuffernd_vec_q_star.diminfo[0].strides));
 
-    /* "src/screening/utils.pyx":57
+    /* "slopescreening/screening/utils.pyx":57
  *     for k in range(n, 0, -1):
  *         q = vec_q_star[k]
  *         while q >= 1:             # <<<<<<<<<<<<<<
@@ -2420,7 +2555,7 @@ static PyObject *__pyx_pf_3src_9screening_5utils_GAP_Ptest_mixed_impl(CYTHON_UNU
       __pyx_t_19 = ((__pyx_v_q >= 1) != 0);
       if (!__pyx_t_19) break;
 
-      /* "src/screening/utils.pyx":59
+      /* "slopescreening/screening/utils.pyx":59
  *         while q >= 1:
  *             # Implicit definition of the best value of p given q
  *             r = vec_r_star[q]             # <<<<<<<<<<<<<<
@@ -2430,7 +2565,7 @@ static PyObject *__pyx_pf_3src_9screening_5utils_GAP_Ptest_mixed_impl(CYTHON_UNU
       __pyx_t_16 = __pyx_v_q;
       __pyx_v_r = (*__Pyx_BufPtrStrided1d(__pyx_t_5numpy_int_t *, __pyx_pybuffernd_vec_r_star.rcbuffer->pybuffer.buf, __pyx_t_16, __pyx_pybuffernd_vec_r_star.diminfo[0].strides));
 
-      /* "src/screening/utils.pyx":62
+      /* "slopescreening/screening/utils.pyx":62
  * 
  *             # Evaluation of the threshold
  *             tau = vec_f[r-1] - vec_f[q-1] + (lbd * vec_gammas[q-1] - radius)             # <<<<<<<<<<<<<<
@@ -2442,7 +2577,7 @@ static PyObject *__pyx_pf_3src_9screening_5utils_GAP_Ptest_mixed_impl(CYTHON_UNU
       __pyx_t_15 = (__pyx_v_q - 1);
       __pyx_v_tau = (((*__Pyx_BufPtrStrided1d(npy_double *, __pyx_pybuffernd_vec_f.rcbuffer->pybuffer.buf, __pyx_t_16, __pyx_pybuffernd_vec_f.diminfo[0].strides)) - (*__Pyx_BufPtrStrided1d(npy_double *, __pyx_pybuffernd_vec_f.rcbuffer->pybuffer.buf, __pyx_t_17, __pyx_pybuffernd_vec_f.diminfo[0].strides))) + ((__pyx_v_lbd * (*__Pyx_BufPtrStrided1d(npy_double *, __pyx_pybuffernd_vec_gammas.rcbuffer->pybuffer.buf, __pyx_t_15, __pyx_pybuffernd_vec_gammas.diminfo[0].strides))) - __pyx_v_radius));
 
-      /* "src/screening/utils.pyx":65
+      /* "slopescreening/screening/utils.pyx":65
  * 
  *             # Test
  *             if Atcabs[index[k-1]] >= tau:             # <<<<<<<<<<<<<<
@@ -2454,7 +2589,7 @@ static PyObject *__pyx_pf_3src_9screening_5utils_GAP_Ptest_mixed_impl(CYTHON_UNU
       __pyx_t_19 = (((*__Pyx_BufPtrStrided1d(npy_double *, __pyx_pybuffernd_Atcabs.rcbuffer->pybuffer.buf, __pyx_t_17, __pyx_pybuffernd_Atcabs.diminfo[0].strides)) >= __pyx_v_tau) != 0);
       if (__pyx_t_19) {
 
-        /* "src/screening/utils.pyx":66
+        /* "slopescreening/screening/utils.pyx":66
  *             # Test
  *             if Atcabs[index[k-1]] >= tau:
  *                 bool_exit = True             # <<<<<<<<<<<<<<
@@ -2463,7 +2598,7 @@ static PyObject *__pyx_pf_3src_9screening_5utils_GAP_Ptest_mixed_impl(CYTHON_UNU
  */
         __pyx_v_bool_exit = 1;
 
-        /* "src/screening/utils.pyx":67
+        /* "slopescreening/screening/utils.pyx":67
  *             if Atcabs[index[k-1]] >= tau:
  *                 bool_exit = True
  *                 break             # <<<<<<<<<<<<<<
@@ -2472,7 +2607,7 @@ static PyObject *__pyx_pf_3src_9screening_5utils_GAP_Ptest_mixed_impl(CYTHON_UNU
  */
         goto __pyx_L8_break;
 
-        /* "src/screening/utils.pyx":65
+        /* "slopescreening/screening/utils.pyx":65
  * 
  *             # Test
  *             if Atcabs[index[k-1]] >= tau:             # <<<<<<<<<<<<<<
@@ -2481,7 +2616,7 @@ static PyObject *__pyx_pf_3src_9screening_5utils_GAP_Ptest_mixed_impl(CYTHON_UNU
  */
       }
 
-      /* "src/screening/utils.pyx":70
+      /* "slopescreening/screening/utils.pyx":70
  * 
  *             # Next critical point
  *             q = vec_q_star[r-1]             # <<<<<<<<<<<<<<
@@ -2493,7 +2628,7 @@ static PyObject *__pyx_pf_3src_9screening_5utils_GAP_Ptest_mixed_impl(CYTHON_UNU
     }
     __pyx_L8_break:;
 
-    /* "src/screening/utils.pyx":72
+    /* "slopescreening/screening/utils.pyx":72
  *             q = vec_q_star[r-1]
  * 
  *         if bool_exit:             # <<<<<<<<<<<<<<
@@ -2503,7 +2638,7 @@ static PyObject *__pyx_pf_3src_9screening_5utils_GAP_Ptest_mixed_impl(CYTHON_UNU
     __pyx_t_19 = (__pyx_v_bool_exit != 0);
     if (__pyx_t_19) {
 
-      /* "src/screening/utils.pyx":73
+      /* "slopescreening/screening/utils.pyx":73
  * 
  *         if bool_exit:
  *             break             # <<<<<<<<<<<<<<
@@ -2512,7 +2647,7 @@ static PyObject *__pyx_pf_3src_9screening_5utils_GAP_Ptest_mixed_impl(CYTHON_UNU
  */
       goto __pyx_L6_break;
 
-      /* "src/screening/utils.pyx":72
+      /* "slopescreening/screening/utils.pyx":72
  *             q = vec_q_star[r-1]
  * 
  *         if bool_exit:             # <<<<<<<<<<<<<<
@@ -2523,7 +2658,7 @@ static PyObject *__pyx_pf_3src_9screening_5utils_GAP_Ptest_mixed_impl(CYTHON_UNU
   }
   __pyx_L6_break:;
 
-  /* "src/screening/utils.pyx":75
+  /* "slopescreening/screening/utils.pyx":75
  *             break
  * 
  *     calI_screen[index[k:]] = True             # <<<<<<<<<<<<<<
@@ -2541,7 +2676,7 @@ static PyObject *__pyx_pf_3src_9screening_5utils_GAP_Ptest_mixed_impl(CYTHON_UNU
   if (unlikely(PyObject_SetItem(((PyObject *)__pyx_v_calI_screen), __pyx_t_3, Py_True) < 0)) __PYX_ERR(0, 75, __pyx_L1_error)
   __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
 
-  /* "src/screening/utils.pyx":76
+  /* "slopescreening/screening/utils.pyx":76
  * 
  *     calI_screen[index[k:]] = True
  *     return calI_screen             # <<<<<<<<<<<<<<
@@ -2553,7 +2688,7 @@ static PyObject *__pyx_pf_3src_9screening_5utils_GAP_Ptest_mixed_impl(CYTHON_UNU
   __pyx_r = ((PyObject *)__pyx_v_calI_screen);
   goto __pyx_L0;
 
-  /* "src/screening/utils.pyx":18
+  /* "slopescreening/screening/utils.pyx":18
  * @cython.boundscheck(False) # turn off bounds-checking for entire function
  * @cython.wraparound(False)  # turn off negative index wrapping for entire function
  * def GAP_Ptest_mixed_impl(             # <<<<<<<<<<<<<<
@@ -2580,7 +2715,7 @@ static PyObject *__pyx_pf_3src_9screening_5utils_GAP_Ptest_mixed_impl(CYTHON_UNU
     __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_vec_q_star.rcbuffer->pybuffer);
     __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_vec_r_star.rcbuffer->pybuffer);
   __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);}
-  __Pyx_AddTraceback("src.screening.utils.GAP_Ptest_mixed_impl", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_AddTraceback("slopescreening.screening.utils.GAP_Ptest_mixed_impl", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __pyx_r = NULL;
   goto __pyx_L2;
   __pyx_L0:;
@@ -2601,7 +2736,7 @@ static PyObject *__pyx_pf_3src_9screening_5utils_GAP_Ptest_mixed_impl(CYTHON_UNU
   return __pyx_r;
 }
 
-/* "src/screening/utils.pyx":81
+/* "slopescreening/screening/utils.pyx":81
  * @cython.boundscheck(False) # turn off bounds-checking for entire function
  * @cython.wraparound(False)  # turn off negative index wrapping for entire function
  * def gap_kappa_test(             # <<<<<<<<<<<<<<
@@ -2610,9 +2745,9 @@ static PyObject *__pyx_pf_3src_9screening_5utils_GAP_Ptest_mixed_impl(CYTHON_UNU
  */
 
 /* Python wrapper */
-static PyObject *__pyx_pw_3src_9screening_5utils_3gap_kappa_test(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static PyMethodDef __pyx_mdef_3src_9screening_5utils_3gap_kappa_test = {"gap_kappa_test", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_pw_3src_9screening_5utils_3gap_kappa_test, METH_VARARGS|METH_KEYWORDS, 0};
-static PyObject *__pyx_pw_3src_9screening_5utils_3gap_kappa_test(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+static PyObject *__pyx_pw_14slopescreening_9screening_5utils_3gap_kappa_test(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static PyMethodDef __pyx_mdef_14slopescreening_9screening_5utils_3gap_kappa_test = {"gap_kappa_test", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_pw_14slopescreening_9screening_5utils_3gap_kappa_test, METH_VARARGS|METH_KEYWORDS, 0};
+static PyObject *__pyx_pw_14slopescreening_9screening_5utils_3gap_kappa_test(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
   PyArrayObject *__pyx_v_vec_cumsum_gammas = 0;
   PyArrayObject *__pyx_v_vec_kappa_q = 0;
   double __pyx_v_lbd;
@@ -2707,7 +2842,7 @@ static PyObject *__pyx_pw_3src_9screening_5utils_3gap_kappa_test(PyObject *__pyx
   __pyx_L5_argtuple_error:;
   __Pyx_RaiseArgtupleInvalid("gap_kappa_test", 1, 6, 6, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 81, __pyx_L3_error)
   __pyx_L3_error:;
-  __Pyx_AddTraceback("src.screening.utils.gap_kappa_test", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_AddTraceback("slopescreening.screening.utils.gap_kappa_test", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __Pyx_RefNannyFinishContext();
   return NULL;
   __pyx_L4_argument_unpacking_done:;
@@ -2715,7 +2850,7 @@ static PyObject *__pyx_pw_3src_9screening_5utils_3gap_kappa_test(PyObject *__pyx
   if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_vec_kappa_q), __pyx_ptype_5numpy_ndarray, 1, "vec_kappa_q", 0))) __PYX_ERR(0, 83, __pyx_L1_error)
   if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_Atcabs), __pyx_ptype_5numpy_ndarray, 1, "Atcabs", 0))) __PYX_ERR(0, 85, __pyx_L1_error)
   if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_index), __pyx_ptype_5numpy_ndarray, 1, "index", 0))) __PYX_ERR(0, 87, __pyx_L1_error)
-  __pyx_r = __pyx_pf_3src_9screening_5utils_2gap_kappa_test(__pyx_self, __pyx_v_vec_cumsum_gammas, __pyx_v_vec_kappa_q, __pyx_v_lbd, __pyx_v_Atcabs, __pyx_v_radius, __pyx_v_index);
+  __pyx_r = __pyx_pf_14slopescreening_9screening_5utils_2gap_kappa_test(__pyx_self, __pyx_v_vec_cumsum_gammas, __pyx_v_vec_kappa_q, __pyx_v_lbd, __pyx_v_Atcabs, __pyx_v_radius, __pyx_v_index);
 
   /* function exit code */
   goto __pyx_L0;
@@ -2726,7 +2861,7 @@ static PyObject *__pyx_pw_3src_9screening_5utils_3gap_kappa_test(PyObject *__pyx
   return __pyx_r;
 }
 
-static PyObject *__pyx_pf_3src_9screening_5utils_2gap_kappa_test(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_vec_cumsum_gammas, PyArrayObject *__pyx_v_vec_kappa_q, double __pyx_v_lbd, PyArrayObject *__pyx_v_Atcabs, double __pyx_v_radius, PyArrayObject *__pyx_v_index) {
+static PyObject *__pyx_pf_14slopescreening_9screening_5utils_2gap_kappa_test(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_vec_cumsum_gammas, PyArrayObject *__pyx_v_vec_kappa_q, double __pyx_v_lbd, PyArrayObject *__pyx_v_Atcabs, double __pyx_v_radius, PyArrayObject *__pyx_v_index) {
   int __pyx_v_n;
   int __pyx_v_q;
   int __pyx_v_l_q;
@@ -2813,7 +2948,7 @@ static PyObject *__pyx_pf_3src_9screening_5utils_2gap_kappa_test(CYTHON_UNUSED P
   }
   __pyx_pybuffernd_index.diminfo[0].strides = __pyx_pybuffernd_index.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_index.diminfo[0].shape = __pyx_pybuffernd_index.rcbuffer->pybuffer.shape[0];
 
-  /* "src/screening/utils.pyx":90
+  /* "slopescreening/screening/utils.pyx":90
  *     ):
  * 
  *     cdef int n = Atcabs.shape[0]             # <<<<<<<<<<<<<<
@@ -2822,7 +2957,7 @@ static PyObject *__pyx_pf_3src_9screening_5utils_2gap_kappa_test(CYTHON_UNUSED P
  */
   __pyx_v_n = (__pyx_v_Atcabs->dimensions[0]);
 
-  /* "src/screening/utils.pyx":92
+  /* "slopescreening/screening/utils.pyx":92
  *     cdef int n = Atcabs.shape[0]
  *     cdef int q, l_q
  *     cdef int l_min = 0             # <<<<<<<<<<<<<<
@@ -2831,7 +2966,7 @@ static PyObject *__pyx_pf_3src_9screening_5utils_2gap_kappa_test(CYTHON_UNUSED P
  */
   __pyx_v_l_min = 0;
 
-  /* "src/screening/utils.pyx":96
+  /* "slopescreening/screening/utils.pyx":96
  * 
  *     # Sortie
  *     cdef np.ndarray[np.npy_bool, ndim=1] calI_screen = np.zeros(n, dtype=np.bool)             # <<<<<<<<<<<<<<
@@ -2878,7 +3013,7 @@ static PyObject *__pyx_pf_3src_9screening_5utils_2gap_kappa_test(CYTHON_UNUSED P
   __pyx_v_calI_screen = ((PyArrayObject *)__pyx_t_5);
   __pyx_t_5 = 0;
 
-  /* "src/screening/utils.pyx":99
+  /* "slopescreening/screening/utils.pyx":99
  * 
  *         # Cdric' notations compliant
  *     cdef np.ndarray[np.npy_double, ndim=1] sigmas = np.zeros(n)             # <<<<<<<<<<<<<<
@@ -2922,7 +3057,7 @@ static PyObject *__pyx_pf_3src_9screening_5utils_2gap_kappa_test(CYTHON_UNUSED P
   __pyx_v_sigmas = ((PyArrayObject *)__pyx_t_5);
   __pyx_t_5 = 0;
 
-  /* "src/screening/utils.pyx":100
+  /* "slopescreening/screening/utils.pyx":100
  *         # Cdric' notations compliant
  *     cdef np.ndarray[np.npy_double, ndim=1] sigmas = np.zeros(n)
  *     sigmas[1:] = np.cumsum(Atcabs[index[:-1]])             # <<<<<<<<<<<<<<
@@ -2958,7 +3093,7 @@ static PyObject *__pyx_pf_3src_9screening_5utils_2gap_kappa_test(CYTHON_UNUSED P
   if (unlikely(PyObject_SetItem(((PyObject *)__pyx_v_sigmas), __pyx_slice__3, __pyx_t_5) < 0)) __PYX_ERR(0, 100, __pyx_L1_error)
   __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
 
-  /* "src/screening/utils.pyx":102
+  /* "slopescreening/screening/utils.pyx":102
  *     sigmas[1:] = np.cumsum(Atcabs[index[:-1]])
  * 
  *     for q in range(n-1, -1, -1):             # <<<<<<<<<<<<<<
@@ -2968,7 +3103,7 @@ static PyObject *__pyx_pf_3src_9screening_5utils_2gap_kappa_test(CYTHON_UNUSED P
   for (__pyx_t_8 = (__pyx_v_n - 1); __pyx_t_8 > -1; __pyx_t_8-=1) {
     __pyx_v_q = __pyx_t_8;
 
-    /* "src/screening/utils.pyx":103
+    /* "slopescreening/screening/utils.pyx":103
  * 
  *     for q in range(n-1, -1, -1):
  *         bound = lbd * vec_cumsum_gammas[q] - vec_kappa_q[q] * radius - sigmas[q]             # <<<<<<<<<<<<<<
@@ -2980,7 +3115,7 @@ static PyObject *__pyx_pf_3src_9screening_5utils_2gap_kappa_test(CYTHON_UNUSED P
     __pyx_t_11 = __pyx_v_q;
     __pyx_v_bound = (((__pyx_v_lbd * (*__Pyx_BufPtrStrided1d(npy_double *, __pyx_pybuffernd_vec_cumsum_gammas.rcbuffer->pybuffer.buf, __pyx_t_9, __pyx_pybuffernd_vec_cumsum_gammas.diminfo[0].strides))) - ((*__Pyx_BufPtrStrided1d(npy_double *, __pyx_pybuffernd_vec_kappa_q.rcbuffer->pybuffer.buf, __pyx_t_10, __pyx_pybuffernd_vec_kappa_q.diminfo[0].strides)) * __pyx_v_radius)) - (*__Pyx_BufPtrStrided1d(npy_double *, __pyx_pybuffernd_sigmas.rcbuffer->pybuffer.buf, __pyx_t_11, __pyx_pybuffernd_sigmas.diminfo[0].strides)));
 
-    /* "src/screening/utils.pyx":105
+    /* "slopescreening/screening/utils.pyx":105
  *         bound = lbd * vec_cumsum_gammas[q] - vec_kappa_q[q] * radius - sigmas[q]
  * 
  *         if Atcabs[index[q]] < bound:             # <<<<<<<<<<<<<<
@@ -2992,7 +3127,7 @@ static PyObject *__pyx_pf_3src_9screening_5utils_2gap_kappa_test(CYTHON_UNUSED P
     __pyx_t_12 = (((*__Pyx_BufPtrStrided1d(npy_double *, __pyx_pybuffernd_Atcabs.rcbuffer->pybuffer.buf, __pyx_t_10, __pyx_pybuffernd_Atcabs.diminfo[0].strides)) < __pyx_v_bound) != 0);
     if (__pyx_t_12) {
 
-      /* "src/screening/utils.pyx":106
+      /* "slopescreening/screening/utils.pyx":106
  * 
  *         if Atcabs[index[q]] < bound:
  *             l_q = 0             # <<<<<<<<<<<<<<
@@ -3001,7 +3136,7 @@ static PyObject *__pyx_pf_3src_9screening_5utils_2gap_kappa_test(CYTHON_UNUSED P
  */
       __pyx_v_l_q = 0;
 
-      /* "src/screening/utils.pyx":105
+      /* "slopescreening/screening/utils.pyx":105
  *         bound = lbd * vec_cumsum_gammas[q] - vec_kappa_q[q] * radius - sigmas[q]
  * 
  *         if Atcabs[index[q]] < bound:             # <<<<<<<<<<<<<<
@@ -3011,7 +3146,7 @@ static PyObject *__pyx_pf_3src_9screening_5utils_2gap_kappa_test(CYTHON_UNUSED P
       goto __pyx_L5;
     }
 
-    /* "src/screening/utils.pyx":107
+    /* "slopescreening/screening/utils.pyx":107
  *         if Atcabs[index[q]] < bound:
  *             l_q = 0
  *         elif Atcabs[index[n-1]] >= bound:             # <<<<<<<<<<<<<<
@@ -3023,7 +3158,7 @@ static PyObject *__pyx_pf_3src_9screening_5utils_2gap_kappa_test(CYTHON_UNUSED P
     __pyx_t_12 = (((*__Pyx_BufPtrStrided1d(npy_double *, __pyx_pybuffernd_Atcabs.rcbuffer->pybuffer.buf, __pyx_t_10, __pyx_pybuffernd_Atcabs.diminfo[0].strides)) >= __pyx_v_bound) != 0);
     if (__pyx_t_12) {
 
-      /* "src/screening/utils.pyx":108
+      /* "slopescreening/screening/utils.pyx":108
  *             l_q = 0
  *         elif Atcabs[index[n-1]] >= bound:
  *             return calI_screen             # <<<<<<<<<<<<<<
@@ -3035,7 +3170,7 @@ static PyObject *__pyx_pf_3src_9screening_5utils_2gap_kappa_test(CYTHON_UNUSED P
       __pyx_r = ((PyObject *)__pyx_v_calI_screen);
       goto __pyx_L0;
 
-      /* "src/screening/utils.pyx":107
+      /* "slopescreening/screening/utils.pyx":107
  *         if Atcabs[index[q]] < bound:
  *             l_q = 0
  *         elif Atcabs[index[n-1]] >= bound:             # <<<<<<<<<<<<<<
@@ -3044,7 +3179,7 @@ static PyObject *__pyx_pf_3src_9screening_5utils_2gap_kappa_test(CYTHON_UNUSED P
  */
     }
 
-    /* "src/screening/utils.pyx":110
+    /* "slopescreening/screening/utils.pyx":110
  *             return calI_screen
  *         else:
  *             l_q = q + np.argmax(Atcabs[index[q:]] < bound)             # <<<<<<<<<<<<<<
@@ -3101,7 +3236,7 @@ static PyObject *__pyx_pf_3src_9screening_5utils_2gap_kappa_test(CYTHON_UNUSED P
     }
     __pyx_L5:;
 
-    /* "src/screening/utils.pyx":112
+    /* "slopescreening/screening/utils.pyx":112
  *             l_q = q + np.argmax(Atcabs[index[q:]] < bound)
  * 
  *         l_min = max(l_min, l_q)             # <<<<<<<<<<<<<<
@@ -3118,7 +3253,7 @@ static PyObject *__pyx_pf_3src_9screening_5utils_2gap_kappa_test(CYTHON_UNUSED P
     __pyx_v_l_min = __pyx_t_16;
   }
 
-  /* "src/screening/utils.pyx":114
+  /* "slopescreening/screening/utils.pyx":114
  *         l_min = max(l_min, l_q)
  * 
  *     calI_screen[index[l_min:]] = True             # <<<<<<<<<<<<<<
@@ -3135,7 +3270,7 @@ static PyObject *__pyx_pf_3src_9screening_5utils_2gap_kappa_test(CYTHON_UNUSED P
   if (unlikely(PyObject_SetItem(((PyObject *)__pyx_v_calI_screen), __pyx_t_3, Py_True) < 0)) __PYX_ERR(0, 114, __pyx_L1_error)
   __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
 
-  /* "src/screening/utils.pyx":115
+  /* "slopescreening/screening/utils.pyx":115
  * 
  *     calI_screen[index[l_min:]] = True
  *     return calI_screen             # <<<<<<<<<<<<<<
@@ -3145,7 +3280,7 @@ static PyObject *__pyx_pf_3src_9screening_5utils_2gap_kappa_test(CYTHON_UNUSED P
   __pyx_r = ((PyObject *)__pyx_v_calI_screen);
   goto __pyx_L0;
 
-  /* "src/screening/utils.pyx":81
+  /* "slopescreening/screening/utils.pyx":81
  * @cython.boundscheck(False) # turn off bounds-checking for entire function
  * @cython.wraparound(False)  # turn off negative index wrapping for entire function
  * def gap_kappa_test(             # <<<<<<<<<<<<<<
@@ -3172,7 +3307,7 @@ static PyObject *__pyx_pf_3src_9screening_5utils_2gap_kappa_test(CYTHON_UNUSED P
     __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_vec_cumsum_gammas.rcbuffer->pybuffer);
     __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_vec_kappa_q.rcbuffer->pybuffer);
   __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);}
-  __Pyx_AddTraceback("src.screening.utils.gap_kappa_test", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_AddTraceback("slopescreening.screening.utils.gap_kappa_test", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __pyx_r = NULL;
   goto __pyx_L2;
   __pyx_L0:;
@@ -3190,7 +3325,7 @@ static PyObject *__pyx_pf_3src_9screening_5utils_2gap_kappa_test(CYTHON_UNUSED P
   return __pyx_r;
 }
 
-/* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":735
+/* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":734
  * ctypedef npy_cdouble     complex_t
  * 
  * cdef inline object PyArray_MultiIterNew1(a):             # <<<<<<<<<<<<<<
@@ -3207,7 +3342,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew1(PyObject *__
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("PyArray_MultiIterNew1", 0);
 
-  /* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":736
+  /* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":735
  * 
  * cdef inline object PyArray_MultiIterNew1(a):
  *     return PyArray_MultiIterNew(1, <void*>a)             # <<<<<<<<<<<<<<
@@ -3215,13 +3350,13 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew1(PyObject *__
  * cdef inline object PyArray_MultiIterNew2(a, b):
  */
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyArray_MultiIterNew(1, ((void *)__pyx_v_a)); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 736, __pyx_L1_error)
+  __pyx_t_1 = PyArray_MultiIterNew(1, ((void *)__pyx_v_a)); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 735, __pyx_L1_error)
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_r = __pyx_t_1;
   __pyx_t_1 = 0;
   goto __pyx_L0;
 
-  /* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":735
+  /* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":734
  * ctypedef npy_cdouble     complex_t
  * 
  * cdef inline object PyArray_MultiIterNew1(a):             # <<<<<<<<<<<<<<
@@ -3240,7 +3375,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew1(PyObject *__
   return __pyx_r;
 }
 
-/* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":738
+/* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":737
  *     return PyArray_MultiIterNew(1, <void*>a)
  * 
  * cdef inline object PyArray_MultiIterNew2(a, b):             # <<<<<<<<<<<<<<
@@ -3257,7 +3392,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew2(PyObject *__
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("PyArray_MultiIterNew2", 0);
 
-  /* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":739
+  /* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":738
  * 
  * cdef inline object PyArray_MultiIterNew2(a, b):
  *     return PyArray_MultiIterNew(2, <void*>a, <void*>b)             # <<<<<<<<<<<<<<
@@ -3265,13 +3400,13 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew2(PyObject *__
  * cdef inline object PyArray_MultiIterNew3(a, b, c):
  */
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyArray_MultiIterNew(2, ((void *)__pyx_v_a), ((void *)__pyx_v_b)); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 739, __pyx_L1_error)
+  __pyx_t_1 = PyArray_MultiIterNew(2, ((void *)__pyx_v_a), ((void *)__pyx_v_b)); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 738, __pyx_L1_error)
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_r = __pyx_t_1;
   __pyx_t_1 = 0;
   goto __pyx_L0;
 
-  /* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":738
+  /* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":737
  *     return PyArray_MultiIterNew(1, <void*>a)
  * 
  * cdef inline object PyArray_MultiIterNew2(a, b):             # <<<<<<<<<<<<<<
@@ -3290,7 +3425,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew2(PyObject *__
   return __pyx_r;
 }
 
-/* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":741
+/* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":740
  *     return PyArray_MultiIterNew(2, <void*>a, <void*>b)
  * 
  * cdef inline object PyArray_MultiIterNew3(a, b, c):             # <<<<<<<<<<<<<<
@@ -3307,7 +3442,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew3(PyObject *__
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("PyArray_MultiIterNew3", 0);
 
-  /* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":742
+  /* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":741
  * 
  * cdef inline object PyArray_MultiIterNew3(a, b, c):
  *     return PyArray_MultiIterNew(3, <void*>a, <void*>b, <void*> c)             # <<<<<<<<<<<<<<
@@ -3315,13 +3450,13 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew3(PyObject *__
  * cdef inline object PyArray_MultiIterNew4(a, b, c, d):
  */
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyArray_MultiIterNew(3, ((void *)__pyx_v_a), ((void *)__pyx_v_b), ((void *)__pyx_v_c)); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 742, __pyx_L1_error)
+  __pyx_t_1 = PyArray_MultiIterNew(3, ((void *)__pyx_v_a), ((void *)__pyx_v_b), ((void *)__pyx_v_c)); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 741, __pyx_L1_error)
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_r = __pyx_t_1;
   __pyx_t_1 = 0;
   goto __pyx_L0;
 
-  /* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":741
+  /* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":740
  *     return PyArray_MultiIterNew(2, <void*>a, <void*>b)
  * 
  * cdef inline object PyArray_MultiIterNew3(a, b, c):             # <<<<<<<<<<<<<<
@@ -3340,7 +3475,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew3(PyObject *__
   return __pyx_r;
 }
 
-/* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":744
+/* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":743
  *     return PyArray_MultiIterNew(3, <void*>a, <void*>b, <void*> c)
  * 
  * cdef inline object PyArray_MultiIterNew4(a, b, c, d):             # <<<<<<<<<<<<<<
@@ -3357,7 +3492,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew4(PyObject *__
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("PyArray_MultiIterNew4", 0);
 
-  /* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":745
+  /* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":744
  * 
  * cdef inline object PyArray_MultiIterNew4(a, b, c, d):
  *     return PyArray_MultiIterNew(4, <void*>a, <void*>b, <void*>c, <void*> d)             # <<<<<<<<<<<<<<
@@ -3365,13 +3500,13 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew4(PyObject *__
  * cdef inline object PyArray_MultiIterNew5(a, b, c, d, e):
  */
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyArray_MultiIterNew(4, ((void *)__pyx_v_a), ((void *)__pyx_v_b), ((void *)__pyx_v_c), ((void *)__pyx_v_d)); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 745, __pyx_L1_error)
+  __pyx_t_1 = PyArray_MultiIterNew(4, ((void *)__pyx_v_a), ((void *)__pyx_v_b), ((void *)__pyx_v_c), ((void *)__pyx_v_d)); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 744, __pyx_L1_error)
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_r = __pyx_t_1;
   __pyx_t_1 = 0;
   goto __pyx_L0;
 
-  /* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":744
+  /* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":743
  *     return PyArray_MultiIterNew(3, <void*>a, <void*>b, <void*> c)
  * 
  * cdef inline object PyArray_MultiIterNew4(a, b, c, d):             # <<<<<<<<<<<<<<
@@ -3390,7 +3525,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew4(PyObject *__
   return __pyx_r;
 }
 
-/* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":747
+/* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":746
  *     return PyArray_MultiIterNew(4, <void*>a, <void*>b, <void*>c, <void*> d)
  * 
  * cdef inline object PyArray_MultiIterNew5(a, b, c, d, e):             # <<<<<<<<<<<<<<
@@ -3407,7 +3542,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew5(PyObject *__
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("PyArray_MultiIterNew5", 0);
 
-  /* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":748
+  /* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":747
  * 
  * cdef inline object PyArray_MultiIterNew5(a, b, c, d, e):
  *     return PyArray_MultiIterNew(5, <void*>a, <void*>b, <void*>c, <void*> d, <void*> e)             # <<<<<<<<<<<<<<
@@ -3415,13 +3550,13 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew5(PyObject *__
  * cdef inline tuple PyDataType_SHAPE(dtype d):
  */
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyArray_MultiIterNew(5, ((void *)__pyx_v_a), ((void *)__pyx_v_b), ((void *)__pyx_v_c), ((void *)__pyx_v_d), ((void *)__pyx_v_e)); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 748, __pyx_L1_error)
+  __pyx_t_1 = PyArray_MultiIterNew(5, ((void *)__pyx_v_a), ((void *)__pyx_v_b), ((void *)__pyx_v_c), ((void *)__pyx_v_d), ((void *)__pyx_v_e)); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 747, __pyx_L1_error)
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_r = __pyx_t_1;
   __pyx_t_1 = 0;
   goto __pyx_L0;
 
-  /* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":747
+  /* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":746
  *     return PyArray_MultiIterNew(4, <void*>a, <void*>b, <void*>c, <void*> d)
  * 
  * cdef inline object PyArray_MultiIterNew5(a, b, c, d, e):             # <<<<<<<<<<<<<<
@@ -3440,7 +3575,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew5(PyObject *__
   return __pyx_r;
 }
 
-/* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":750
+/* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":749
  *     return PyArray_MultiIterNew(5, <void*>a, <void*>b, <void*>c, <void*> d, <void*> e)
  * 
  * cdef inline tuple PyDataType_SHAPE(dtype d):             # <<<<<<<<<<<<<<
@@ -3454,7 +3589,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyDataType_SHAPE(PyArray_Descr *__
   int __pyx_t_1;
   __Pyx_RefNannySetupContext("PyDataType_SHAPE", 0);
 
-  /* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":751
+  /* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":750
  * 
  * cdef inline tuple PyDataType_SHAPE(dtype d):
  *     if PyDataType_HASSUBARRAY(d):             # <<<<<<<<<<<<<<
@@ -3464,7 +3599,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyDataType_SHAPE(PyArray_Descr *__
   __pyx_t_1 = (PyDataType_HASSUBARRAY(__pyx_v_d) != 0);
   if (__pyx_t_1) {
 
-    /* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":752
+    /* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":751
  * cdef inline tuple PyDataType_SHAPE(dtype d):
  *     if PyDataType_HASSUBARRAY(d):
  *         return <tuple>d.subarray.shape             # <<<<<<<<<<<<<<
@@ -3476,7 +3611,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyDataType_SHAPE(PyArray_Descr *__
     __pyx_r = ((PyObject*)__pyx_v_d->subarray->shape);
     goto __pyx_L0;
 
-    /* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":751
+    /* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":750
  * 
  * cdef inline tuple PyDataType_SHAPE(dtype d):
  *     if PyDataType_HASSUBARRAY(d):             # <<<<<<<<<<<<<<
@@ -3485,7 +3620,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyDataType_SHAPE(PyArray_Descr *__
  */
   }
 
-  /* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":754
+  /* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":753
  *         return <tuple>d.subarray.shape
  *     else:
  *         return ()             # <<<<<<<<<<<<<<
@@ -3499,7 +3634,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyDataType_SHAPE(PyArray_Descr *__
     goto __pyx_L0;
   }
 
-  /* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":750
+  /* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":749
  *     return PyArray_MultiIterNew(5, <void*>a, <void*>b, <void*>c, <void*> d, <void*> e)
  * 
  * cdef inline tuple PyDataType_SHAPE(dtype d):             # <<<<<<<<<<<<<<
@@ -3514,7 +3649,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyDataType_SHAPE(PyArray_Descr *__
   return __pyx_r;
 }
 
-/* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":929
+/* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":928
  *     int _import_umath() except -1
  * 
  * cdef inline void set_array_base(ndarray arr, object base):             # <<<<<<<<<<<<<<
@@ -3526,7 +3661,7 @@ static CYTHON_INLINE void __pyx_f_5numpy_set_array_base(PyArrayObject *__pyx_v_a
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("set_array_base", 0);
 
-  /* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":930
+  /* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":929
  * 
  * cdef inline void set_array_base(ndarray arr, object base):
  *     Py_INCREF(base) # important to do this before stealing the reference below!             # <<<<<<<<<<<<<<
@@ -3535,7 +3670,7 @@ static CYTHON_INLINE void __pyx_f_5numpy_set_array_base(PyArrayObject *__pyx_v_a
  */
   Py_INCREF(__pyx_v_base);
 
-  /* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":931
+  /* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":930
  * cdef inline void set_array_base(ndarray arr, object base):
  *     Py_INCREF(base) # important to do this before stealing the reference below!
  *     PyArray_SetBaseObject(arr, base)             # <<<<<<<<<<<<<<
@@ -3544,7 +3679,7 @@ static CYTHON_INLINE void __pyx_f_5numpy_set_array_base(PyArrayObject *__pyx_v_a
  */
   (void)(PyArray_SetBaseObject(__pyx_v_arr, __pyx_v_base));
 
-  /* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":929
+  /* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":928
  *     int _import_umath() except -1
  * 
  * cdef inline void set_array_base(ndarray arr, object base):             # <<<<<<<<<<<<<<
@@ -3556,7 +3691,7 @@ static CYTHON_INLINE void __pyx_f_5numpy_set_array_base(PyArrayObject *__pyx_v_a
   __Pyx_RefNannyFinishContext();
 }
 
-/* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":933
+/* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":932
  *     PyArray_SetBaseObject(arr, base)
  * 
  * cdef inline object get_array_base(ndarray arr):             # <<<<<<<<<<<<<<
@@ -3571,7 +3706,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_get_array_base(PyArrayObject *__py
   int __pyx_t_1;
   __Pyx_RefNannySetupContext("get_array_base", 0);
 
-  /* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":934
+  /* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":933
  * 
  * cdef inline object get_array_base(ndarray arr):
  *     base = PyArray_BASE(arr)             # <<<<<<<<<<<<<<
@@ -3580,7 +3715,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_get_array_base(PyArrayObject *__py
  */
   __pyx_v_base = PyArray_BASE(__pyx_v_arr);
 
-  /* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":935
+  /* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":934
  * cdef inline object get_array_base(ndarray arr):
  *     base = PyArray_BASE(arr)
  *     if base is NULL:             # <<<<<<<<<<<<<<
@@ -3590,7 +3725,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_get_array_base(PyArrayObject *__py
   __pyx_t_1 = ((__pyx_v_base == NULL) != 0);
   if (__pyx_t_1) {
 
-    /* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":936
+    /* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":935
  *     base = PyArray_BASE(arr)
  *     if base is NULL:
  *         return None             # <<<<<<<<<<<<<<
@@ -3601,7 +3736,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_get_array_base(PyArrayObject *__py
     __pyx_r = Py_None; __Pyx_INCREF(Py_None);
     goto __pyx_L0;
 
-    /* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":935
+    /* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":934
  * cdef inline object get_array_base(ndarray arr):
  *     base = PyArray_BASE(arr)
  *     if base is NULL:             # <<<<<<<<<<<<<<
@@ -3610,7 +3745,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_get_array_base(PyArrayObject *__py
  */
   }
 
-  /* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":937
+  /* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":936
  *     if base is NULL:
  *         return None
  *     return <object>base             # <<<<<<<<<<<<<<
@@ -3622,7 +3757,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_get_array_base(PyArrayObject *__py
   __pyx_r = ((PyObject *)__pyx_v_base);
   goto __pyx_L0;
 
-  /* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":933
+  /* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":932
  *     PyArray_SetBaseObject(arr, base)
  * 
  * cdef inline object get_array_base(ndarray arr):             # <<<<<<<<<<<<<<
@@ -3637,7 +3772,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_get_array_base(PyArrayObject *__py
   return __pyx_r;
 }
 
-/* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":941
+/* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":940
  * # Versions of the import_* functions which are more suitable for
  * # Cython code.
  * cdef inline int import_array() except -1:             # <<<<<<<<<<<<<<
@@ -3661,7 +3796,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_array(void) {
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("import_array", 0);
 
-  /* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":942
+  /* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":941
  * # Cython code.
  * cdef inline int import_array() except -1:
  *     try:             # <<<<<<<<<<<<<<
@@ -3677,16 +3812,16 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_array(void) {
     __Pyx_XGOTREF(__pyx_t_3);
     /*try:*/ {
 
-      /* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":943
+      /* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":942
  * cdef inline int import_array() except -1:
  *     try:
  *         __pyx_import_array()             # <<<<<<<<<<<<<<
  *     except Exception:
  *         raise ImportError("numpy.core.multiarray failed to import")
  */
-      __pyx_t_4 = _import_array(); if (unlikely(__pyx_t_4 == ((int)-1))) __PYX_ERR(1, 943, __pyx_L3_error)
+      __pyx_t_4 = _import_array(); if (unlikely(__pyx_t_4 == ((int)-1))) __PYX_ERR(1, 942, __pyx_L3_error)
 
-      /* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":942
+      /* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":941
  * # Cython code.
  * cdef inline int import_array() except -1:
  *     try:             # <<<<<<<<<<<<<<
@@ -3700,7 +3835,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_array(void) {
     goto __pyx_L8_try_end;
     __pyx_L3_error:;
 
-    /* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":944
+    /* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":943
  *     try:
  *         __pyx_import_array()
  *     except Exception:             # <<<<<<<<<<<<<<
@@ -3710,28 +3845,28 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_array(void) {
     __pyx_t_4 = __Pyx_PyErr_ExceptionMatches(((PyObject *)(&((PyTypeObject*)PyExc_Exception)[0])));
     if (__pyx_t_4) {
       __Pyx_AddTraceback("numpy.import_array", __pyx_clineno, __pyx_lineno, __pyx_filename);
-      if (__Pyx_GetException(&__pyx_t_5, &__pyx_t_6, &__pyx_t_7) < 0) __PYX_ERR(1, 944, __pyx_L5_except_error)
+      if (__Pyx_GetException(&__pyx_t_5, &__pyx_t_6, &__pyx_t_7) < 0) __PYX_ERR(1, 943, __pyx_L5_except_error)
       __Pyx_GOTREF(__pyx_t_5);
       __Pyx_GOTREF(__pyx_t_6);
       __Pyx_GOTREF(__pyx_t_7);
 
-      /* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":945
+      /* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":944
  *         __pyx_import_array()
  *     except Exception:
  *         raise ImportError("numpy.core.multiarray failed to import")             # <<<<<<<<<<<<<<
  * 
  * cdef inline int import_umath() except -1:
  */
-      __pyx_t_8 = __Pyx_PyObject_Call(__pyx_builtin_ImportError, __pyx_tuple__4, NULL); if (unlikely(!__pyx_t_8)) __PYX_ERR(1, 945, __pyx_L5_except_error)
+      __pyx_t_8 = __Pyx_PyObject_Call(__pyx_builtin_ImportError, __pyx_tuple__4, NULL); if (unlikely(!__pyx_t_8)) __PYX_ERR(1, 944, __pyx_L5_except_error)
       __Pyx_GOTREF(__pyx_t_8);
       __Pyx_Raise(__pyx_t_8, 0, 0, 0);
       __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
-      __PYX_ERR(1, 945, __pyx_L5_except_error)
+      __PYX_ERR(1, 944, __pyx_L5_except_error)
     }
     goto __pyx_L5_except_error;
     __pyx_L5_except_error:;
 
-    /* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":942
+    /* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":941
  * # Cython code.
  * cdef inline int import_array() except -1:
  *     try:             # <<<<<<<<<<<<<<
@@ -3746,7 +3881,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_array(void) {
     __pyx_L8_try_end:;
   }
 
-  /* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":941
+  /* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":940
  * # Versions of the import_* functions which are more suitable for
  * # Cython code.
  * cdef inline int import_array() except -1:             # <<<<<<<<<<<<<<
@@ -3769,7 +3904,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_array(void) {
   return __pyx_r;
 }
 
-/* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":947
+/* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":946
  *         raise ImportError("numpy.core.multiarray failed to import")
  * 
  * cdef inline int import_umath() except -1:             # <<<<<<<<<<<<<<
@@ -3793,7 +3928,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_umath(void) {
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("import_umath", 0);
 
-  /* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":948
+  /* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":947
  * 
  * cdef inline int import_umath() except -1:
  *     try:             # <<<<<<<<<<<<<<
@@ -3809,16 +3944,16 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_umath(void) {
     __Pyx_XGOTREF(__pyx_t_3);
     /*try:*/ {
 
-      /* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":949
+      /* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":948
  * cdef inline int import_umath() except -1:
  *     try:
  *         _import_umath()             # <<<<<<<<<<<<<<
  *     except Exception:
  *         raise ImportError("numpy.core.umath failed to import")
  */
-      __pyx_t_4 = _import_umath(); if (unlikely(__pyx_t_4 == ((int)-1))) __PYX_ERR(1, 949, __pyx_L3_error)
+      __pyx_t_4 = _import_umath(); if (unlikely(__pyx_t_4 == ((int)-1))) __PYX_ERR(1, 948, __pyx_L3_error)
 
-      /* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":948
+      /* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":947
  * 
  * cdef inline int import_umath() except -1:
  *     try:             # <<<<<<<<<<<<<<
@@ -3832,7 +3967,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_umath(void) {
     goto __pyx_L8_try_end;
     __pyx_L3_error:;
 
-    /* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":950
+    /* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":949
  *     try:
  *         _import_umath()
  *     except Exception:             # <<<<<<<<<<<<<<
@@ -3842,28 +3977,28 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_umath(void) {
     __pyx_t_4 = __Pyx_PyErr_ExceptionMatches(((PyObject *)(&((PyTypeObject*)PyExc_Exception)[0])));
     if (__pyx_t_4) {
       __Pyx_AddTraceback("numpy.import_umath", __pyx_clineno, __pyx_lineno, __pyx_filename);
-      if (__Pyx_GetException(&__pyx_t_5, &__pyx_t_6, &__pyx_t_7) < 0) __PYX_ERR(1, 950, __pyx_L5_except_error)
+      if (__Pyx_GetException(&__pyx_t_5, &__pyx_t_6, &__pyx_t_7) < 0) __PYX_ERR(1, 949, __pyx_L5_except_error)
       __Pyx_GOTREF(__pyx_t_5);
       __Pyx_GOTREF(__pyx_t_6);
       __Pyx_GOTREF(__pyx_t_7);
 
-      /* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":951
+      /* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":950
  *         _import_umath()
  *     except Exception:
  *         raise ImportError("numpy.core.umath failed to import")             # <<<<<<<<<<<<<<
  * 
  * cdef inline int import_ufunc() except -1:
  */
-      __pyx_t_8 = __Pyx_PyObject_Call(__pyx_builtin_ImportError, __pyx_tuple__5, NULL); if (unlikely(!__pyx_t_8)) __PYX_ERR(1, 951, __pyx_L5_except_error)
+      __pyx_t_8 = __Pyx_PyObject_Call(__pyx_builtin_ImportError, __pyx_tuple__5, NULL); if (unlikely(!__pyx_t_8)) __PYX_ERR(1, 950, __pyx_L5_except_error)
       __Pyx_GOTREF(__pyx_t_8);
       __Pyx_Raise(__pyx_t_8, 0, 0, 0);
       __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
-      __PYX_ERR(1, 951, __pyx_L5_except_error)
+      __PYX_ERR(1, 950, __pyx_L5_except_error)
     }
     goto __pyx_L5_except_error;
     __pyx_L5_except_error:;
 
-    /* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":948
+    /* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":947
  * 
  * cdef inline int import_umath() except -1:
  *     try:             # <<<<<<<<<<<<<<
@@ -3878,7 +4013,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_umath(void) {
     __pyx_L8_try_end:;
   }
 
-  /* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":947
+  /* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":946
  *         raise ImportError("numpy.core.multiarray failed to import")
  * 
  * cdef inline int import_umath() except -1:             # <<<<<<<<<<<<<<
@@ -3901,7 +4036,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_umath(void) {
   return __pyx_r;
 }
 
-/* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":953
+/* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":952
  *         raise ImportError("numpy.core.umath failed to import")
  * 
  * cdef inline int import_ufunc() except -1:             # <<<<<<<<<<<<<<
@@ -3925,7 +4060,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_ufunc(void) {
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("import_ufunc", 0);
 
-  /* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":954
+  /* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":953
  * 
  * cdef inline int import_ufunc() except -1:
  *     try:             # <<<<<<<<<<<<<<
@@ -3941,16 +4076,16 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_ufunc(void) {
     __Pyx_XGOTREF(__pyx_t_3);
     /*try:*/ {
 
-      /* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":955
+      /* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":954
  * cdef inline int import_ufunc() except -1:
  *     try:
  *         _import_umath()             # <<<<<<<<<<<<<<
  *     except Exception:
  *         raise ImportError("numpy.core.umath failed to import")
  */
-      __pyx_t_4 = _import_umath(); if (unlikely(__pyx_t_4 == ((int)-1))) __PYX_ERR(1, 955, __pyx_L3_error)
+      __pyx_t_4 = _import_umath(); if (unlikely(__pyx_t_4 == ((int)-1))) __PYX_ERR(1, 954, __pyx_L3_error)
 
-      /* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":954
+      /* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":953
  * 
  * cdef inline int import_ufunc() except -1:
  *     try:             # <<<<<<<<<<<<<<
@@ -3964,7 +4099,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_ufunc(void) {
     goto __pyx_L8_try_end;
     __pyx_L3_error:;
 
-    /* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":956
+    /* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":955
  *     try:
  *         _import_umath()
  *     except Exception:             # <<<<<<<<<<<<<<
@@ -3974,28 +4109,28 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_ufunc(void) {
     __pyx_t_4 = __Pyx_PyErr_ExceptionMatches(((PyObject *)(&((PyTypeObject*)PyExc_Exception)[0])));
     if (__pyx_t_4) {
       __Pyx_AddTraceback("numpy.import_ufunc", __pyx_clineno, __pyx_lineno, __pyx_filename);
-      if (__Pyx_GetException(&__pyx_t_5, &__pyx_t_6, &__pyx_t_7) < 0) __PYX_ERR(1, 956, __pyx_L5_except_error)
+      if (__Pyx_GetException(&__pyx_t_5, &__pyx_t_6, &__pyx_t_7) < 0) __PYX_ERR(1, 955, __pyx_L5_except_error)
       __Pyx_GOTREF(__pyx_t_5);
       __Pyx_GOTREF(__pyx_t_6);
       __Pyx_GOTREF(__pyx_t_7);
 
-      /* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":957
+      /* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":956
  *         _import_umath()
  *     except Exception:
  *         raise ImportError("numpy.core.umath failed to import")             # <<<<<<<<<<<<<<
  * 
  * cdef extern from *:
  */
-      __pyx_t_8 = __Pyx_PyObject_Call(__pyx_builtin_ImportError, __pyx_tuple__5, NULL); if (unlikely(!__pyx_t_8)) __PYX_ERR(1, 957, __pyx_L5_except_error)
+      __pyx_t_8 = __Pyx_PyObject_Call(__pyx_builtin_ImportError, __pyx_tuple__5, NULL); if (unlikely(!__pyx_t_8)) __PYX_ERR(1, 956, __pyx_L5_except_error)
       __Pyx_GOTREF(__pyx_t_8);
       __Pyx_Raise(__pyx_t_8, 0, 0, 0);
       __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
-      __PYX_ERR(1, 957, __pyx_L5_except_error)
+      __PYX_ERR(1, 956, __pyx_L5_except_error)
     }
     goto __pyx_L5_except_error;
     __pyx_L5_except_error:;
 
-    /* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":954
+    /* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":953
  * 
  * cdef inline int import_ufunc() except -1:
  *     try:             # <<<<<<<<<<<<<<
@@ -4010,7 +4145,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_ufunc(void) {
     __pyx_L8_try_end:;
   }
 
-  /* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":953
+  /* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":952
  *         raise ImportError("numpy.core.umath failed to import")
  * 
  * cdef inline int import_ufunc() except -1:             # <<<<<<<<<<<<<<
@@ -4033,7 +4168,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_ufunc(void) {
   return __pyx_r;
 }
 
-/* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":967
+/* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":966
  * 
  * 
  * cdef inline bint is_timedelta64_object(object obj):             # <<<<<<<<<<<<<<
@@ -4046,7 +4181,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_is_timedelta64_object(PyObject *__pyx_v_
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("is_timedelta64_object", 0);
 
-  /* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":979
+  /* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":978
  *     bool
  *     """
  *     return PyObject_TypeCheck(obj, &PyTimedeltaArrType_Type)             # <<<<<<<<<<<<<<
@@ -4056,7 +4191,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_is_timedelta64_object(PyObject *__pyx_v_
   __pyx_r = PyObject_TypeCheck(__pyx_v_obj, (&PyTimedeltaArrType_Type));
   goto __pyx_L0;
 
-  /* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":967
+  /* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":966
  * 
  * 
  * cdef inline bint is_timedelta64_object(object obj):             # <<<<<<<<<<<<<<
@@ -4070,7 +4205,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_is_timedelta64_object(PyObject *__pyx_v_
   return __pyx_r;
 }
 
-/* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":982
+/* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":981
  * 
  * 
  * cdef inline bint is_datetime64_object(object obj):             # <<<<<<<<<<<<<<
@@ -4083,7 +4218,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_is_datetime64_object(PyObject *__pyx_v_o
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("is_datetime64_object", 0);
 
-  /* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":994
+  /* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":993
  *     bool
  *     """
  *     return PyObject_TypeCheck(obj, &PyDatetimeArrType_Type)             # <<<<<<<<<<<<<<
@@ -4093,7 +4228,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_is_datetime64_object(PyObject *__pyx_v_o
   __pyx_r = PyObject_TypeCheck(__pyx_v_obj, (&PyDatetimeArrType_Type));
   goto __pyx_L0;
 
-  /* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":982
+  /* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":981
  * 
  * 
  * cdef inline bint is_datetime64_object(object obj):             # <<<<<<<<<<<<<<
@@ -4107,7 +4242,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_is_datetime64_object(PyObject *__pyx_v_o
   return __pyx_r;
 }
 
-/* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":997
+/* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":996
  * 
  * 
  * cdef inline npy_datetime get_datetime64_value(object obj) nogil:             # <<<<<<<<<<<<<<
@@ -4118,7 +4253,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_is_datetime64_object(PyObject *__pyx_v_o
 static CYTHON_INLINE npy_datetime __pyx_f_5numpy_get_datetime64_value(PyObject *__pyx_v_obj) {
   npy_datetime __pyx_r;
 
-  /* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":1004
+  /* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":1003
  *     also needed.  That can be found using `get_datetime64_unit`.
  *     """
  *     return (<PyDatetimeScalarObject*>obj).obval             # <<<<<<<<<<<<<<
@@ -4128,7 +4263,7 @@ static CYTHON_INLINE npy_datetime __pyx_f_5numpy_get_datetime64_value(PyObject *
   __pyx_r = ((PyDatetimeScalarObject *)__pyx_v_obj)->obval;
   goto __pyx_L0;
 
-  /* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":997
+  /* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":996
  * 
  * 
  * cdef inline npy_datetime get_datetime64_value(object obj) nogil:             # <<<<<<<<<<<<<<
@@ -4141,7 +4276,7 @@ static CYTHON_INLINE npy_datetime __pyx_f_5numpy_get_datetime64_value(PyObject *
   return __pyx_r;
 }
 
-/* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":1007
+/* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":1006
  * 
  * 
  * cdef inline npy_timedelta get_timedelta64_value(object obj) nogil:             # <<<<<<<<<<<<<<
@@ -4152,7 +4287,7 @@ static CYTHON_INLINE npy_datetime __pyx_f_5numpy_get_datetime64_value(PyObject *
 static CYTHON_INLINE npy_timedelta __pyx_f_5numpy_get_timedelta64_value(PyObject *__pyx_v_obj) {
   npy_timedelta __pyx_r;
 
-  /* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":1011
+  /* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":1010
  *     returns the int64 value underlying scalar numpy timedelta64 object
  *     """
  *     return (<PyTimedeltaScalarObject*>obj).obval             # <<<<<<<<<<<<<<
@@ -4162,7 +4297,7 @@ static CYTHON_INLINE npy_timedelta __pyx_f_5numpy_get_timedelta64_value(PyObject
   __pyx_r = ((PyTimedeltaScalarObject *)__pyx_v_obj)->obval;
   goto __pyx_L0;
 
-  /* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":1007
+  /* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":1006
  * 
  * 
  * cdef inline npy_timedelta get_timedelta64_value(object obj) nogil:             # <<<<<<<<<<<<<<
@@ -4175,7 +4310,7 @@ static CYTHON_INLINE npy_timedelta __pyx_f_5numpy_get_timedelta64_value(PyObject
   return __pyx_r;
 }
 
-/* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":1014
+/* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":1013
  * 
  * 
  * cdef inline NPY_DATETIMEUNIT get_datetime64_unit(object obj) nogil:             # <<<<<<<<<<<<<<
@@ -4186,7 +4321,7 @@ static CYTHON_INLINE npy_timedelta __pyx_f_5numpy_get_timedelta64_value(PyObject
 static CYTHON_INLINE NPY_DATETIMEUNIT __pyx_f_5numpy_get_datetime64_unit(PyObject *__pyx_v_obj) {
   NPY_DATETIMEUNIT __pyx_r;
 
-  /* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":1018
+  /* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":1017
  *     returns the unit part of the dtype for a numpy datetime64 object.
  *     """
  *     return <NPY_DATETIMEUNIT>(<PyDatetimeScalarObject*>obj).obmeta.base             # <<<<<<<<<<<<<<
@@ -4194,7 +4329,7 @@ static CYTHON_INLINE NPY_DATETIMEUNIT __pyx_f_5numpy_get_datetime64_unit(PyObjec
   __pyx_r = ((NPY_DATETIMEUNIT)((PyDatetimeScalarObject *)__pyx_v_obj)->obmeta.base);
   goto __pyx_L0;
 
-  /* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":1014
+  /* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":1013
  * 
  * 
  * cdef inline NPY_DATETIMEUNIT get_datetime64_unit(object obj) nogil:             # <<<<<<<<<<<<<<
@@ -4285,8 +4420,8 @@ static __Pyx_StringTabEntry __pyx_string_tab[] = {
   {&__pyx_n_s_radius, __pyx_k_radius, sizeof(__pyx_k_radius), 0, 0, 1, 1},
   {&__pyx_n_s_range, __pyx_k_range, sizeof(__pyx_k_range), 0, 0, 1, 1},
   {&__pyx_n_s_sigmas, __pyx_k_sigmas, sizeof(__pyx_k_sigmas), 0, 0, 1, 1},
-  {&__pyx_n_s_src_screening_utils, __pyx_k_src_screening_utils, sizeof(__pyx_k_src_screening_utils), 0, 0, 1, 1},
-  {&__pyx_kp_s_src_screening_utils_pyx, __pyx_k_src_screening_utils_pyx, sizeof(__pyx_k_src_screening_utils_pyx), 0, 0, 1, 0},
+  {&__pyx_n_s_slopescreening_screening_utils, __pyx_k_slopescreening_screening_utils, sizeof(__pyx_k_slopescreening_screening_utils), 0, 0, 1, 1},
+  {&__pyx_kp_s_slopescreening_screening_utils_p, __pyx_k_slopescreening_screening_utils_p, sizeof(__pyx_k_slopescreening_screening_utils_p), 0, 0, 1, 0},
   {&__pyx_n_s_tau, __pyx_k_tau, sizeof(__pyx_k_tau), 0, 0, 1, 1},
   {&__pyx_n_s_test, __pyx_k_test, sizeof(__pyx_k_test), 0, 0, 1, 1},
   {&__pyx_n_s_vec_cumsum_gammas, __pyx_k_vec_cumsum_gammas, sizeof(__pyx_k_vec_cumsum_gammas), 0, 0, 1, 1},
@@ -4300,7 +4435,7 @@ static __Pyx_StringTabEntry __pyx_string_tab[] = {
 };
 static CYTHON_SMALL_CODE int __Pyx_InitCachedBuiltins(void) {
   __pyx_builtin_range = __Pyx_GetBuiltinName(__pyx_n_s_range); if (!__pyx_builtin_range) __PYX_ERR(0, 44, __pyx_L1_error)
-  __pyx_builtin_ImportError = __Pyx_GetBuiltinName(__pyx_n_s_ImportError); if (!__pyx_builtin_ImportError) __PYX_ERR(1, 945, __pyx_L1_error)
+  __pyx_builtin_ImportError = __Pyx_GetBuiltinName(__pyx_n_s_ImportError); if (!__pyx_builtin_ImportError) __PYX_ERR(1, 944, __pyx_L1_error)
   return 0;
   __pyx_L1_error:;
   return -1;
@@ -4310,7 +4445,7 @@ static CYTHON_SMALL_CODE int __Pyx_InitCachedConstants(void) {
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("__Pyx_InitCachedConstants", 0);
 
-  /* "src/screening/utils.pyx":41
+  /* "slopescreening/screening/utils.pyx":41
  *     # 2. Precomputing quantities
  *     cdef np.ndarray[np.npy_double, ndim=1] vec_f = np.cumsum(
  *         lbd * vec_gammas[::-1] - Atcabs[index[::-1]] - radius             # <<<<<<<<<<<<<<
@@ -4321,7 +4456,7 @@ static CYTHON_SMALL_CODE int __Pyx_InitCachedConstants(void) {
   __Pyx_GOTREF(__pyx_slice_);
   __Pyx_GIVEREF(__pyx_slice_);
 
-  /* "src/screening/utils.pyx":100
+  /* "slopescreening/screening/utils.pyx":100
  *         # Cdric' notations compliant
  *     cdef np.ndarray[np.npy_double, ndim=1] sigmas = np.zeros(n)
  *     sigmas[1:] = np.cumsum(Atcabs[index[:-1]])             # <<<<<<<<<<<<<<
@@ -4335,29 +4470,29 @@ static CYTHON_SMALL_CODE int __Pyx_InitCachedConstants(void) {
   __Pyx_GOTREF(__pyx_slice__3);
   __Pyx_GIVEREF(__pyx_slice__3);
 
-  /* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":945
+  /* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":944
  *         __pyx_import_array()
  *     except Exception:
  *         raise ImportError("numpy.core.multiarray failed to import")             # <<<<<<<<<<<<<<
  * 
  * cdef inline int import_umath() except -1:
  */
-  __pyx_tuple__4 = PyTuple_Pack(1, __pyx_kp_s_numpy_core_multiarray_failed_to); if (unlikely(!__pyx_tuple__4)) __PYX_ERR(1, 945, __pyx_L1_error)
+  __pyx_tuple__4 = PyTuple_Pack(1, __pyx_kp_s_numpy_core_multiarray_failed_to); if (unlikely(!__pyx_tuple__4)) __PYX_ERR(1, 944, __pyx_L1_error)
   __Pyx_GOTREF(__pyx_tuple__4);
   __Pyx_GIVEREF(__pyx_tuple__4);
 
-  /* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":951
+  /* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":950
  *         _import_umath()
  *     except Exception:
  *         raise ImportError("numpy.core.umath failed to import")             # <<<<<<<<<<<<<<
  * 
  * cdef inline int import_ufunc() except -1:
  */
-  __pyx_tuple__5 = PyTuple_Pack(1, __pyx_kp_s_numpy_core_umath_failed_to_impor); if (unlikely(!__pyx_tuple__5)) __PYX_ERR(1, 951, __pyx_L1_error)
+  __pyx_tuple__5 = PyTuple_Pack(1, __pyx_kp_s_numpy_core_umath_failed_to_impor); if (unlikely(!__pyx_tuple__5)) __PYX_ERR(1, 950, __pyx_L1_error)
   __Pyx_GOTREF(__pyx_tuple__5);
   __Pyx_GIVEREF(__pyx_tuple__5);
 
-  /* "src/screening/utils.pyx":18
+  /* "slopescreening/screening/utils.pyx":18
  * @cython.boundscheck(False) # turn off bounds-checking for entire function
  * @cython.wraparound(False)  # turn off negative index wrapping for entire function
  * def GAP_Ptest_mixed_impl(             # <<<<<<<<<<<<<<
@@ -4367,9 +4502,9 @@ static CYTHON_SMALL_CODE int __Pyx_InitCachedConstants(void) {
   __pyx_tuple__6 = PyTuple_Pack(15, __pyx_n_s_vec_gammas, __pyx_n_s_lbd, __pyx_n_s_Atcabs, __pyx_n_s_radius, __pyx_n_s_index, __pyx_n_s_n, __pyx_n_s_k, __pyx_n_s_q, __pyx_n_s_r, __pyx_n_s_bool_exit, __pyx_n_s_tau, __pyx_n_s_vec_q_star, __pyx_n_s_vec_r_star, __pyx_n_s_calI_screen, __pyx_n_s_vec_f); if (unlikely(!__pyx_tuple__6)) __PYX_ERR(0, 18, __pyx_L1_error)
   __Pyx_GOTREF(__pyx_tuple__6);
   __Pyx_GIVEREF(__pyx_tuple__6);
-  __pyx_codeobj__7 = (PyObject*)__Pyx_PyCode_New(5, 0, 15, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__6, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_screening_utils_pyx, __pyx_n_s_GAP_Ptest_mixed_impl, 18, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__7)) __PYX_ERR(0, 18, __pyx_L1_error)
+  __pyx_codeobj__7 = (PyObject*)__Pyx_PyCode_New(5, 0, 15, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__6, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_slopescreening_screening_utils_p, __pyx_n_s_GAP_Ptest_mixed_impl, 18, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__7)) __PYX_ERR(0, 18, __pyx_L1_error)
 
-  /* "src/screening/utils.pyx":81
+  /* "slopescreening/screening/utils.pyx":81
  * @cython.boundscheck(False) # turn off bounds-checking for entire function
  * @cython.wraparound(False)  # turn off negative index wrapping for entire function
  * def gap_kappa_test(             # <<<<<<<<<<<<<<
@@ -4379,7 +4514,7 @@ static CYTHON_SMALL_CODE int __Pyx_InitCachedConstants(void) {
   __pyx_tuple__8 = PyTuple_Pack(13, __pyx_n_s_vec_cumsum_gammas, __pyx_n_s_vec_kappa_q, __pyx_n_s_lbd, __pyx_n_s_Atcabs, __pyx_n_s_radius, __pyx_n_s_index, __pyx_n_s_n, __pyx_n_s_q, __pyx_n_s_l_q, __pyx_n_s_l_min, __pyx_n_s_bound, __pyx_n_s_calI_screen, __pyx_n_s_sigmas); if (unlikely(!__pyx_tuple__8)) __PYX_ERR(0, 81, __pyx_L1_error)
   __Pyx_GOTREF(__pyx_tuple__8);
   __Pyx_GIVEREF(__pyx_tuple__8);
-  __pyx_codeobj__9 = (PyObject*)__Pyx_PyCode_New(6, 0, 13, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__8, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_screening_utils_pyx, __pyx_n_s_gap_kappa_test, 81, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__9)) __PYX_ERR(0, 81, __pyx_L1_error)
+  __pyx_codeobj__9 = (PyObject*)__Pyx_PyCode_New(6, 0, 13, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__8, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_slopescreening_screening_utils_p, __pyx_n_s_gap_kappa_test, 81, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__9)) __PYX_ERR(0, 81, __pyx_L1_error)
   __Pyx_RefNannyFinishContext();
   return 0;
   __pyx_L1_error:;
@@ -4455,38 +4590,38 @@ static int __Pyx_modinit_type_import_code(void) {
   __Pyx_ImportType_CheckSize_Warn);
    if (!__pyx_ptype_7cpython_4type_type) __PYX_ERR(2, 9, __pyx_L1_error)
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  __pyx_t_1 = PyImport_ImportModule("numpy"); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 200, __pyx_L1_error)
+  __pyx_t_1 = PyImport_ImportModule("numpy"); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 199, __pyx_L1_error)
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_ptype_5numpy_dtype = __Pyx_ImportType(__pyx_t_1, "numpy", "dtype", sizeof(PyArray_Descr), __Pyx_ImportType_CheckSize_Ignore);
-   if (!__pyx_ptype_5numpy_dtype) __PYX_ERR(1, 200, __pyx_L1_error)
+   if (!__pyx_ptype_5numpy_dtype) __PYX_ERR(1, 199, __pyx_L1_error)
   __pyx_ptype_5numpy_flatiter = __Pyx_ImportType(__pyx_t_1, "numpy", "flatiter", sizeof(PyArrayIterObject), __Pyx_ImportType_CheckSize_Ignore);
-   if (!__pyx_ptype_5numpy_flatiter) __PYX_ERR(1, 223, __pyx_L1_error)
+   if (!__pyx_ptype_5numpy_flatiter) __PYX_ERR(1, 222, __pyx_L1_error)
   __pyx_ptype_5numpy_broadcast = __Pyx_ImportType(__pyx_t_1, "numpy", "broadcast", sizeof(PyArrayMultiIterObject), __Pyx_ImportType_CheckSize_Ignore);
-   if (!__pyx_ptype_5numpy_broadcast) __PYX_ERR(1, 227, __pyx_L1_error)
+   if (!__pyx_ptype_5numpy_broadcast) __PYX_ERR(1, 226, __pyx_L1_error)
   __pyx_ptype_5numpy_ndarray = __Pyx_ImportType(__pyx_t_1, "numpy", "ndarray", sizeof(PyArrayObject), __Pyx_ImportType_CheckSize_Ignore);
-   if (!__pyx_ptype_5numpy_ndarray) __PYX_ERR(1, 239, __pyx_L1_error)
+   if (!__pyx_ptype_5numpy_ndarray) __PYX_ERR(1, 238, __pyx_L1_error)
   __pyx_ptype_5numpy_generic = __Pyx_ImportType(__pyx_t_1, "numpy", "generic", sizeof(PyObject), __Pyx_ImportType_CheckSize_Warn);
-   if (!__pyx_ptype_5numpy_generic) __PYX_ERR(1, 771, __pyx_L1_error)
+   if (!__pyx_ptype_5numpy_generic) __PYX_ERR(1, 770, __pyx_L1_error)
   __pyx_ptype_5numpy_number = __Pyx_ImportType(__pyx_t_1, "numpy", "number", sizeof(PyObject), __Pyx_ImportType_CheckSize_Warn);
-   if (!__pyx_ptype_5numpy_number) __PYX_ERR(1, 773, __pyx_L1_error)
+   if (!__pyx_ptype_5numpy_number) __PYX_ERR(1, 772, __pyx_L1_error)
   __pyx_ptype_5numpy_integer = __Pyx_ImportType(__pyx_t_1, "numpy", "integer", sizeof(PyObject), __Pyx_ImportType_CheckSize_Warn);
-   if (!__pyx_ptype_5numpy_integer) __PYX_ERR(1, 775, __pyx_L1_error)
+   if (!__pyx_ptype_5numpy_integer) __PYX_ERR(1, 774, __pyx_L1_error)
   __pyx_ptype_5numpy_signedinteger = __Pyx_ImportType(__pyx_t_1, "numpy", "signedinteger", sizeof(PyObject), __Pyx_ImportType_CheckSize_Warn);
-   if (!__pyx_ptype_5numpy_signedinteger) __PYX_ERR(1, 777, __pyx_L1_error)
+   if (!__pyx_ptype_5numpy_signedinteger) __PYX_ERR(1, 776, __pyx_L1_error)
   __pyx_ptype_5numpy_unsignedinteger = __Pyx_ImportType(__pyx_t_1, "numpy", "unsignedinteger", sizeof(PyObject), __Pyx_ImportType_CheckSize_Warn);
-   if (!__pyx_ptype_5numpy_unsignedinteger) __PYX_ERR(1, 779, __pyx_L1_error)
+   if (!__pyx_ptype_5numpy_unsignedinteger) __PYX_ERR(1, 778, __pyx_L1_error)
   __pyx_ptype_5numpy_inexact = __Pyx_ImportType(__pyx_t_1, "numpy", "inexact", sizeof(PyObject), __Pyx_ImportType_CheckSize_Warn);
-   if (!__pyx_ptype_5numpy_inexact) __PYX_ERR(1, 781, __pyx_L1_error)
+   if (!__pyx_ptype_5numpy_inexact) __PYX_ERR(1, 780, __pyx_L1_error)
   __pyx_ptype_5numpy_floating = __Pyx_ImportType(__pyx_t_1, "numpy", "floating", sizeof(PyObject), __Pyx_ImportType_CheckSize_Warn);
-   if (!__pyx_ptype_5numpy_floating) __PYX_ERR(1, 783, __pyx_L1_error)
+   if (!__pyx_ptype_5numpy_floating) __PYX_ERR(1, 782, __pyx_L1_error)
   __pyx_ptype_5numpy_complexfloating = __Pyx_ImportType(__pyx_t_1, "numpy", "complexfloating", sizeof(PyObject), __Pyx_ImportType_CheckSize_Warn);
-   if (!__pyx_ptype_5numpy_complexfloating) __PYX_ERR(1, 785, __pyx_L1_error)
+   if (!__pyx_ptype_5numpy_complexfloating) __PYX_ERR(1, 784, __pyx_L1_error)
   __pyx_ptype_5numpy_flexible = __Pyx_ImportType(__pyx_t_1, "numpy", "flexible", sizeof(PyObject), __Pyx_ImportType_CheckSize_Warn);
-   if (!__pyx_ptype_5numpy_flexible) __PYX_ERR(1, 787, __pyx_L1_error)
+   if (!__pyx_ptype_5numpy_flexible) __PYX_ERR(1, 786, __pyx_L1_error)
   __pyx_ptype_5numpy_character = __Pyx_ImportType(__pyx_t_1, "numpy", "character", sizeof(PyObject), __Pyx_ImportType_CheckSize_Warn);
-   if (!__pyx_ptype_5numpy_character) __PYX_ERR(1, 789, __pyx_L1_error)
+   if (!__pyx_ptype_5numpy_character) __PYX_ERR(1, 788, __pyx_L1_error)
   __pyx_ptype_5numpy_ufunc = __Pyx_ImportType(__pyx_t_1, "numpy", "ufunc", sizeof(PyUFuncObject), __Pyx_ImportType_CheckSize_Ignore);
-   if (!__pyx_ptype_5numpy_ufunc) __PYX_ERR(1, 827, __pyx_L1_error)
+   if (!__pyx_ptype_5numpy_ufunc) __PYX_ERR(1, 826, __pyx_L1_error)
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   __Pyx_RefNannyFinishContext();
   return 0;
@@ -4684,14 +4819,14 @@ if (!__Pyx_RefNanny) {
   #if PY_MAJOR_VERSION < 3 && (__PYX_DEFAULT_STRING_ENCODING_IS_ASCII || __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT)
   if (__Pyx_init_sys_getdefaultencoding_params() < 0) __PYX_ERR(0, 1, __pyx_L1_error)
   #endif
-  if (__pyx_module_is_main_src__screening__utils) {
+  if (__pyx_module_is_main_slopescreening__screening__utils) {
     if (PyObject_SetAttr(__pyx_m, __pyx_n_s_name, __pyx_n_s_main) < 0) __PYX_ERR(0, 1, __pyx_L1_error)
   }
   #if PY_MAJOR_VERSION >= 3
   {
     PyObject *modules = PyImport_GetModuleDict(); if (unlikely(!modules)) __PYX_ERR(0, 1, __pyx_L1_error)
-    if (!PyDict_GetItemString(modules, "src.screening.utils")) {
-      if (unlikely(PyDict_SetItemString(modules, "src.screening.utils", __pyx_m) < 0)) __PYX_ERR(0, 1, __pyx_L1_error)
+    if (!PyDict_GetItemString(modules, "slopescreening.screening.utils")) {
+      if (unlikely(PyDict_SetItemString(modules, "slopescreening.screening.utils", __pyx_m) < 0)) __PYX_ERR(0, 1, __pyx_L1_error)
     }
   }
   #endif
@@ -4712,7 +4847,7 @@ if (!__Pyx_RefNanny) {
   if (__Pyx_patch_abc() < 0) __PYX_ERR(0, 1, __pyx_L1_error)
   #endif
 
-  /* "src/screening/utils.pyx":3
+  /* "slopescreening/screening/utils.pyx":3
  * # -*- coding: utf-8 -*-
  * # Based on https://cython.readthedocs.io/en/latest/src/tutorial/numpy.html
  * import numpy as np             # <<<<<<<<<<<<<<
@@ -4724,31 +4859,31 @@ if (!__Pyx_RefNanny) {
   if (PyDict_SetItem(__pyx_d, __pyx_n_s_np, __pyx_t_1) < 0) __PYX_ERR(0, 3, __pyx_L1_error)
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "src/screening/utils.pyx":18
+  /* "slopescreening/screening/utils.pyx":18
  * @cython.boundscheck(False) # turn off bounds-checking for entire function
  * @cython.wraparound(False)  # turn off negative index wrapping for entire function
  * def GAP_Ptest_mixed_impl(             # <<<<<<<<<<<<<<
  *     # np.ndarray[np.npy_double, ndim=1] vec_f,
  *     np.ndarray[np.npy_double, ndim=1] vec_gammas,
  */
-  __pyx_t_1 = PyCFunction_NewEx(&__pyx_mdef_3src_9screening_5utils_1GAP_Ptest_mixed_impl, NULL, __pyx_n_s_src_screening_utils); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 18, __pyx_L1_error)
+  __pyx_t_1 = PyCFunction_NewEx(&__pyx_mdef_14slopescreening_9screening_5utils_1GAP_Ptest_mixed_impl, NULL, __pyx_n_s_slopescreening_screening_utils); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 18, __pyx_L1_error)
   __Pyx_GOTREF(__pyx_t_1);
   if (PyDict_SetItem(__pyx_d, __pyx_n_s_GAP_Ptest_mixed_impl, __pyx_t_1) < 0) __PYX_ERR(0, 18, __pyx_L1_error)
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "src/screening/utils.pyx":81
+  /* "slopescreening/screening/utils.pyx":81
  * @cython.boundscheck(False) # turn off bounds-checking for entire function
  * @cython.wraparound(False)  # turn off negative index wrapping for entire function
  * def gap_kappa_test(             # <<<<<<<<<<<<<<
  *     np.ndarray[np.npy_double, ndim=1] vec_cumsum_gammas,
  *     np.ndarray[np.npy_double, ndim=1] vec_kappa_q,
  */
-  __pyx_t_1 = PyCFunction_NewEx(&__pyx_mdef_3src_9screening_5utils_3gap_kappa_test, NULL, __pyx_n_s_src_screening_utils); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 81, __pyx_L1_error)
+  __pyx_t_1 = PyCFunction_NewEx(&__pyx_mdef_14slopescreening_9screening_5utils_3gap_kappa_test, NULL, __pyx_n_s_slopescreening_screening_utils); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 81, __pyx_L1_error)
   __Pyx_GOTREF(__pyx_t_1);
   if (PyDict_SetItem(__pyx_d, __pyx_n_s_gap_kappa_test, __pyx_t_1) < 0) __PYX_ERR(0, 81, __pyx_L1_error)
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "src/screening/utils.pyx":1
+  /* "slopescreening/screening/utils.pyx":1
  * # -*- coding: utf-8 -*-             # <<<<<<<<<<<<<<
  * # Based on https://cython.readthedocs.io/en/latest/src/tutorial/numpy.html
  * import numpy as np
@@ -4758,7 +4893,7 @@ if (!__Pyx_RefNanny) {
   if (PyDict_SetItem(__pyx_d, __pyx_n_s_test, __pyx_t_1) < 0) __PYX_ERR(0, 1, __pyx_L1_error)
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "venv/lib/python3.8/site-packages/numpy/__init__.pxd":1014
+  /* "venv/lib/python3.10/site-packages/numpy/__init__.pxd":1013
  * 
  * 
  * cdef inline NPY_DATETIMEUNIT get_datetime64_unit(object obj) nogil:             # <<<<<<<<<<<<<<
@@ -4773,11 +4908,11 @@ if (!__Pyx_RefNanny) {
   __Pyx_XDECREF(__pyx_t_1);
   if (__pyx_m) {
     if (__pyx_d) {
-      __Pyx_AddTraceback("init src.screening.utils", __pyx_clineno, __pyx_lineno, __pyx_filename);
+      __Pyx_AddTraceback("init slopescreening.screening.utils", __pyx_clineno, __pyx_lineno, __pyx_filename);
     }
     Py_CLEAR(__pyx_m);
   } else if (!PyErr_Occurred()) {
-    PyErr_SetString(PyExc_ImportError, "init src.screening.utils");
+    PyErr_SetString(PyExc_ImportError, "init slopescreening.screening.utils");
   }
   __pyx_L0:;
   __Pyx_RefNannyFinishContext();
@@ -6496,7 +6631,7 @@ static int __Pyx_CLineForTraceback(CYTHON_NCP_UNUSED PyThreadState *tstate, int
     }
     if (!use_cline) {
         c_line = 0;
-        PyObject_SetAttr(__pyx_cython_runtime, __pyx_n_s_cline_in_traceback, Py_False);
+        (void) PyObject_SetAttr(__pyx_cython_runtime, __pyx_n_s_cline_in_traceback, Py_False);
     }
     else if (use_cline == Py_False || (use_cline != Py_True && PyObject_Not(use_cline) != 0)) {
         c_line = 0;
@@ -6590,33 +6725,40 @@ static void __pyx_insert_code_object(int code_line, PyCodeObject* code_object) {
   #include "compile.h"
 #include "frameobject.h"
 #include "traceback.h"
+#if PY_VERSION_HEX >= 0x030b00a6
+  #ifndef Py_BUILD_CORE
+    #define Py_BUILD_CORE 1
+  #endif
+  #include "internal/pycore_frame.h"
+#endif
 static PyCodeObject* __Pyx_CreateCodeObjectForTraceback(
             const char *funcname, int c_line,
             int py_line, const char *filename) {
-    PyCodeObject *py_code = 0;
-    PyObject *py_srcfile = 0;
-    PyObject *py_funcname = 0;
+    PyCodeObject *py_code = NULL;
+    PyObject *py_funcname = NULL;
     #if PY_MAJOR_VERSION < 3
+    PyObject *py_srcfile = NULL;
     py_srcfile = PyString_FromString(filename);
-    #else
-    py_srcfile = PyUnicode_FromString(filename);
-    #endif
     if (!py_srcfile) goto bad;
+    #endif
     if (c_line) {
         #if PY_MAJOR_VERSION < 3
         py_funcname = PyString_FromFormat( "%s (%s:%d)", funcname, __pyx_cfilenm, c_line);
+        if (!py_funcname) goto bad;
         #else
         py_funcname = PyUnicode_FromFormat( "%s (%s:%d)", funcname, __pyx_cfilenm, c_line);
+        if (!py_funcname) goto bad;
+        funcname = PyUnicode_AsUTF8(py_funcname);
+        if (!funcname) goto bad;
         #endif
     }
     else {
         #if PY_MAJOR_VERSION < 3
         py_funcname = PyString_FromString(funcname);
-        #else
-        py_funcname = PyUnicode_FromString(funcname);
+        if (!py_funcname) goto bad;
         #endif
     }
-    if (!py_funcname) goto bad;
+    #if PY_MAJOR_VERSION < 3
     py_code = __Pyx_PyCode_New(
         0,
         0,
@@ -6635,11 +6777,16 @@ static PyCodeObject* __Pyx_CreateCodeObjectForTraceback(
         __pyx_empty_bytes  /*PyObject *lnotab*/
     );
     Py_DECREF(py_srcfile);
-    Py_DECREF(py_funcname);
+    #else
+    py_code = PyCode_NewEmpty(filename, funcname, py_line);
+    #endif
+    Py_XDECREF(py_funcname);  // XDECREF since it's only set on Py3 if cline
     return py_code;
 bad:
-    Py_XDECREF(py_srcfile);
     Py_XDECREF(py_funcname);
+    #if PY_MAJOR_VERSION < 3
+    Py_XDECREF(py_srcfile);
+    #endif
     return NULL;
 }
 static void __Pyx_AddTraceback(const char *funcname, int c_line,
@@ -6647,14 +6794,24 @@ static void __Pyx_AddTraceback(const char *funcname, int c_line,
     PyCodeObject *py_code = 0;
     PyFrameObject *py_frame = 0;
     PyThreadState *tstate = __Pyx_PyThreadState_Current;
+    PyObject *ptype, *pvalue, *ptraceback;
     if (c_line) {
         c_line = __Pyx_CLineForTraceback(tstate, c_line);
     }
     py_code = __pyx_find_code_object(c_line ? -c_line : py_line);
     if (!py_code) {
+        __Pyx_ErrFetchInState(tstate, &ptype, &pvalue, &ptraceback);
         py_code = __Pyx_CreateCodeObjectForTraceback(
             funcname, c_line, py_line, filename);
-        if (!py_code) goto bad;
+        if (!py_code) {
+            /* If the code object creation fails, then we should clear the
+               fetched exception references and propagate the new exception */
+            Py_XDECREF(ptype);
+            Py_XDECREF(pvalue);
+            Py_XDECREF(ptraceback);
+            goto bad;
+        }
+        __Pyx_ErrRestoreInState(tstate, ptype, pvalue, ptraceback);
         __pyx_insert_code_object(c_line ? -c_line : py_line, py_code);
     }
     py_frame = PyFrame_New(
@@ -7591,11 +7748,33 @@ static CYTHON_INLINE int __Pyx_PyErr_GivenExceptionMatches2(PyObject *err, PyObj
 
 /* CheckBinaryVersion */
   static int __Pyx_check_binary_version(void) {
-    char ctversion[4], rtversion[4];
-    PyOS_snprintf(ctversion, 4, "%d.%d", PY_MAJOR_VERSION, PY_MINOR_VERSION);
-    PyOS_snprintf(rtversion, 4, "%s", Py_GetVersion());
-    if (ctversion[0] != rtversion[0] || ctversion[2] != rtversion[2]) {
+    char ctversion[5];
+    int same=1, i, found_dot;
+    const char* rt_from_call = Py_GetVersion();
+    PyOS_snprintf(ctversion, 5, "%d.%d", PY_MAJOR_VERSION, PY_MINOR_VERSION);
+    found_dot = 0;
+    for (i = 0; i < 4; i++) {
+        if (!ctversion[i]) {
+            same = (rt_from_call[i] < '0' || rt_from_call[i] > '9');
+            break;
+        }
+        if (rt_from_call[i] != ctversion[i]) {
+            same = 0;
+            break;
+        }
+    }
+    if (!same) {
+        char rtversion[5] = {'\0'};
         char message[200];
+        for (i=0; i<4; ++i) {
+            if (rt_from_call[i] == '.') {
+                if (found_dot) break;
+                found_dot = 1;
+            } else if (rt_from_call[i] < '0' || rt_from_call[i] > '9') {
+                break;
+            }
+            rtversion[i] = rt_from_call[i];
+        }
         PyOS_snprintf(message, sizeof(message),
                       "compiletime version %s of module '%.100s' "
                       "does not match runtime version %s",
@@ -7853,6 +8032,23 @@ static CYTHON_INLINE Py_ssize_t __Pyx_PyIndex_AsSsize_t(PyObject* b) {
   Py_DECREF(x);
   return ival;
 }
+static CYTHON_INLINE Py_hash_t __Pyx_PyIndex_AsHash_t(PyObject* o) {
+  if (sizeof(Py_hash_t) == sizeof(Py_ssize_t)) {
+    return (Py_hash_t) __Pyx_PyIndex_AsSsize_t(o);
+#if PY_MAJOR_VERSION < 3
+  } else if (likely(PyInt_CheckExact(o))) {
+    return PyInt_AS_LONG(o);
+#endif
+  } else {
+    Py_ssize_t ival;
+    PyObject *x;
+    x = PyNumber_Index(o);
+    if (!x) return -1;
+    ival = PyInt_AsLong(x);
+    Py_DECREF(x);
+    return ival;
+  }
+}
 static CYTHON_INLINE PyObject * __Pyx_PyBool_FromLong(long b) {
   return b ? __Pyx_NewRef(Py_True) : __Pyx_NewRef(Py_False);
 }
diff --git a/src/screening/utils.pyx b/slopescreening/screening/utils.pyx
similarity index 100%
rename from src/screening/utils.pyx
rename to slopescreening/screening/utils.pyx
diff --git a/src/solver/parameters.py b/slopescreening/solver/parameters.py
similarity index 94%
rename from src/solver/parameters.py
rename to slopescreening/solver/parameters.py
index 2e24c76..6722fb3 100755
--- a/src/solver/parameters.py
+++ b/slopescreening/solver/parameters.py
@@ -4,7 +4,7 @@ import enum
 
 import numpy as np
 
-from src.screening.ascreening import AbstractGapScreening
+from slopescreening.screening.ascreening import AbstractGapScreening
 
 
 class EnumLipchitzOptions(enum.Enum):
diff --git a/src/solver/prox.py b/slopescreening/solver/prox.py
similarity index 100%
rename from src/solver/prox.py
rename to slopescreening/solver/prox.py
diff --git a/src/solver/slope.py b/slopescreening/solver/slope.py
similarity index 98%
rename from src/solver/slope.py
rename to slopescreening/solver/slope.py
index 0d5449f..c84bd71 100755
--- a/src/solver/slope.py
+++ b/slopescreening/solver/slope.py
@@ -3,8 +3,8 @@ import time
 
 import numpy as np
 
-from src.solver.parameters import SlopeParameters, EnumLipchitzOptions, DualScalingOptions
-from src.solver.prox import prox_owl
+from slopescreening.solver.parameters import SlopeParameters, EnumLipchitzOptions, DualScalingOptions
+from slopescreening.solver.prox import prox_owl
 
 
 def primal_func(vecy, Ax, x, lbd, vec_gammas) -> float:
diff --git a/src/utils.py b/slopescreening/utils.py
similarity index 100%
rename from src/utils.py
rename to slopescreening/utils.py
diff --git a/src/__init__.py b/src/__init__.py
deleted file mode 100755
index 9e77438..0000000
--- a/src/__init__.py
+++ /dev/null
@@ -1,3 +0,0 @@
-# -*- coding: utf-8 -*-
-
-from src.__version import __version__
\ No newline at end of file
diff --git a/tests/test_solver.py b/tests/test_solver.py
index 6cfdba4..a05c248 100644
--- a/tests/test_solver.py
+++ b/tests/test_solver.py
@@ -2,10 +2,10 @@
 import unittest
 import numpy as np
 
-import src.utils as utils
-from src.dictionaries import generate_dic
-from src.solver.slope import slope_gp
-from src.solver.parameters import SlopeParameters
+import slopescreening.utils as utils
+from slopescreening.dictionaries import generate_dic
+from slopescreening.solver.slope import slope_gp
+from slopescreening.solver.parameters import SlopeParameters
 
 
 class TestSolver(unittest.TestCase):
diff --git a/tests/test_utils.py b/tests/test_utils.py
index 4017a3c..678e1b8 100644
--- a/tests/test_utils.py
+++ b/tests/test_utils.py
@@ -2,9 +2,9 @@
 import unittest
 import numpy as np
 
-import src.utils as utils
-from src.dictionaries import generate_dic
-from src.solver.slope import slope_gp
+import slopescreening.utils as utils
+from slopescreening.dictionaries import generate_dic
+from slopescreening.solver.slope import slope_gp
 
 class TestUtilsModule(unittest.TestCase):
 
-- 
GitLab