Synaptopus/tests/test_adaline.py

77 lines
1.8 KiB
Python

from __future__ import annotations
import random
from synaptopus.adaline import AdalineNetwork, MadalineNetwork
def test_adaline_learns_bipolar_and() -> None:
network = AdalineNetwork.random(
input_size=2,
learning_rate=0.2,
rng=random.Random(5),
)
samples = (
((-1.0, -1.0), -1.0),
((-1.0, 1.0), -1.0),
((1.0, -1.0), -1.0),
((1.0, 1.0), 1.0),
)
for _ in range(30):
for inputs, target in samples:
network.train_step(inputs, target)
predictions = {
inputs: network.classify(inputs)
for inputs, _ in samples
}
assert predictions[(-1.0, -1.0)] == -1
assert predictions[(-1.0, 1.0)] == -1
assert predictions[(1.0, -1.0)] == -1
assert predictions[(1.0, 1.0)] == 1
def test_adaline_round_trips_through_dict() -> None:
network = AdalineNetwork.random(
input_size=3,
learning_rate=0.15,
rng=random.Random(8),
)
restored = AdalineNetwork.from_dict(network.to_dict())
assert restored.input_size == network.input_size
assert restored.weights == network.weights
assert restored.bias == network.bias
def test_madaline_learns_bipolar_or() -> None:
network = MadalineNetwork.random(
input_size=2,
hidden_unit_count=2,
learning_rate=0.15,
rng=random.Random(9),
)
samples = (
((-1.0, -1.0), -1),
((-1.0, 1.0), 1),
((1.0, -1.0), 1),
((1.0, 1.0), 1),
)
for _ in range(60):
for inputs, target in samples:
network.train_step(inputs, target)
predictions = {
inputs: network.classify(inputs)
for inputs, _ in samples
}
assert predictions[(-1.0, -1.0)] == -1
assert predictions[(-1.0, 1.0)] == 1
assert predictions[(1.0, -1.0)] == 1
assert predictions[(1.0, 1.0)] == 1