aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorTomáš Jusko2023-12-18 19:40:39 +0100
committerTomáš Jusko2023-12-18 19:40:39 +0100
commitf8a65bf3dd3a79b3de4fffc66d002292d1fc644c (patch)
tree1871afd49fa13dbc9c262179d18edab18d69df2e
parentf819a566c27993b9083992e9f6a10725e91f2551 (diff)
downloadpyecsca-f8a65bf3dd3a79b3de4fffc66d002292d1fc644c.tar.gz
pyecsca-f8a65bf3dd3a79b3de4fffc66d002292d1fc644c.tar.zst
pyecsca-f8a65bf3dd3a79b3de4fffc66d002292d1fc644c.zip
Moved Pearson correlation coefficient to combine.py
-rw-r--r--pyecsca/sca/stacked_traces/correlate.py80
1 files changed, 0 insertions, 80 deletions
diff --git a/pyecsca/sca/stacked_traces/correlate.py b/pyecsca/sca/stacked_traces/correlate.py
deleted file mode 100644
index c5277d9..0000000
--- a/pyecsca/sca/stacked_traces/correlate.py
+++ /dev/null
@@ -1,80 +0,0 @@
-import numpy as np
-import numpy.typing as npt
-from numba import cuda
-from numba.cuda.cudadrv.devicearray import DeviceNDArray
-from math import sqrt
-from typing import List, Optional, Union
-from .combine import InputType, GPUTraceManager
-from .stacked_traces import StackedTraces
-from ..trace.trace import CombinedTrace
-
-
-def gpu_pearson_corr(intermediate_values: npt.NDArray[np.number],
- stacked_traces: Optional[StackedTraces] = None,
- trace_manager: Optional[GPUTraceManager] = None,
- **tm_kwargs) -> Union[CombinedTrace, List[CombinedTrace]]:
- if (stacked_traces is None) == (trace_manager is None):
- raise ValueError("Either samples or trace manager must be given.")
-
- if trace_manager is None:
- assert stacked_traces is not None
- trace_manager = GPUTraceManager(stacked_traces, **tm_kwargs)
-
- if (len(intermediate_values.shape) != 1
- or (intermediate_values.shape[0]
- != trace_manager.traces_shape[0])):
- raise ValueError("Intermediate values have to be a vector "
- "as long as trace_count")
-
- intermed_sum: np.number = np.sum(intermediate_values)
- intermed_sq_sum: np.number = np.sum(np.square(intermediate_values))
- inputs: List[InputType] = [intermediate_values,
- np.array([intermed_sum]),
- np.array([intermed_sq_sum])]
-
- return trace_manager.run(
- _gpu_pearson_corr,
- inputs
- )
-
-
-@cuda.jit(cache=True)
-def _gpu_pearson_corr(samples: DeviceNDArray,
- intermediate_values: DeviceNDArray,
- intermed_sum: DeviceNDArray,
- intermed_sq_sum: DeviceNDArray,
- result: DeviceNDArray):
- """
- Calculates the Pearson correlation coefficient between the given samples and intermediate values using GPU acceleration.
-
- :param samples: A 2D array of shape (n, m) containing the samples.
- :type samples: npt.NDArray[np.number]
- :param intermediate_values: A 1D array of shape (n,) containing the intermediate values.
- :type intermediate_values: npt.NDArray[np.number]
- :param intermed_sum: A 1D array of shape (1,) containing the precomputed sum of the intermediate values.
- :type intermed_sum: npt.NDArray[np.number]
- :param intermed_sq_sum: A 1D array of shape (1,) containing the precomputed sum of the squares of the intermediate values.
- :param result: A 1D array of shape (m,) to store the resulting correlation coefficients.
- :type result: cuda.devicearray.DeviceNDArray
- """
- col: int = cuda.grid(1) # type: ignore
-
- if col >= samples.shape[1]: # type: ignore
- return
-
- n = samples.shape[0]
- samples_sum = 0.
- samples_sq_sum = 0.
- product_sum = 0.
-
- for row in range(n):
- samples_sum += samples[row, col]
- samples_sq_sum += samples[row, col] ** 2
- product_sum += samples[row, col] * intermediate_values[row]
-
- numerator = float(n) * product_sum - samples_sum * intermed_sum[0]
- denom_samp = sqrt(float(n) * samples_sq_sum - samples_sum ** 2)
- denom_int = sqrt(float(n) * intermed_sq_sum[0] - intermed_sum[0] ** 2)
- denominator = denom_samp * denom_int
-
- result[col] = numerator / denominator