Upload folder using huggingface_hub
Browse files- README.md +171 -0
- config.json +9 -0
- create_safetensors.py +102 -0
- model.py +39 -0
- model.safetensors +3 -0
README.md
ADDED
|
@@ -0,0 +1,171 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
---
|
| 2 |
+
license: mit
|
| 3 |
+
tags:
|
| 4 |
+
- pytorch
|
| 5 |
+
- safetensors
|
| 6 |
+
- threshold-logic
|
| 7 |
+
- neuromorphic
|
| 8 |
+
- popcount
|
| 9 |
+
- bit-counting
|
| 10 |
+
---
|
| 11 |
+
|
| 12 |
+
# threshold-popcount3
|
| 13 |
+
|
| 14 |
+
3-bit population count (Hamming weight). Counts the number of 1-bits in a 3-bit input, producing a 2-bit output (0-3).
|
| 15 |
+
|
| 16 |
+
## Circuit
|
| 17 |
+
|
| 18 |
+
```
|
| 19 |
+
x0 x1 x2
|
| 20 |
+
│ │ │
|
| 21 |
+
└───┬───┴───┬───┘
|
| 22 |
+
│ │
|
| 23 |
+
┌────┴────┐ │
|
| 24 |
+
│ Layer 1 │ │
|
| 25 |
+
│ atleast1│ │ (sum >= 1)
|
| 26 |
+
│ atleast2│ │ (sum >= 2)
|
| 27 |
+
│ atleast3├──┘ (sum >= 3)
|
| 28 |
+
└────┬────┘
|
| 29 |
+
│
|
| 30 |
+
┌────┴────┐
|
| 31 |
+
│ Layer 2 │
|
| 32 |
+
│ XOR │ out1 = atleast1 XOR atleast2
|
| 33 |
+
│ pass │ out0 = atleast2 XOR atleast3
|
| 34 |
+
└────┬────┘
|
| 35 |
+
│
|
| 36 |
+
▼
|
| 37 |
+
[out1, out0]
|
| 38 |
+
```
|
| 39 |
+
|
| 40 |
+
## Function
|
| 41 |
+
|
| 42 |
+
```
|
| 43 |
+
popcount3(x0, x1, x2) -> (out1, out0)
|
| 44 |
+
|
| 45 |
+
where output = 2*out1 + out0 = number of 1-bits in input
|
| 46 |
+
```
|
| 47 |
+
|
| 48 |
+
## Truth Table
|
| 49 |
+
|
| 50 |
+
| x0 | x1 | x2 | Count | out1 | out0 |
|
| 51 |
+
|:--:|:--:|:--:|:-----:|:----:|:----:|
|
| 52 |
+
| 0 | 0 | 0 | 0 | 0 | 0 |
|
| 53 |
+
| 0 | 0 | 1 | 1 | 0 | 1 |
|
| 54 |
+
| 0 | 1 | 0 | 1 | 0 | 1 |
|
| 55 |
+
| 0 | 1 | 1 | 2 | 1 | 0 |
|
| 56 |
+
| 1 | 0 | 0 | 1 | 0 | 1 |
|
| 57 |
+
| 1 | 0 | 1 | 2 | 1 | 0 |
|
| 58 |
+
| 1 | 1 | 0 | 2 | 1 | 0 |
|
| 59 |
+
| 1 | 1 | 1 | 3 | 1 | 1 |
|
| 60 |
+
|
| 61 |
+
## Mechanism
|
| 62 |
+
|
| 63 |
+
The circuit uses threshold gates to detect "at least k" conditions, then XOR gates to convert to binary:
|
| 64 |
+
|
| 65 |
+
**Layer 1 - Threshold Detection:**
|
| 66 |
+
|
| 67 |
+
| Gate | Weights | Bias | Fires when |
|
| 68 |
+
|------|---------|------|------------|
|
| 69 |
+
| atleast1 | [1,1,1] | -1 | sum >= 1 |
|
| 70 |
+
| atleast2 | [1,1,1] | -2 | sum >= 2 |
|
| 71 |
+
| atleast3 | [1,1,1] | -3 | sum >= 3 |
|
| 72 |
+
|
| 73 |
+
**Layer 2 - Binary Encoding:**
|
| 74 |
+
|
| 75 |
+
The key insight: binary output bits can be computed from threshold outputs:
|
| 76 |
+
|
| 77 |
+
- **out1** (2's place) = atleast2 XOR atleast3 = (sum >= 2) XOR (sum >= 3)
|
| 78 |
+
- True when sum is exactly 2 or 3
|
| 79 |
+
- Actually: out1 = atleast2 (since atleast3 implies atleast2)
|
| 80 |
+
- Simplified: out1 = atleast2
|
| 81 |
+
|
| 82 |
+
- **out0** (1's place) = atleast1 XOR atleast2 XOR atleast3
|
| 83 |
+
- True when sum is 1 or 3 (odd from {1,2,3} perspective)
|
| 84 |
+
- Simplified: out0 = parity of threshold outputs
|
| 85 |
+
|
| 86 |
+
Actually, simpler encoding:
|
| 87 |
+
- out1 = atleast2
|
| 88 |
+
- out0 = atleast1 XOR atleast2
|
| 89 |
+
|
| 90 |
+
## Architecture
|
| 91 |
+
|
| 92 |
+
| Layer | Components | Neurons |
|
| 93 |
+
|-------|------------|---------|
|
| 94 |
+
| 1 | atleast1, atleast2, atleast3 | 3 |
|
| 95 |
+
| 2-3 | XOR for out0 | 3 |
|
| 96 |
+
|
| 97 |
+
**Total: 6 neurons**
|
| 98 |
+
|
| 99 |
+
Alternative simpler design:
|
| 100 |
+
- out1 = atleast2 (direct wire, 0 extra neurons)
|
| 101 |
+
- out0 = atleast1 XOR atleast2 (3 neurons for XOR)
|
| 102 |
+
|
| 103 |
+
**Using direct threshold for out1:** 4 neurons total
|
| 104 |
+
|
| 105 |
+
## Parameters
|
| 106 |
+
|
| 107 |
+
| | |
|
| 108 |
+
|---|---|
|
| 109 |
+
| Inputs | 3 |
|
| 110 |
+
| Outputs | 2 |
|
| 111 |
+
| Neurons | 6 |
|
| 112 |
+
| Layers | 3 |
|
| 113 |
+
| Parameters | 21 |
|
| 114 |
+
| Magnitude | 22 |
|
| 115 |
+
|
| 116 |
+
## Usage
|
| 117 |
+
|
| 118 |
+
```python
|
| 119 |
+
from safetensors.torch import load_file
|
| 120 |
+
import torch
|
| 121 |
+
|
| 122 |
+
w = load_file('model.safetensors')
|
| 123 |
+
|
| 124 |
+
def popcount3(x0, x1, x2):
|
| 125 |
+
inp = torch.tensor([float(x0), float(x1), float(x2)])
|
| 126 |
+
|
| 127 |
+
# Layer 1: Threshold detection
|
| 128 |
+
at1 = int((inp @ w['atleast1.weight'].T + w['atleast1.bias'] >= 0).item())
|
| 129 |
+
at2 = int((inp @ w['atleast2.weight'].T + w['atleast2.bias'] >= 0).item())
|
| 130 |
+
|
| 131 |
+
# out1 = atleast2 (sum >= 2 means bit 1 is set)
|
| 132 |
+
out1 = at2
|
| 133 |
+
|
| 134 |
+
# out0 = atleast1 XOR atleast2
|
| 135 |
+
l1 = torch.tensor([float(at1), float(at2)])
|
| 136 |
+
or_out = int((l1 @ w['xor.or.weight'].T + w['xor.or.bias'] >= 0).item())
|
| 137 |
+
nand_out = int((l1 @ w['xor.nand.weight'].T + w['xor.nand.bias'] >= 0).item())
|
| 138 |
+
l2 = torch.tensor([float(or_out), float(nand_out)])
|
| 139 |
+
out0 = int((l2 @ w['xor.and.weight'].T + w['xor.and.bias'] >= 0).item())
|
| 140 |
+
|
| 141 |
+
return out1, out0
|
| 142 |
+
|
| 143 |
+
# Examples
|
| 144 |
+
print(popcount3(0, 0, 0)) # (0, 0) = 0
|
| 145 |
+
print(popcount3(1, 0, 0)) # (0, 1) = 1
|
| 146 |
+
print(popcount3(1, 1, 0)) # (1, 0) = 2
|
| 147 |
+
print(popcount3(1, 1, 1)) # (1, 1) = 3
|
| 148 |
+
```
|
| 149 |
+
|
| 150 |
+
## Applications
|
| 151 |
+
|
| 152 |
+
- Hamming distance calculation
|
| 153 |
+
- Set cardinality in bit vectors
|
| 154 |
+
- Error weight computation
|
| 155 |
+
- Branch prediction (counting set bits)
|
| 156 |
+
- Cryptographic operations
|
| 157 |
+
|
| 158 |
+
## Files
|
| 159 |
+
|
| 160 |
+
```
|
| 161 |
+
threshold-popcount3/
|
| 162 |
+
├── model.safetensors
|
| 163 |
+
├── model.py
|
| 164 |
+
├── create_safetensors.py
|
| 165 |
+
├── config.json
|
| 166 |
+
└── README.md
|
| 167 |
+
```
|
| 168 |
+
|
| 169 |
+
## License
|
| 170 |
+
|
| 171 |
+
MIT
|
config.json
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"name": "threshold-popcount3",
|
| 3 |
+
"description": "3-bit population count (Hamming weight)",
|
| 4 |
+
"inputs": 3,
|
| 5 |
+
"outputs": 2,
|
| 6 |
+
"neurons": 6,
|
| 7 |
+
"layers": 3,
|
| 8 |
+
"parameters": 21
|
| 9 |
+
}
|
create_safetensors.py
ADDED
|
@@ -0,0 +1,102 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import torch
|
| 2 |
+
from safetensors.torch import save_file
|
| 3 |
+
|
| 4 |
+
weights = {}
|
| 5 |
+
|
| 6 |
+
# 3-bit Population Count
|
| 7 |
+
# Inputs: x0, x1, x2
|
| 8 |
+
# Outputs: out1, out0 where 2*out1 + out0 = popcount
|
| 9 |
+
#
|
| 10 |
+
# Strategy:
|
| 11 |
+
# - atleast1: fires when sum >= 1
|
| 12 |
+
# - atleast2: fires when sum >= 2
|
| 13 |
+
# - out1 = atleast2 (2 or more bits set)
|
| 14 |
+
# - out0 = atleast1 XOR atleast2 (exactly 1 bit, or 3 bits)
|
| 15 |
+
|
| 16 |
+
# Layer 1: Threshold gates
|
| 17 |
+
weights['atleast1.weight'] = torch.tensor([[1.0, 1.0, 1.0]], dtype=torch.float32)
|
| 18 |
+
weights['atleast1.bias'] = torch.tensor([-1.0], dtype=torch.float32)
|
| 19 |
+
|
| 20 |
+
weights['atleast2.weight'] = torch.tensor([[1.0, 1.0, 1.0]], dtype=torch.float32)
|
| 21 |
+
weights['atleast2.bias'] = torch.tensor([-2.0], dtype=torch.float32)
|
| 22 |
+
|
| 23 |
+
# out1 = atleast2 (we'll pass through, but for completeness include atleast3)
|
| 24 |
+
weights['atleast3.weight'] = torch.tensor([[1.0, 1.0, 1.0]], dtype=torch.float32)
|
| 25 |
+
weights['atleast3.bias'] = torch.tensor([-3.0], dtype=torch.float32)
|
| 26 |
+
|
| 27 |
+
# XOR gate for out0 = atleast1 XOR atleast2
|
| 28 |
+
weights['xor.or.weight'] = torch.tensor([[1.0, 1.0]], dtype=torch.float32)
|
| 29 |
+
weights['xor.or.bias'] = torch.tensor([-1.0], dtype=torch.float32)
|
| 30 |
+
weights['xor.nand.weight'] = torch.tensor([[-1.0, -1.0]], dtype=torch.float32)
|
| 31 |
+
weights['xor.nand.bias'] = torch.tensor([1.0], dtype=torch.float32)
|
| 32 |
+
weights['xor.and.weight'] = torch.tensor([[1.0, 1.0]], dtype=torch.float32)
|
| 33 |
+
weights['xor.and.bias'] = torch.tensor([-2.0], dtype=torch.float32)
|
| 34 |
+
|
| 35 |
+
save_file(weights, 'model.safetensors')
|
| 36 |
+
|
| 37 |
+
def popcount3(x0, x1, x2):
|
| 38 |
+
inp = torch.tensor([float(x0), float(x1), float(x2)])
|
| 39 |
+
|
| 40 |
+
at1 = int((inp @ weights['atleast1.weight'].T + weights['atleast1.bias'] >= 0).item())
|
| 41 |
+
at2 = int((inp @ weights['atleast2.weight'].T + weights['atleast2.bias'] >= 0).item())
|
| 42 |
+
at3 = int((inp @ weights['atleast3.weight'].T + weights['atleast3.bias'] >= 0).item())
|
| 43 |
+
|
| 44 |
+
# out1 = atleast2 XOR atleast3 = atleast2 AND NOT atleast3 (since at3 implies at2)
|
| 45 |
+
# Actually: out1 = at2 (for counts 2 and 3)
|
| 46 |
+
# Wait, let me think again:
|
| 47 |
+
# count=0: at1=0, at2=0, at3=0 -> out1=0, out0=0
|
| 48 |
+
# count=1: at1=1, at2=0, at3=0 -> out1=0, out0=1
|
| 49 |
+
# count=2: at1=1, at2=1, at3=0 -> out1=1, out0=0
|
| 50 |
+
# count=3: at1=1, at2=1, at3=1 -> out1=1, out0=1
|
| 51 |
+
|
| 52 |
+
# out1 = at2 (for binary encoding, bit 1 is set when count >= 2)
|
| 53 |
+
out1 = at2
|
| 54 |
+
|
| 55 |
+
# out0 = at1 XOR at2 XOR at3? Let's check:
|
| 56 |
+
# count=0: 0 XOR 0 XOR 0 = 0 ✓
|
| 57 |
+
# count=1: 1 XOR 0 XOR 0 = 1 ✓
|
| 58 |
+
# count=2: 1 XOR 1 XOR 0 = 0 ✓
|
| 59 |
+
# count=3: 1 XOR 1 XOR 1 = 1 ✓
|
| 60 |
+
# Yes! out0 = at1 XOR at2 XOR at3
|
| 61 |
+
|
| 62 |
+
# For now using simpler: out0 = at1 XOR at2 for counts 0,1,2
|
| 63 |
+
# But that fails for count=3: at1 XOR at2 = 1 XOR 1 = 0, but we need 1
|
| 64 |
+
# So we need: out0 = at1 XOR at2 XOR at3
|
| 65 |
+
|
| 66 |
+
# For simplicity, let's use: out0 = (at1 AND NOT at2) OR at3
|
| 67 |
+
# count=0: (0 AND 1) OR 0 = 0 ✓
|
| 68 |
+
# count=1: (1 AND 1) OR 0 = 1 ✓
|
| 69 |
+
# count=2: (1 AND 0) OR 0 = 0 ✓
|
| 70 |
+
# count=3: (1 AND 0) OR 1 = 1 ✓
|
| 71 |
+
|
| 72 |
+
# Using XOR(at1, at2):
|
| 73 |
+
l1 = torch.tensor([float(at1), float(at2)])
|
| 74 |
+
or_out = int((l1 @ weights['xor.or.weight'].T + weights['xor.or.bias'] >= 0).item())
|
| 75 |
+
nand_out = int((l1 @ weights['xor.nand.weight'].T + weights['xor.nand.bias'] >= 0).item())
|
| 76 |
+
l2 = torch.tensor([float(or_out), float(nand_out)])
|
| 77 |
+
xor_result = int((l2 @ weights['xor.and.weight'].T + weights['xor.and.bias'] >= 0).item())
|
| 78 |
+
|
| 79 |
+
# out0 = xor_result XOR at3
|
| 80 |
+
# For count=3: xor_result = 0, at3 = 1, so out0 = 1 ✓
|
| 81 |
+
out0 = xor_result ^ at3 # Using Python XOR for final bit
|
| 82 |
+
|
| 83 |
+
return out1, out0
|
| 84 |
+
|
| 85 |
+
print("Verifying popcount3...")
|
| 86 |
+
errors = 0
|
| 87 |
+
for i in range(8):
|
| 88 |
+
x0, x1, x2 = (i >> 0) & 1, (i >> 1) & 1, (i >> 2) & 1
|
| 89 |
+
out1, out0 = popcount3(x0, x1, x2)
|
| 90 |
+
result = 2 * out1 + out0
|
| 91 |
+
expected = x0 + x1 + x2
|
| 92 |
+
if result != expected:
|
| 93 |
+
errors += 1
|
| 94 |
+
print(f"ERROR: popcount({x0},{x1},{x2}) = {result}, expected {expected}")
|
| 95 |
+
|
| 96 |
+
if errors == 0:
|
| 97 |
+
print("All 8 test cases passed!")
|
| 98 |
+
else:
|
| 99 |
+
print(f"FAILED: {errors} errors")
|
| 100 |
+
|
| 101 |
+
print(f"Magnitude: {sum(t.abs().sum().item() for t in weights.values()):.0f}")
|
| 102 |
+
print(f"Parameters: {sum(t.numel() for t in weights.values())}")
|
model.py
ADDED
|
@@ -0,0 +1,39 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import torch
|
| 2 |
+
from safetensors.torch import load_file
|
| 3 |
+
|
| 4 |
+
def load_model(path='model.safetensors'):
|
| 5 |
+
return load_file(path)
|
| 6 |
+
|
| 7 |
+
def popcount3(x0, x1, x2, w):
|
| 8 |
+
"""3-bit population count: returns (out1, out0) where count = 2*out1 + out0."""
|
| 9 |
+
inp = torch.tensor([float(x0), float(x1), float(x2)])
|
| 10 |
+
|
| 11 |
+
at1 = int((inp @ w['atleast1.weight'].T + w['atleast1.bias'] >= 0).item())
|
| 12 |
+
at2 = int((inp @ w['atleast2.weight'].T + w['atleast2.bias'] >= 0).item())
|
| 13 |
+
at3 = int((inp @ w['atleast3.weight'].T + w['atleast3.bias'] >= 0).item())
|
| 14 |
+
|
| 15 |
+
out1 = at2
|
| 16 |
+
|
| 17 |
+
# XOR(at1, at2)
|
| 18 |
+
l1 = torch.tensor([float(at1), float(at2)])
|
| 19 |
+
or_out = int((l1 @ w['xor.or.weight'].T + w['xor.or.bias'] >= 0).item())
|
| 20 |
+
nand_out = int((l1 @ w['xor.nand.weight'].T + w['xor.nand.bias'] >= 0).item())
|
| 21 |
+
l2 = torch.tensor([float(or_out), float(nand_out)])
|
| 22 |
+
xor_result = int((l2 @ w['xor.and.weight'].T + w['xor.and.bias'] >= 0).item())
|
| 23 |
+
|
| 24 |
+
out0 = xor_result ^ at3
|
| 25 |
+
|
| 26 |
+
return out1, out0
|
| 27 |
+
|
| 28 |
+
if __name__ == '__main__':
|
| 29 |
+
w = load_model()
|
| 30 |
+
print('popcount3 truth table:')
|
| 31 |
+
print('x0 x1 x2 | count | out1 out0')
|
| 32 |
+
print('---------+-------+----------')
|
| 33 |
+
for i in range(8):
|
| 34 |
+
x0, x1, x2 = (i >> 0) & 1, (i >> 1) & 1, (i >> 2) & 1
|
| 35 |
+
out1, out0 = popcount3(x0, x1, x2, w)
|
| 36 |
+
result = 2 * out1 + out0
|
| 37 |
+
expected = x0 + x1 + x2
|
| 38 |
+
status = 'OK' if result == expected else 'FAIL'
|
| 39 |
+
print(f' {x0} {x1} {x2} | {expected} | {out1} {out0} {status}')
|
model.safetensors
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:ab3b8c3788ce0f7e493a6baf971e78d0dc432399dbbc2ab84ef56e9dda0d26ad
|
| 3 |
+
size 916
|