From da2940342b22da2ee2adbaed4366a42c9c888d85 Mon Sep 17 00:00:00 2001 From: AlexB Date: Wed, 6 Dec 2023 19:13:35 -0500 Subject: [PATCH 01/13] added convolution --- maths/convolve_1d.py | 61 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 61 insertions(+) create mode 100644 maths/convolve_1d.py diff --git a/maths/convolve_1d.py b/maths/convolve_1d.py new file mode 100644 index 000000000000..a69f6d29c526 --- /dev/null +++ b/maths/convolve_1d.py @@ -0,0 +1,61 @@ +from __future__ import annotations +import math +from dataclasses import dataclass, field +from math import floor + +# discrete_convolution +""" + * Calculate the discrete convolution of two + linear discrete sets + https://en.wikipedia.org/wiki/Convolution +""" + +@dataclass +class Signal: + """ + A discrete representation of a signal as a n-dimensional vector + + >>>Signal([1,2,3,4,5]) + Signal([1,2,3,4,5]) + >>>Signal([1.0,3.0,2.0,-1.0]) + Signal([1.0,3.0,2.0,-1.0]) + """ + + signal: List[float] = field(default_factory=list) + n : int = 0 + + def __post_init__(self) -> None: + for i in self.signal: + if not isinstance(i, (float,int)): + raise TypeError("vector must be a list of numeric values.") + else: + self.n += 1 + +@dataclass +class DiscreteConvolve1D: + """ + 1D discrete convolution between two linear signals + + >>>s1 = Signal([1,2,3,4,5]) + >>>s2 = Signal([1,-1,2,-3]) + >>>DiscreteConvolve1D(s1,s2) + DiscreteConvolve1D(kern=Signal( # doctest: +NORMALIZE_WHITESPACE + signal=[1, 2, 3, 4, 5], n=5), sig=Signal(signal=[1, -1, 2, -3], n=4)) + """ + + kern: Signal = field(default_factory=Signal) + sig: Signal = field(default_factory=Signal) + + @property + def convolve_1d(self) -> Signal: + conv = Signal() + for i in range(0,self.sig.n): + conv.signal.append(0) + for j in range(0,self.kern.n): + if i + j - floor(self.kern.n/2) < 0 or i + j - floor(self.kern.n/2) >= self.sig.n: + sig_val = 0 + else: + sig_val = self.sig.signal[i + j - floor(self.kern.n/2)] + conv.signal[i] += self.kern.signal[j]*sig_val + conv.n += 1 + return conv From ed7131c23e5e25f7ed53cc5d6a2c0595f269d1c9 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Thu, 7 Dec 2023 03:47:40 +0000 Subject: [PATCH 02/13] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- maths/convolve_1d.py | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/maths/convolve_1d.py b/maths/convolve_1d.py index a69f6d29c526..21b33c7e4fcf 100644 --- a/maths/convolve_1d.py +++ b/maths/convolve_1d.py @@ -7,9 +7,10 @@ """ * Calculate the discrete convolution of two linear discrete sets - https://en.wikipedia.org/wiki/Convolution + https://en.wikipedia.org/wiki/Convolution """ + @dataclass class Signal: """ @@ -22,15 +23,16 @@ class Signal: """ signal: List[float] = field(default_factory=list) - n : int = 0 + n: int = 0 def __post_init__(self) -> None: for i in self.signal: - if not isinstance(i, (float,int)): + if not isinstance(i, (float, int)): raise TypeError("vector must be a list of numeric values.") else: self.n += 1 + @dataclass class DiscreteConvolve1D: """ @@ -49,13 +51,16 @@ class DiscreteConvolve1D: @property def convolve_1d(self) -> Signal: conv = Signal() - for i in range(0,self.sig.n): + for i in range(0, self.sig.n): conv.signal.append(0) - for j in range(0,self.kern.n): - if i + j - floor(self.kern.n/2) < 0 or i + j - floor(self.kern.n/2) >= self.sig.n: + for j in range(0, self.kern.n): + if ( + i + j - floor(self.kern.n / 2) < 0 + or i + j - floor(self.kern.n / 2) >= self.sig.n + ): sig_val = 0 else: - sig_val = self.sig.signal[i + j - floor(self.kern.n/2)] - conv.signal[i] += self.kern.signal[j]*sig_val + sig_val = self.sig.signal[i + j - floor(self.kern.n / 2)] + conv.signal[i] += self.kern.signal[j] * sig_val conv.n += 1 return conv From 1804366107ba7b10a56746eca8a75879df52ed11 Mon Sep 17 00:00:00 2001 From: AlexB Date: Wed, 6 Dec 2023 22:58:29 -0500 Subject: [PATCH 03/13] fixed ruff issues --- maths/convolve_1d.py | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/maths/convolve_1d.py b/maths/convolve_1d.py index a69f6d29c526..b40c9fa48615 100644 --- a/maths/convolve_1d.py +++ b/maths/convolve_1d.py @@ -1,5 +1,5 @@ from __future__ import annotations -import math + from dataclasses import dataclass, field from math import floor @@ -7,7 +7,7 @@ """ * Calculate the discrete convolution of two linear discrete sets - https://en.wikipedia.org/wiki/Convolution + https://en.wikipedia.org/wiki/Convolution """ @dataclass @@ -21,7 +21,7 @@ class Signal: Signal([1.0,3.0,2.0,-1.0]) """ - signal: List[float] = field(default_factory=list) + signal: list[float] = field(default_factory=list) n : int = 0 def __post_init__(self) -> None: @@ -49,10 +49,11 @@ class DiscreteConvolve1D: @property def convolve_1d(self) -> Signal: conv = Signal() - for i in range(0,self.sig.n): + for i in range(self.sig.n): conv.signal.append(0) - for j in range(0,self.kern.n): - if i + j - floor(self.kern.n/2) < 0 or i + j - floor(self.kern.n/2) >= self.sig.n: + for j in range(self.kern.n): + if i + j - floor(self.kern.n/2) < 0 or \ + i + j - floor(self.kern.n/2) >= self.sig.n: sig_val = 0 else: sig_val = self.sig.signal[i + j - floor(self.kern.n/2)] From bfa893b6c6398242080c061998a945f6eb856726 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Thu, 7 Dec 2023 04:09:06 +0000 Subject: [PATCH 04/13] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- maths/convolve_1d.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/maths/convolve_1d.py b/maths/convolve_1d.py index 11dab27df43b..b8c1eb2316ef 100644 --- a/maths/convolve_1d.py +++ b/maths/convolve_1d.py @@ -23,7 +23,7 @@ class Signal: """ signal: list[float] = field(default_factory=list) - n : int = 0 + n: int = 0 def __post_init__(self) -> None: for i in self.signal: From b2e5c9575e17578d22e4b0d6b49578a0b5ae99cb Mon Sep 17 00:00:00 2001 From: AlexB Date: Wed, 6 Dec 2023 23:10:30 -0500 Subject: [PATCH 05/13] fixing ruff errors --- maths/convolve_1d.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/maths/convolve_1d.py b/maths/convolve_1d.py index 11dab27df43b..c987c04cb56e 100644 --- a/maths/convolve_1d.py +++ b/maths/convolve_1d.py @@ -51,9 +51,9 @@ class DiscreteConvolve1D: @property def convolve_1d(self) -> Signal: conv = Signal() - for i in range(0, self.sig.n): + for i in range(self.sig.n): conv.signal.append(0) - for j in range(0, self.kern.n): + for j in range(self.kern.n): if ( i + j - floor(self.kern.n / 2) < 0 or i + j - floor(self.kern.n / 2) >= self.sig.n From a0863de2e1be77eee24f10e226de99148ae79284 Mon Sep 17 00:00:00 2001 From: AlexB Date: Thu, 7 Dec 2023 00:19:08 -0500 Subject: [PATCH 06/13] addressing automated concerns --- maths/convolve_1d.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/maths/convolve_1d.py b/maths/convolve_1d.py index 57d224417437..1aa3dfaeeda3 100644 --- a/maths/convolve_1d.py +++ b/maths/convolve_1d.py @@ -17,9 +17,9 @@ class Signal: A discrete representation of a signal as a n-dimensional vector >>>Signal([1,2,3,4,5]) - Signal([1,2,3,4,5]) + Signal(signal=[1,2,3,4,5],n=5) >>>Signal([1.0,3.0,2.0,-1.0]) - Signal([1.0,3.0,2.0,-1.0]) + Signal(signal=[1.0,3.0,2.0,-1.0],n=4) """ signal: list[float] = field(default_factory=list) From dd1c82753df360f2c732aced96e5aa148bb39794 Mon Sep 17 00:00:00 2001 From: AlexB Date: Thu, 7 Dec 2023 00:23:13 -0500 Subject: [PATCH 07/13] addressing automated concerns --- maths/convolve_1d.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/maths/convolve_1d.py b/maths/convolve_1d.py index 1aa3dfaeeda3..b671d5224b33 100644 --- a/maths/convolve_1d.py +++ b/maths/convolve_1d.py @@ -16,9 +16,9 @@ class Signal: """ A discrete representation of a signal as a n-dimensional vector - >>>Signal([1,2,3,4,5]) + >>> Signal([1,2,3,4,5]) Signal(signal=[1,2,3,4,5],n=5) - >>>Signal([1.0,3.0,2.0,-1.0]) + >>> Signal([1.0,3.0,2.0,-1.0]) Signal(signal=[1.0,3.0,2.0,-1.0],n=4) """ @@ -38,9 +38,9 @@ class DiscreteConvolve1D: """ 1D discrete convolution between two linear signals - >>>s1 = Signal([1,2,3,4,5]) - >>>s2 = Signal([1,-1,2,-3]) - >>>DiscreteConvolve1D(s1,s2) + >>> s1 = Signal([1,2,3,4,5]) + >>> s2 = Signal([1,-1,2,-3]) + >>> DiscreteConvolve1D(s1,s2) DiscreteConvolve1D(kern=Signal( # doctest: +NORMALIZE_WHITESPACE signal=[1, 2, 3, 4, 5], n=5), sig=Signal(signal=[1, -1, 2, -3], n=4)) """ From 09031e828bbf3f34eb8716e4814dbbc820ae74fb Mon Sep 17 00:00:00 2001 From: AlexB Date: Thu, 7 Dec 2023 00:30:26 -0500 Subject: [PATCH 08/13] addressing automated concerns --- maths/convolve_1d.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/maths/convolve_1d.py b/maths/convolve_1d.py index b671d5224b33..e4925c10b98d 100644 --- a/maths/convolve_1d.py +++ b/maths/convolve_1d.py @@ -17,9 +17,9 @@ class Signal: A discrete representation of a signal as a n-dimensional vector >>> Signal([1,2,3,4,5]) - Signal(signal=[1,2,3,4,5],n=5) + Signal(signal=[1, 2, 3, 4, 5], n=5) >>> Signal([1.0,3.0,2.0,-1.0]) - Signal(signal=[1.0,3.0,2.0,-1.0],n=4) + Signal(signal=[1.0, 3.0, 2.0, -1.0], n=4) """ signal: list[float] = field(default_factory=list) @@ -41,7 +41,7 @@ class DiscreteConvolve1D: >>> s1 = Signal([1,2,3,4,5]) >>> s2 = Signal([1,-1,2,-3]) >>> DiscreteConvolve1D(s1,s2) - DiscreteConvolve1D(kern=Signal( # doctest: +NORMALIZE_WHITESPACE + DiscreteConvolve1D(kern=Signal(# doctest: +NORMALIZE_WHITESPACE signal=[1, 2, 3, 4, 5], n=5), sig=Signal(signal=[1, -1, 2, -3], n=4)) """ From 410859507e5c6f6c93f974916bd84ec61e5679f5 Mon Sep 17 00:00:00 2001 From: AlexB Date: Thu, 7 Dec 2023 00:36:49 -0500 Subject: [PATCH 09/13] addressing automated concerns --- maths/convolve_1d.py | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/maths/convolve_1d.py b/maths/convolve_1d.py index e4925c10b98d..ad3d146654c3 100644 --- a/maths/convolve_1d.py +++ b/maths/convolve_1d.py @@ -16,8 +16,6 @@ class Signal: """ A discrete representation of a signal as a n-dimensional vector - >>> Signal([1,2,3,4,5]) - Signal(signal=[1, 2, 3, 4, 5], n=5) >>> Signal([1.0,3.0,2.0,-1.0]) Signal(signal=[1.0, 3.0, 2.0, -1.0], n=4) """ @@ -40,9 +38,9 @@ class DiscreteConvolve1D: >>> s1 = Signal([1,2,3,4,5]) >>> s2 = Signal([1,-1,2,-3]) - >>> DiscreteConvolve1D(s1,s2) - DiscreteConvolve1D(kern=Signal(# doctest: +NORMALIZE_WHITESPACE - signal=[1, 2, 3, 4, 5], n=5), sig=Signal(signal=[1, -1, 2, -3], n=4)) + >>> DiscreteConvolve1D(s1,s2) # doctest: +NORMALIZE_WHITESPACE + DiscreteConvolve1D(kern=Signal(signal=[1, 2, 3, 4, 5], n=5), + sig=Signal(signal=[1, -1, 2, -3], n=4)) """ kern: Signal = field(default_factory=Signal) From c7c8e6a3790b905bcd37665b760f6ddd2501d52d Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Thu, 7 Dec 2023 05:37:28 +0000 Subject: [PATCH 10/13] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- maths/convolve_1d.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/maths/convolve_1d.py b/maths/convolve_1d.py index ad3d146654c3..479a1919497d 100644 --- a/maths/convolve_1d.py +++ b/maths/convolve_1d.py @@ -39,7 +39,7 @@ class DiscreteConvolve1D: >>> s1 = Signal([1,2,3,4,5]) >>> s2 = Signal([1,-1,2,-3]) >>> DiscreteConvolve1D(s1,s2) # doctest: +NORMALIZE_WHITESPACE - DiscreteConvolve1D(kern=Signal(signal=[1, 2, 3, 4, 5], n=5), + DiscreteConvolve1D(kern=Signal(signal=[1, 2, 3, 4, 5], n=5), sig=Signal(signal=[1, -1, 2, -3], n=4)) """ From 8e8df9a2de9b889b00e24ca2ac7c2c3141b1ba65 Mon Sep 17 00:00:00 2001 From: AlexB Date: Thu, 7 Dec 2023 00:46:12 -0500 Subject: [PATCH 11/13] addressing automated concerns --- maths/convolve_1d.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/maths/convolve_1d.py b/maths/convolve_1d.py index ad3d146654c3..88139653897d 100644 --- a/maths/convolve_1d.py +++ b/maths/convolve_1d.py @@ -56,9 +56,9 @@ def convolve_1d(self) -> Signal: i + j - floor(self.kern.n / 2) < 0 or i + j - floor(self.kern.n / 2) >= self.sig.n ): - sig_val = 0 + sig_val = 0.0 else: - sig_val = self.sig.signal[i + j - floor(self.kern.n / 2)] + sig_val = float(self.sig.signal[i + j - floor(self.kern.n / 2)]) conv.signal[i] += self.kern.signal[j] * sig_val conv.n += 1 return conv From ce34eb942abcf7fefe5069d87bb0753014a2da81 Mon Sep 17 00:00:00 2001 From: cclauss Date: Tue, 8 Sep 2026 12:50:38 +0000 Subject: [PATCH 12/13] updating DIRECTORY.md --- DIRECTORY.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/DIRECTORY.md b/DIRECTORY.md index 6d098f1f845a..e91db5292f2c 100644 --- a/DIRECTORY.md +++ b/DIRECTORY.md @@ -724,6 +724,7 @@ * [Collatz Sequence](maths/collatz_sequence.py) * [Combinations](maths/combinations.py) * [Continued Fraction](maths/continued_fraction.py) + * [Convolve 1D](maths/convolve_1d.py) * [Decimal Isolate](maths/decimal_isolate.py) * [Decimal To Fraction](maths/decimal_to_fraction.py) * [Dodecahedron](maths/dodecahedron.py) @@ -876,6 +877,7 @@ * [Two Pointer](maths/two_pointer.py) * [Two Sum](maths/two_sum.py) * [Volume](maths/volume.py) + * [Weighted Average](maths/weighted_average.py) * [Zellers Congruence](maths/zellers_congruence.py) ## [Matrix](matrix) From d69eb34bfbf8255e7bcc97ef082e5372f23fe128 Mon Sep 17 00:00:00 2001 From: Christian Clauss Date: Tue, 8 Sep 2026 14:58:25 +0200 Subject: [PATCH 13/13] Apply suggestion from @cclauss --- maths/convolve_1d.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/maths/convolve_1d.py b/maths/convolve_1d.py index 09e27e6e72b7..34565a1932d9 100644 --- a/maths/convolve_1d.py +++ b/maths/convolve_1d.py @@ -1,5 +1,3 @@ -from __future__ import annotations - from dataclasses import dataclass, field from math import floor