77 lines
1.8 KiB
Python
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
|