aboutsummaryrefslogtreecommitdiffhomepage
path: root/test
diff options
context:
space:
mode:
authorJán Jančár2023-09-30 16:47:24 +0200
committerGitHub2023-09-30 16:47:24 +0200
commit80c72fab754ace04ea653f979e374aa718bda467 (patch)
tree18d635514a872885e499cf7e9472b9c0d10d945d /test
parent525de7929dfb91625139db99e05090328df4895f (diff)
parentd66c3dc971846c490a9f846e12be299a27856e69 (diff)
downloadpyecsca-80c72fab754ace04ea653f979e374aa718bda467.tar.gz
pyecsca-80c72fab754ace04ea653f979e374aa718bda467.tar.zst
pyecsca-80c72fab754ace04ea653f979e374aa718bda467.zip
Merge pull request #42 from Tomko10/feat/pearson-corr-coef
Pearson correlation coefficient
Diffstat (limited to 'test')
-rw-r--r--test/sca/test_stacked_correlate.py64
1 files changed, 64 insertions, 0 deletions
diff --git a/test/sca/test_stacked_correlate.py b/test/sca/test_stacked_correlate.py
new file mode 100644
index 0000000..954494f
--- /dev/null
+++ b/test/sca/test_stacked_correlate.py
@@ -0,0 +1,64 @@
+import pytest
+from numba import cuda
+import numpy as np
+from pyecsca.sca import (
+ StackedTraces,
+ GPUTraceManager,
+ CombinedTrace
+)
+from pyecsca.sca.stacked_traces.correlate import gpu_pearson_corr
+
+TPB = 128
+TRACE_COUNT = 2 ** 10
+TRACE_LEN = 2 ** 15
+RTOL = 1e-5
+ATOL = 1e-5
+
+
+@pytest.fixture()
+def samples():
+ np.random.seed(0x1234)
+ return np.random.rand(TRACE_COUNT, TRACE_LEN).astype(np.float32, order="F")
+
+
+@pytest.fixture()
+def gpu_manager(samples):
+ if not cuda.is_available():
+ pytest.skip("CUDA not available")
+ return GPUTraceManager(StackedTraces(samples), TPB)
+
+
+@pytest.fixture()
+def intermediate_values():
+ np.random.seed(0x1234)
+ return np.random.rand(TRACE_COUNT)
+
+
+def pearson_corr(samples, intermediate_values):
+ return np.corrcoef(samples, intermediate_values, rowvar=False)[-1, :-1]
+
+
+def test_pearson_coef_no_chunking(samples, gpu_manager, intermediate_values):
+ corr_gpu = gpu_pearson_corr(intermediate_values,
+ trace_manager=gpu_manager)
+ corr_cmp = pearson_corr(samples, intermediate_values)
+
+ assert isinstance(corr_gpu, CombinedTrace)
+ assert corr_gpu.samples.shape == \
+ corr_cmp.shape
+
+ assert all(np.isclose(corr_gpu.samples, corr_cmp, rtol=RTOL, atol=ATOL))
+
+
+def test_pearson_coef_chunking(samples, gpu_manager, intermediate_values):
+ corr_gpu = gpu_pearson_corr(intermediate_values,
+ trace_manager=gpu_manager,
+ chunk_size=2 ** 5,
+ stream_count=4)
+ corr_cmp = pearson_corr(samples, intermediate_values)
+
+ assert isinstance(corr_gpu, CombinedTrace)
+ assert corr_gpu.samples.shape == \
+ corr_cmp.shape
+
+ assert all(np.isclose(corr_gpu.samples, corr_cmp, rtol=RTOL, atol=ATOL))