Skip to content
Snippets Groups Projects
Commit 673d0f01 authored by Sepehr Madani's avatar Sepehr Madani
Browse files

Fix logic error in args for compute_pattern

parent aeea54c9
No related branches found
No related tags found
No related merge requests found
from math import pi, cos, sin, radians from math import pi, cos, sin, radians, log10, nan
from cmath import exp, phase from cmath import exp, phase
from .base_algorithm import BaseAlgorithm from .base_algorithm import BaseAlgorithm
...@@ -25,51 +25,53 @@ class ButterflyAlgorithm(BaseAlgorithm): ...@@ -25,51 +25,53 @@ class ButterflyAlgorithm(BaseAlgorithm):
super().check_parameters() super().check_parameters()
assert len(self.null_degrees) == 1 assert len(self.null_degrees) == 1
def get_pattern(self): def update_pattern(self):
pattern_values = compute_pattern( pattern_values = compute_pattern(
N=self.N, N=self.N,
k=self.k, k=self.k,
weights=[exp(1j * x) for x in self.vector_changes], weights=[exp(1j * -x) for x in self.vector_changes],
degrees=self.null_degrees, degrees=self.null_degrees,
use_absolute_value=False use_absolute_value=False
) )
self.pattern = pattern_values[0].conjugate() self.pattern = pattern_values[0].conjugate()
print(f'{abs(self.pattern) = }')
def solve(self): def solve(self):
alpha = (2*pi) / (2**self.bit_resolution) alpha = (2*pi) / (2**self.bit_resolution)
self.null_deg = self.null_degrees[0] self.null_deg = self.null_degrees[0]
self.theta = pi * cos(radians(self.null_deg)) self.theta = pi * cos(radians(self.null_deg))
self.sum_dir = self.theta * (self.N - 1) / 2 self.vector_dirs = [wrapToPi(k * self.theta) for k in range(self.N)]
self.vector_dirs = [k * self.theta for k in range(self.N)] self.sum_dir = wrapToPi(phase(sum([exp(1j* x) for x in self.vector_dirs])))
self.vector_diffs = vectorWrapToPi([x - self.sum_dir for x in self.vector_dirs]) self.vector_changes = [0.0 for _ in range(self.N)]
self.vector_changes = [0 for _ in range(self.N)]
self.get_pattern() self.update_pattern()
hasTurned = False before_loop_pattern = nan
while not hasTurned: while before_loop_pattern != self.pattern:
for idx in range(self.N // 2): before_loop_pattern = self.pattern
old_change = self.vector_changes[:] for idx in range(self.N // 2): # index for half the vectors
other = self.N - 1 - idx original_vector_changes = self.vector_changes[:]
angle_with_sum = wrapToPi(self.vector_diffs[idx] + self.vector_changes[idx]) original_pattern = self.pattern
other = self.N - 1 - idx # the other vector, symmteric to vector[idx] wrt sum
angle_with_sum = wrapToPi(self.vector_dirs[idx] + self.vector_changes[idx] - self.sum_dir)
if 0 <= angle_with_sum < pi - alpha/2: if 0 <= angle_with_sum < pi - alpha/2: # the vector is after the sum direction (left half)
self.vector_changes[idx] += alpha self.vector_changes[idx] += alpha
self.vector_changes[other] -= alpha self.vector_changes[other] -= alpha
elif -pi + alpha/2 < angle_with_sum <= 0: elif -pi + alpha/2 < angle_with_sum <= 0: # the vector is before the sum direction (right half)
self.vector_changes[idx] -= alpha self.vector_changes[idx] -= alpha
self.vector_changes[other] += alpha self.vector_changes[other] += alpha
self.vector_diffs = vectorWrapToPi(self.vector_diffs)
self.vector_changes = vectorWrapToPi(self.vector_changes) self.vector_changes = vectorWrapToPi(self.vector_changes)
self.get_pattern() self.update_pattern()
if (hasTurned := abs(cos(phase(self.pattern) - self.sum_dir) + 1) < 1e-9): patternDirectionTurned = abs(cos(phase(self.pattern) - self.sum_dir) + 1) < 1e-9
break if (patternDirectionTurned):
if abs(original_pattern) < abs(self.pattern):
self.vector_changes = old_change[:] self.vector_changes = original_vector_changes[:]
self.get_pattern() self.update_pattern()
# print(f'\nFinal pattern value: {abs(self.pattern) = }'
# f'\nFinal score: {-20 * log10(abs(self.pattern))}')
return -20 * log10(abs(self.pattern))
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment