| import torch |
| from safetensors.torch import save_file |
|
|
| weights = {} |
|
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
|
|
| def add_xor2_weights(prefix, idx_a, idx_b, total_inputs): |
| """Add weights for XOR(a, b) from direct inputs.""" |
| w_or = [0.0] * total_inputs |
| w_or[idx_a] = 1.0 |
| w_or[idx_b] = 1.0 |
| weights[f'{prefix}.or.weight'] = torch.tensor([w_or], dtype=torch.float32) |
| weights[f'{prefix}.or.bias'] = torch.tensor([-1.0], dtype=torch.float32) |
|
|
| w_nand = [0.0] * total_inputs |
| w_nand[idx_a] = -1.0 |
| w_nand[idx_b] = -1.0 |
| weights[f'{prefix}.nand.weight'] = torch.tensor([w_nand], dtype=torch.float32) |
| weights[f'{prefix}.nand.bias'] = torch.tensor([1.0], dtype=torch.float32) |
|
|
| weights[f'{prefix}.and.weight'] = torch.tensor([[1.0, 1.0]], dtype=torch.float32) |
| weights[f'{prefix}.and.bias'] = torch.tensor([-2.0], dtype=torch.float32) |
|
|
| def add_xor2_stage_weights(prefix): |
| """Add weights for XOR of two intermediate signals.""" |
| weights[f'{prefix}.or.weight'] = torch.tensor([[1.0, 1.0]], dtype=torch.float32) |
| weights[f'{prefix}.or.bias'] = torch.tensor([-1.0], dtype=torch.float32) |
| weights[f'{prefix}.nand.weight'] = torch.tensor([[-1.0, -1.0]], dtype=torch.float32) |
| weights[f'{prefix}.nand.bias'] = torch.tensor([1.0], dtype=torch.float32) |
| weights[f'{prefix}.and.weight'] = torch.tensor([[1.0, 1.0]], dtype=torch.float32) |
| weights[f'{prefix}.and.bias'] = torch.tensor([-2.0], dtype=torch.float32) |
|
|
| |
| |
| add_xor2_weights('p1.x12', 0, 1, 11) |
| add_xor2_weights('p1.x45', 3, 4, 11) |
| add_xor2_weights('p1.x79', 6, 8, 11) |
| add_xor2_stage_weights('p1.x1245') |
| add_xor2_stage_weights('p1.x79_11') |
| add_xor2_stage_weights('p1.final') |
|
|
| |
| add_xor2_weights('p2.x13', 0, 2, 11) |
| add_xor2_weights('p2.x46', 3, 5, 11) |
| add_xor2_weights('p2.x7_10', 6, 9, 11) |
| add_xor2_stage_weights('p2.x1346') |
| add_xor2_stage_weights('p2.x7_10_11') |
| add_xor2_stage_weights('p2.final') |
|
|
| |
| add_xor2_weights('p4.x23', 1, 2, 11) |
| add_xor2_weights('p4.x34', 2, 3, 11) |
| |
| add_xor2_weights('p4.x23', 1, 2, 11) |
| add_xor2_weights('p4.x48', 3, 7, 11) |
| add_xor2_weights('p4.x9_10', 8, 9, 11) |
| add_xor2_stage_weights('p4.x2348') |
| add_xor2_stage_weights('p4.x9_10_11') |
| add_xor2_stage_weights('p4.final') |
|
|
| |
| add_xor2_weights('p8.x56', 4, 5, 11) |
| add_xor2_weights('p8.x78', 6, 7, 11) |
| add_xor2_weights('p8.x9_10', 8, 9, 11) |
| add_xor2_stage_weights('p8.x5678') |
| add_xor2_stage_weights('p8.x9_10_11') |
| add_xor2_stage_weights('p8.final') |
|
|
| |
| for i in range(11): |
| w = [0.0] * 11 |
| w[i] = 1.0 |
| weights[f'd{i+1}.weight'] = torch.tensor([w], dtype=torch.float32) |
| weights[f'd{i+1}.bias'] = torch.tensor([-1.0], dtype=torch.float32) |
|
|
| save_file(weights, 'model.safetensors') |
|
|
| def xor2(a, b): |
| return a ^ b |
|
|
| def parity7(bits): |
| result = 0 |
| for b in bits: |
| result ^= b |
| return result |
|
|
| def hamming1511_encode_ref(d): |
| """Reference implementation.""" |
| d1, d2, d3, d4, d5, d6, d7, d8, d9, d10, d11 = d |
| p1 = parity7([d1, d2, d4, d5, d7, d9, d11]) |
| p2 = parity7([d1, d3, d4, d6, d7, d10, d11]) |
| p4 = parity7([d2, d3, d4, d8, d9, d10, d11]) |
| p8 = parity7([d5, d6, d7, d8, d9, d10, d11]) |
| return [p1, p2, d1, p4, d2, d3, d4, p8, d5, d6, d7, d8, d9, d10, d11] |
|
|
| print("Verifying Hamming(15,11) Encoder reference...") |
| print("Data bits -> Encoded (15 bits)") |
| print("-" * 50) |
|
|
| for i in range(32): |
| bits = [(i >> j) & 1 for j in range(11)] |
| encoded = hamming1511_encode_ref(bits) |
| data_str = ''.join(map(str, bits)) |
| enc_str = ''.join(map(str, encoded)) |
| print(f"{data_str} -> {enc_str}") |
|
|
| mag = sum(t.abs().sum().item() for t in weights.values()) |
| print(f"\nMagnitude: {mag:.0f}") |
| print(f"Parameters: {sum(t.numel() for t in weights.values())}") |
| print(f"Neurons: {len([k for k in weights.keys() if 'weight' in k])}") |
|
|