Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
38 changes: 38 additions & 0 deletions src/control_test/task1.py
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Я не понимаю этот код. Но это очень сильно не похоже на хему Уолкера

Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
import random


class Walker:
def __init__(self, events):
self.events = [] # events = [(event, probability)]
self.n = len(events)
self.probabil = [0] * self.n
self.alias = [0] * self.n

probs = []
sumprob = 0
for event, p in events:
if p < 0:
raise ValueError("вероятность должна быть положительна")
self.events.append(event)
probs.append(p)
sumprob += p

if sumprob != 1.0:
raise ValueError("сумма вероятностей должна быть = 1")

wal = [p * self.n for p in probs]

for i in range(self.n):
if wal[i] >= 1:
self.probabil[i] = 1
self.alias[i] = i
else:
self.prob[i] = wal[i]
self.alias[i] = (i + 1) % self.n

def get_random(self):
i = random.randint(0, self.n - 1)
if random.random() < self.probabil[i]:
return self.events[i]
else:
return self.events[self.alias[i]]
22 changes: 22 additions & 0 deletions src/control_test/task2.py
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Кажется, это не совсем то. Мы должны ставить контрольные биты на индексы степеней двойки

Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
def hamming_encode(bits):
result = ""
for i in range(0, len(bits), 4):
d = list(map(int, bits[i : i + 4]))
p1 = d[0] ^ d[1] ^ d[3]
p2 = d[0] ^ d[2] ^ d[3]
p3 = d[1] ^ d[2] ^ d[3]
result += f"{p1}{p2}{d[0]}{p3}{d[1]}{d[2]}{d[3]}"
return result


def hamming_decode(bits):
bits = list(map(int, bits))
for i in range(0, len(bits), 7):
b = bits[i : i + 7]
s1 = b[0] ^ b[2] ^ b[4] ^ b[6]
s2 = b[1] ^ b[2] ^ b[5] ^ b[6]
s3 = b[3] ^ b[4] ^ b[5] ^ b[6]
error = s1 * 1 + s2 * 2 + s3 * 4
if error != 0:
return i + error
return -1
12 changes: 12 additions & 0 deletions tests/test_control_task1.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
import pytest
from src.control_test.task1 import Walker


def test_negative():
with pytest.raises(ValueError):
Walker([("A", 0.5), ("B", -0.5)])


def test_sum_not_one():
with pytest.raises(ValueError):
Walker([("A", 0.6), ("B", 0.3)])
9 changes: 9 additions & 0 deletions tests/test_control_task2.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
import pytest
from src.control_test.task2 import hamming_encode
from src.control_test.task2 import hamming_decode


def test_encode_decode():
bits = "10110011"
encoded = hamming_encode(bits)
assert hamming_decode(encoded) == -1