File size: 3,342 Bytes
3af1a71
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
---

license: mit
tags:
- pytorch
- safetensors
- threshold-logic
- neuromorphic
- arithmetic
---


# threshold-halfsubtractor

Subtracts two 1-bit inputs, producing difference and borrow. The subtraction counterpart to the half adder.

## Circuit

```

      a       b                    a   b

      β”‚       β”‚                    β”‚   β”‚

      β”œβ”€β”€β”€β”¬β”€β”€β”€β”€                    β””β”€β”¬β”€β”˜

      β”‚   β”‚   β”‚                      β”‚

      β–Ό   β”‚   β–Ό                      β–Ό

  β”Œβ”€β”€β”€β”€β”€β”€β”β”‚β”Œβ”€β”€β”€β”€β”€β”€β”              β”Œβ”€β”€β”€β”€β”€β”€β”€β”

  β”‚  OR  β”‚β”‚β”‚ NAND β”‚              β”‚ Β¬a ∧ bβ”‚

  β”‚w:1,1 β”‚β”‚β”‚w:-1,-1β”‚             β”‚w:-1,1 β”‚

  β”‚b: -1 β”‚β”‚β”‚b: +1 β”‚              β”‚b: -1  β”‚

  β””β”€β”€β”€β”€β”€β”€β”˜β”‚β””β”€β”€β”€β”€β”€β”€β”˜              β””β”€β”€β”€β”€β”€β”€β”€β”˜

      β”‚   β”‚   β”‚                      β”‚

      β””β”€β”€β”€β”Όβ”€β”€β”€β”˜                      β”‚

          β–Ό                          β”‚

      β”Œβ”€β”€β”€β”€β”€β”€β”                       β”‚

      β”‚ AND  β”‚                       β”‚

      β”‚w: 1,1β”‚                       β”‚

      β”‚b: -2 β”‚                       β”‚

      β””β”€β”€β”€β”€β”€β”€β”˜                       β”‚

          β”‚                          β”‚

          β–Ό                          β–Ό

        diff                      borrow

```

The diff output uses XOR (2 layers). The borrow output detects when we subtract 1 from 0.

## Truth Table

| a | b | diff | borrow |
|---|---|------|--------|
| 0 | 0 | 0 | 0 |
| 0 | 1 | 1 | 1 |
| 1 | 0 | 1 | 0 |
| 1 | 1 | 0 | 0 |

Binary: a - b = diff - (borrow Γ— 2)

## Mechanism

**Diff (XOR):** Same as the half adder's sum. The difference bit is 1 when exactly one input is 1.

**Borrow:** Uses weights [-1, +1] with bias -1. This fires only when a=0 and b=1:
- a=0, b=0: -0 + 0 - 1 = -1 < 0 β†’ no borrow
- a=0, b=1: -0 + 1 - 1 = 0 β‰₯ 0 β†’ borrow
- a=1, b=0: -1 + 0 - 1 = -2 < 0 β†’ no borrow
- a=1, b=1: -1 + 1 - 1 = -1 < 0 β†’ no borrow

The borrow is NOT(a) AND b - we borrow when subtracting 1 from 0.

## Components

| Output | Function | Neurons | Layers |
|--------|----------|---------|--------|
| diff | XOR(a, b) | 3 | 2 |
| borrow | ¬a ∧ b | 1 | 1 |

**Total: 4 neurons, 12 parameters**

## Contrast with Half Adder

| Circuit | Output 2 | Function | Weights |
|---------|----------|----------|---------|
| HalfAdder | carry | a ∧ b | [1, 1], b=-2 |
| HalfSubtractor | borrow | ¬a ∧ b | [-1, 1], b=-1 |

The only difference: borrow has an inhibitory weight on a.

## Usage

```python

from safetensors.torch import load_file

import torch



w = load_file('model.safetensors')



def half_subtractor(a, b):

    inp = torch.tensor([float(a), float(b)])



    # XOR for diff

    l1 = (inp @ w['xor.layer1.weight'].T + w['xor.layer1.bias'] >= 0).float()

    diff = int((l1 @ w['xor.layer2.weight'].T + w['xor.layer2.bias'] >= 0).item())



    # Borrow

    borrow = int((inp @ w['borrow.weight'].T + w['borrow.bias'] >= 0).item())



    return diff, borrow

```

## Files

```

threshold-halfsubtractor/

β”œβ”€β”€ model.safetensors

β”œβ”€β”€ model.py

β”œβ”€β”€ config.json

└── README.md

```

## License

MIT