diff options
| author | Ján Jančár | 2023-09-30 16:47:24 +0200 |
|---|---|---|
| committer | GitHub | 2023-09-30 16:47:24 +0200 |
| commit | 80c72fab754ace04ea653f979e374aa718bda467 (patch) | |
| tree | 18d635514a872885e499cf7e9472b9c0d10d945d /test | |
| parent | 525de7929dfb91625139db99e05090328df4895f (diff) | |
| parent | d66c3dc971846c490a9f846e12be299a27856e69 (diff) | |
| download | pyecsca-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.py | 64 |
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)) |
