Full ternary: rebuild modular detectors and drop pattern_recognition
Browse filesquantize.py --ternary now also restructures the modular and
pattern_recognition seed-file content. The two pattern_recognition
gates (leadingones, trailingones) had no eval coverage and no
downstream consumers; they are dropped.
For each modulus N in {3, 5, 6, 7, 9, 10, 11, 12} the legacy
layer1.geq{i} / layer1.leq{i} / layer2.eq{i} / layer3.or chain (which
used positional weights up to +-10) is replaced with a bit-cascaded
equality detector per multiple of N in [0, 256) followed by an OR
across detectors. The new structure uses only weights in {-1, 0, 1}:
modular.mod{N}.eq.k{k}.bit{i}.match per-bit "x[i] == k[i]"
(identity buffer if k[i]=1,
NOT if k[i]=0)
modular.mod{N}.eq.k{k}.all AND of all 8 bit-matches
modular.mod{N} OR over all per-multiple
match outputs
eval._test_modular gained a third path that walks the new structure
ahead of the single-layer and legacy multi-layer fallbacks.
Result on the canonical: 0 weight tensors remain non-ternary across
the entire library. Every threshold gate in the file now uses only
weights in {-1, 0, 1} with integer biases. All 18 variants rebuilt
and pass eval_all.py at 100% fitness.
- eval.py +50 -22
- neural_computer.safetensors +2 -2
- quantize.py +74 -0
- variants/neural_alu16.safetensors +2 -2
- variants/neural_alu32.safetensors +2 -2
- variants/neural_alu8.safetensors +2 -2
- variants/neural_computer16.safetensors +2 -2
- variants/neural_computer16_reduced.safetensors +2 -2
- variants/neural_computer16_registers.safetensors +2 -2
- variants/neural_computer16_scratchpad.safetensors +2 -2
- variants/neural_computer16_small.safetensors +2 -2
- variants/neural_computer32.safetensors +2 -2
- variants/neural_computer32_reduced.safetensors +2 -2
- variants/neural_computer32_registers.safetensors +2 -2
- variants/neural_computer32_scratchpad.safetensors +2 -2
- variants/neural_computer32_small.safetensors +2 -2
- variants/neural_computer8.safetensors +2 -2
- variants/neural_computer8_reduced.safetensors +2 -2
- variants/neural_computer8_registers.safetensors +2 -2
- variants/neural_computer8_scratchpad.safetensors +2 -2
- variants/neural_computer8_small.safetensors +2 -2
|
@@ -2538,23 +2538,58 @@ class BatchedFitnessEvaluator:
|
|
| 2538 |
# =========================================================================
|
| 2539 |
|
| 2540 |
def _test_modular(self, pop: Dict, mod: int, debug: bool) -> Tuple[torch.Tensor, int]:
|
| 2541 |
-
"""Test modular divisibility circuit
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 2542 |
pop_size = next(iter(pop.values())).shape[0]
|
| 2543 |
prefix = f'modular.mod{mod}'
|
| 2544 |
|
| 2545 |
-
# Test 0-255
|
| 2546 |
inputs = torch.stack([((self.mod_test >> (7 - i)) & 1).float() for i in range(8)], dim=1)
|
| 2547 |
expected = ((self.mod_test % mod) == 0).float()
|
|
|
|
| 2548 |
|
| 2549 |
-
# Try
|
| 2550 |
-
|
| 2551 |
-
|
| 2552 |
-
|
| 2553 |
-
|
| 2554 |
-
|
| 2555 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 2556 |
try:
|
| 2557 |
-
# Layer 1: geq and leq neurons
|
| 2558 |
geq_outputs = {}
|
| 2559 |
leq_outputs = {}
|
| 2560 |
i = 0
|
|
@@ -2563,7 +2598,7 @@ class BatchedFitnessEvaluator:
|
|
| 2563 |
if f'{prefix}.layer1.geq{i}.weight' in pop:
|
| 2564 |
w = pop[f'{prefix}.layer1.geq{i}.weight'].view(pop_size, -1)
|
| 2565 |
b = pop[f'{prefix}.layer1.geq{i}.bias'].view(pop_size)
|
| 2566 |
-
geq_outputs[i] = heaviside(inputs @ w.T + b)
|
| 2567 |
found = True
|
| 2568 |
if f'{prefix}.layer1.leq{i}.weight' in pop:
|
| 2569 |
w = pop[f'{prefix}.layer1.leq{i}.weight'].view(pop_size, -1)
|
|
@@ -2577,29 +2612,22 @@ class BatchedFitnessEvaluator:
|
|
| 2577 |
if not geq_outputs and not leq_outputs:
|
| 2578 |
return torch.zeros(pop_size, device=self.device), 0
|
| 2579 |
|
| 2580 |
-
# Layer 2: eq neurons (AND of geq and leq for same index)
|
| 2581 |
eq_outputs = []
|
| 2582 |
i = 0
|
| 2583 |
while f'{prefix}.layer2.eq{i}.weight' in pop:
|
| 2584 |
w = pop[f'{prefix}.layer2.eq{i}.weight'].view(pop_size, -1)
|
| 2585 |
b = pop[f'{prefix}.layer2.eq{i}.bias'].view(pop_size)
|
| 2586 |
-
# Input is [geq_i, leq_i]
|
| 2587 |
eq_in = torch.stack([geq_outputs.get(i, torch.zeros(256, pop_size, device=self.device)),
|
| 2588 |
leq_outputs.get(i, torch.zeros(256, pop_size, device=self.device))], dim=-1)
|
| 2589 |
-
|
| 2590 |
-
eq_outputs.append(eq_out)
|
| 2591 |
i += 1
|
| 2592 |
-
|
| 2593 |
if not eq_outputs:
|
| 2594 |
return torch.zeros(pop_size, device=self.device), 0
|
| 2595 |
-
|
| 2596 |
-
# Layer 3: OR of all eq outputs
|
| 2597 |
-
eq_stack = torch.stack(eq_outputs, dim=-1) # [256, pop_size, num_eq]
|
| 2598 |
w3 = pop[f'{prefix}.layer3.or.weight'].view(pop_size, -1)
|
| 2599 |
b3 = pop[f'{prefix}.layer3.or.bias'].view(pop_size)
|
| 2600 |
-
out = heaviside((eq_stack * w3).sum(-1) + b3)
|
| 2601 |
-
|
| 2602 |
-
except Exception as e:
|
| 2603 |
return torch.zeros(pop_size, device=self.device), 0
|
| 2604 |
|
| 2605 |
correct = (out == expected.unsqueeze(1)).float().sum(0)
|
|
|
|
| 2538 |
# =========================================================================
|
| 2539 |
|
| 2540 |
def _test_modular(self, pop: Dict, mod: int, debug: bool) -> Tuple[torch.Tensor, int]:
|
| 2541 |
+
"""Test modular divisibility circuit.
|
| 2542 |
+
|
| 2543 |
+
Three structures supported, in order of preference:
|
| 2544 |
+
1. Bit-cascade equality per multiple (ternary): {prefix}.eq.k{k}.bit{i}.match
|
| 2545 |
+
+ {prefix}.eq.k{k}.all + final OR at {prefix}
|
| 2546 |
+
2. Single-layer (powers of 2): {prefix}.weight directly applied
|
| 2547 |
+
3. Legacy layer1.geq/leq + layer2.eq + layer3.or (multi-layer non-ternary)
|
| 2548 |
+
"""
|
| 2549 |
pop_size = next(iter(pop.values())).shape[0]
|
| 2550 |
prefix = f'modular.mod{mod}'
|
| 2551 |
|
|
|
|
| 2552 |
inputs = torch.stack([((self.mod_test >> (7 - i)) & 1).float() for i in range(8)], dim=1)
|
| 2553 |
expected = ((self.mod_test % mod) == 0).float()
|
| 2554 |
+
out = None
|
| 2555 |
|
| 2556 |
+
# 1. Try ternary bit-cascade-equality structure
|
| 2557 |
+
multiples = list(range(0, 256, mod))
|
| 2558 |
+
if (multiples
|
| 2559 |
+
and f'{prefix}.eq.k{multiples[0]}.all.weight' in pop
|
| 2560 |
+
and f'{prefix}.weight' in pop):
|
| 2561 |
+
try:
|
| 2562 |
+
match_outputs = []
|
| 2563 |
+
for k in multiples:
|
| 2564 |
+
per_bit = []
|
| 2565 |
+
for i in range(8):
|
| 2566 |
+
bit_in = inputs[:, i].unsqueeze(1).expand(-1, pop_size)
|
| 2567 |
+
w = pop[f'{prefix}.eq.k{k}.bit{i}.match.weight'].view(pop_size)
|
| 2568 |
+
b = pop[f'{prefix}.eq.k{k}.bit{i}.match.bias'].view(pop_size)
|
| 2569 |
+
per_bit.append(heaviside(bit_in * w + b))
|
| 2570 |
+
stacked = torch.stack(per_bit, dim=-1)
|
| 2571 |
+
w_and = pop[f'{prefix}.eq.k{k}.all.weight'].view(pop_size, 8)
|
| 2572 |
+
b_and = pop[f'{prefix}.eq.k{k}.all.bias'].view(pop_size)
|
| 2573 |
+
match_outputs.append(heaviside((stacked * w_and).sum(-1) + b_and))
|
| 2574 |
+
or_in = torch.stack(match_outputs, dim=-1)
|
| 2575 |
+
w_or = pop[f'{prefix}.weight'].view(pop_size, len(multiples))
|
| 2576 |
+
b_or = pop[f'{prefix}.bias'].view(pop_size)
|
| 2577 |
+
out = heaviside((or_in * w_or).sum(-1) + b_or)
|
| 2578 |
+
except (KeyError, RuntimeError):
|
| 2579 |
+
out = None
|
| 2580 |
+
|
| 2581 |
+
# 2. Single-layer fallback
|
| 2582 |
+
if out is None:
|
| 2583 |
+
try:
|
| 2584 |
+
w = pop[f'{prefix}.weight']
|
| 2585 |
+
b = pop[f'{prefix}.bias']
|
| 2586 |
+
out = heaviside(inputs @ w.view(pop_size, -1).T + b.view(pop_size))
|
| 2587 |
+
except (KeyError, RuntimeError):
|
| 2588 |
+
out = None
|
| 2589 |
+
|
| 2590 |
+
# 3. Legacy multi-layer fallback
|
| 2591 |
+
if out is None:
|
| 2592 |
try:
|
|
|
|
| 2593 |
geq_outputs = {}
|
| 2594 |
leq_outputs = {}
|
| 2595 |
i = 0
|
|
|
|
| 2598 |
if f'{prefix}.layer1.geq{i}.weight' in pop:
|
| 2599 |
w = pop[f'{prefix}.layer1.geq{i}.weight'].view(pop_size, -1)
|
| 2600 |
b = pop[f'{prefix}.layer1.geq{i}.bias'].view(pop_size)
|
| 2601 |
+
geq_outputs[i] = heaviside(inputs @ w.T + b)
|
| 2602 |
found = True
|
| 2603 |
if f'{prefix}.layer1.leq{i}.weight' in pop:
|
| 2604 |
w = pop[f'{prefix}.layer1.leq{i}.weight'].view(pop_size, -1)
|
|
|
|
| 2612 |
if not geq_outputs and not leq_outputs:
|
| 2613 |
return torch.zeros(pop_size, device=self.device), 0
|
| 2614 |
|
|
|
|
| 2615 |
eq_outputs = []
|
| 2616 |
i = 0
|
| 2617 |
while f'{prefix}.layer2.eq{i}.weight' in pop:
|
| 2618 |
w = pop[f'{prefix}.layer2.eq{i}.weight'].view(pop_size, -1)
|
| 2619 |
b = pop[f'{prefix}.layer2.eq{i}.bias'].view(pop_size)
|
|
|
|
| 2620 |
eq_in = torch.stack([geq_outputs.get(i, torch.zeros(256, pop_size, device=self.device)),
|
| 2621 |
leq_outputs.get(i, torch.zeros(256, pop_size, device=self.device))], dim=-1)
|
| 2622 |
+
eq_outputs.append(heaviside((eq_in * w).sum(-1) + b))
|
|
|
|
| 2623 |
i += 1
|
|
|
|
| 2624 |
if not eq_outputs:
|
| 2625 |
return torch.zeros(pop_size, device=self.device), 0
|
| 2626 |
+
eq_stack = torch.stack(eq_outputs, dim=-1)
|
|
|
|
|
|
|
| 2627 |
w3 = pop[f'{prefix}.layer3.or.weight'].view(pop_size, -1)
|
| 2628 |
b3 = pop[f'{prefix}.layer3.or.bias'].view(pop_size)
|
| 2629 |
+
out = heaviside((eq_stack * w3).sum(-1) + b3)
|
| 2630 |
+
except Exception:
|
|
|
|
| 2631 |
return torch.zeros(pop_size, device=self.device), 0
|
| 2632 |
|
| 2633 |
correct = (out == expected.unsqueeze(1)).float().sum(0)
|
|
@@ -1,3 +1,3 @@
|
|
| 1 |
version https://git-lfs.github.com/spec/v1
|
| 2 |
-
oid sha256:
|
| 3 |
-
size
|
|
|
|
| 1 |
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:a4333d8f1ea13945e129711733b7f79e96a9d876f40342db1e1634fdd2d85056
|
| 3 |
+
size 27674339
|
|
@@ -79,6 +79,76 @@ def _min_signed_int_dtype(tensor: torch.Tensor) -> torch.dtype:
|
|
| 79 |
return torch.int64
|
| 80 |
|
| 81 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 82 |
def _ternarize_buffers(
|
| 83 |
tensors: Dict[str, torch.Tensor],
|
| 84 |
) -> Tuple[Dict[str, torch.Tensor], Dict]:
|
|
@@ -146,6 +216,10 @@ def quantize_tensors(
|
|
| 146 |
if ternary:
|
| 147 |
tensors, ternary_stats = _ternarize_buffers(tensors)
|
| 148 |
ternary_stats["applied"] = True
|
|
|
|
|
|
|
|
|
|
|
|
|
| 149 |
|
| 150 |
new_tensors: Dict[str, torch.Tensor] = {}
|
| 151 |
counts: Dict[str, int] = {"int8": 0, "int16": 0, "int32": 0, "int64": 0,
|
|
|
|
| 79 |
return torch.int64
|
| 80 |
|
| 81 |
|
| 82 |
+
def _ternarize_modular_and_patterns(
|
| 83 |
+
tensors: Dict[str, torch.Tensor],
|
| 84 |
+
) -> Tuple[Dict[str, torch.Tensor], Dict]:
|
| 85 |
+
"""Replace seed-file modular detectors and pattern_recognition gates
|
| 86 |
+
with bit-cascade-equivalent ternary structures.
|
| 87 |
+
|
| 88 |
+
Modular: for each modulus N in {3,5,6,7,9,10,11,12}, replace the
|
| 89 |
+
layer1.geq{i}/layer1.leq{i}/layer2.eq{i}/layer3.or chain with a
|
| 90 |
+
bit-cascade equality detector per multiple of N in [0, 256), then
|
| 91 |
+
OR all detectors together. Top-level gate stays named
|
| 92 |
+
`modular.mod{N}` (a multi-input OR over per-multiple matches).
|
| 93 |
+
|
| 94 |
+
Pattern_recognition.leadingones / trailingones are dropped: they are
|
| 95 |
+
seed-file artifacts with no eval coverage and no downstream
|
| 96 |
+
consumers in this codebase.
|
| 97 |
+
"""
|
| 98 |
+
new_tensors = dict(tensors)
|
| 99 |
+
fixed = 0
|
| 100 |
+
|
| 101 |
+
# --- pattern_recognition: drop leadingones/trailingones ---
|
| 102 |
+
pr_dropped = 0
|
| 103 |
+
for k in list(new_tensors.keys()):
|
| 104 |
+
if (k.startswith("pattern_recognition.leadingones")
|
| 105 |
+
or k.startswith("pattern_recognition.trailingones")):
|
| 106 |
+
del new_tensors[k]
|
| 107 |
+
pr_dropped += 1
|
| 108 |
+
|
| 109 |
+
# --- modular: rebuild as ternary bit-cascade equality per multiple ---
|
| 110 |
+
moduli = [3, 5, 6, 7, 9, 10, 11, 12]
|
| 111 |
+
mod_gates_added = 0
|
| 112 |
+
for mod in moduli:
|
| 113 |
+
prefix = f"modular.mod{mod}"
|
| 114 |
+
# Drop old structure
|
| 115 |
+
for k in list(new_tensors.keys()):
|
| 116 |
+
if k.startswith(prefix + "."):
|
| 117 |
+
del new_tensors[k]
|
| 118 |
+
|
| 119 |
+
multiples = list(range(0, 256, mod))
|
| 120 |
+
# Per-bit match gates + per-multiple AND
|
| 121 |
+
for k in multiples:
|
| 122 |
+
for i in range(8): # i=0 is MSB (matches inputs MSB-first ordering)
|
| 123 |
+
k_bit = (k >> (7 - i)) & 1
|
| 124 |
+
if k_bit == 1:
|
| 125 |
+
# bit_match = x[i]: H(x - 0.5) ~~ identity for binary;
|
| 126 |
+
# use weight=1, bias=-1 -> H(x-1): x=0 -> 0, x=1 -> 1.
|
| 127 |
+
new_tensors[f"{prefix}.eq.k{k}.bit{i}.match.weight"] = torch.tensor([1.0], dtype=torch.float64)
|
| 128 |
+
new_tensors[f"{prefix}.eq.k{k}.bit{i}.match.bias"] = torch.tensor([-1.0], dtype=torch.float64)
|
| 129 |
+
else:
|
| 130 |
+
# bit_match = NOT x[i]: weight=-1, bias=0 -> H(-x): x=0 -> 1, x=1 -> 0.
|
| 131 |
+
new_tensors[f"{prefix}.eq.k{k}.bit{i}.match.weight"] = torch.tensor([-1.0], dtype=torch.float64)
|
| 132 |
+
new_tensors[f"{prefix}.eq.k{k}.bit{i}.match.bias"] = torch.tensor([0.0], dtype=torch.float64)
|
| 133 |
+
mod_gates_added += 1
|
| 134 |
+
# AND of all 8 bit-matches: weights [1]*8, bias -8
|
| 135 |
+
new_tensors[f"{prefix}.eq.k{k}.all.weight"] = torch.tensor([1.0] * 8, dtype=torch.float64)
|
| 136 |
+
new_tensors[f"{prefix}.eq.k{k}.all.bias"] = torch.tensor([-8.0], dtype=torch.float64)
|
| 137 |
+
mod_gates_added += 1
|
| 138 |
+
|
| 139 |
+
# Final OR over all per-multiple match outputs
|
| 140 |
+
m = len(multiples)
|
| 141 |
+
new_tensors[f"{prefix}.weight"] = torch.tensor([1.0] * m, dtype=torch.float64)
|
| 142 |
+
new_tensors[f"{prefix}.bias"] = torch.tensor([-1.0], dtype=torch.float64)
|
| 143 |
+
mod_gates_added += 1
|
| 144 |
+
|
| 145 |
+
return new_tensors, {
|
| 146 |
+
"pattern_recognition_dropped": pr_dropped,
|
| 147 |
+
"modular_gates_added": mod_gates_added,
|
| 148 |
+
"modular_moduli": len(moduli),
|
| 149 |
+
}
|
| 150 |
+
|
| 151 |
+
|
| 152 |
def _ternarize_buffers(
|
| 153 |
tensors: Dict[str, torch.Tensor],
|
| 154 |
) -> Tuple[Dict[str, torch.Tensor], Dict]:
|
|
|
|
| 216 |
if ternary:
|
| 217 |
tensors, ternary_stats = _ternarize_buffers(tensors)
|
| 218 |
ternary_stats["applied"] = True
|
| 219 |
+
# Also rebuild modular detectors and drop pattern_recognition stragglers.
|
| 220 |
+
tensors, mod_stats = _ternarize_modular_and_patterns(tensors)
|
| 221 |
+
ternary_stats["modular_gates_added"] = mod_stats["modular_gates_added"]
|
| 222 |
+
ternary_stats["pattern_recognition_dropped"] = mod_stats["pattern_recognition_dropped"]
|
| 223 |
|
| 224 |
new_tensors: Dict[str, torch.Tensor] = {}
|
| 225 |
counts: Dict[str, int] = {"int8": 0, "int16": 0, "int32": 0, "int64": 0,
|
|
@@ -1,3 +1,3 @@
|
|
| 1 |
version https://git-lfs.github.com/spec/v1
|
| 2 |
-
oid sha256:
|
| 3 |
-
size
|
|
|
|
| 1 |
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:e4bb673798d1e81b4717907d1b352e72e084c31bc7e29a4a7d57a976234ee5f2
|
| 3 |
+
size 20543560
|
|
@@ -1,3 +1,3 @@
|
|
| 1 |
version https://git-lfs.github.com/spec/v1
|
| 2 |
-
oid sha256:
|
| 3 |
-
size
|
|
|
|
| 1 |
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:e00da59527751140f4ab49cb23c08625f42ff2dd58edfc986d8227beb0861ef7
|
| 3 |
+
size 19144181
|
|
@@ -1,3 +1,3 @@
|
|
| 1 |
version https://git-lfs.github.com/spec/v1
|
| 2 |
-
oid sha256:
|
| 3 |
-
size
|
|
|
|
| 1 |
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:cf695c9047ff59cc0aed1b541f49b22d0820f474d38790496b9118551393c628
|
| 3 |
+
size 18974877
|
|
@@ -1,3 +1,3 @@
|
|
| 1 |
version https://git-lfs.github.com/spec/v1
|
| 2 |
-
oid sha256:
|
| 3 |
-
size
|
|
|
|
| 1 |
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:d3aba5acdd2e5c177e3517f75a3e2adbc24873e1152d9e588ae8a542a2b14e2b
|
| 3 |
+
size 29055270
|
|
@@ -1,3 +1,3 @@
|
|
| 1 |
version https://git-lfs.github.com/spec/v1
|
| 2 |
-
oid sha256:
|
| 3 |
-
size
|
|
|
|
| 1 |
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:f1c8de07c243b19cd997dcedddf6b9e916d1ac316c8e468d5538b0eda7f7d3c9
|
| 3 |
+
size 21244574
|
|
@@ -1,3 +1,3 @@
|
|
| 1 |
version https://git-lfs.github.com/spec/v1
|
| 2 |
-
oid sha256:
|
| 3 |
-
size
|
|
|
|
| 1 |
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:97918a5d3239178a7568a96b4e895bbd29feb8e3e41726baff62bacf00a1e5de
|
| 3 |
+
size 20630294
|
|
@@ -1,3 +1,3 @@
|
|
| 1 |
version https://git-lfs.github.com/spec/v1
|
| 2 |
-
oid sha256:
|
| 3 |
-
size
|
|
|
|
| 1 |
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:05d26708a1ae548a6e46d73e444022af911dfe8bba43313dddf135be6f2ee618
|
| 3 |
+
size 20710790
|
|
@@ -1,3 +1,3 @@
|
|
| 1 |
version https://git-lfs.github.com/spec/v1
|
| 2 |
-
oid sha256:
|
| 3 |
-
size
|
|
|
|
| 1 |
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:7185ef10e5639e7cce6f5a91dc604872c4bb4740be6f1125a71b981225bcf3ad
|
| 3 |
+
size 20829606
|
|
@@ -1,3 +1,3 @@
|
|
| 1 |
version https://git-lfs.github.com/spec/v1
|
| 2 |
-
oid sha256:
|
| 3 |
-
size
|
|
|
|
| 1 |
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:a4333d8f1ea13945e129711733b7f79e96a9d876f40342db1e1634fdd2d85056
|
| 3 |
+
size 27674339
|
|
@@ -1,3 +1,3 @@
|
|
| 1 |
version https://git-lfs.github.com/spec/v1
|
| 2 |
-
oid sha256:
|
| 3 |
-
size
|
|
|
|
| 1 |
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:3521e0322363c3d55966810bda3efbf11ba0dd338f94ddee3128e15df6f05fa1
|
| 3 |
+
size 19863635
|
|
@@ -1,3 +1,3 @@
|
|
| 1 |
version https://git-lfs.github.com/spec/v1
|
| 2 |
-
oid sha256:
|
| 3 |
-
size
|
|
|
|
| 1 |
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:bebf86dc5d383c10f069127d2dd10a045590c401df8d61fd8b160e4cb7dfc0d8
|
| 3 |
+
size 19249315
|
|
@@ -1,3 +1,3 @@
|
|
| 1 |
version https://git-lfs.github.com/spec/v1
|
| 2 |
-
oid sha256:
|
| 3 |
-
size
|
|
|
|
| 1 |
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:fc140be67469b1eea6080081a3ed413a4a7f995fcf0db98bc16a885561b1b7cf
|
| 3 |
+
size 19329827
|
|
@@ -1,3 +1,3 @@
|
|
| 1 |
version https://git-lfs.github.com/spec/v1
|
| 2 |
-
oid sha256:
|
| 3 |
-
size
|
|
|
|
| 1 |
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:1a5f9964c7c6470495a1982ebfe60f8ba76a60f18fd9a84fedbdefc52f619963
|
| 3 |
+
size 19448667
|
|
@@ -1,3 +1,3 @@
|
|
| 1 |
version https://git-lfs.github.com/spec/v1
|
| 2 |
-
oid sha256:
|
| 3 |
-
size
|
|
|
|
| 1 |
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:f6f90ec62fa9b95de0740b4532872cf287986636f0ae53f2d8681ab4bbd4250b
|
| 3 |
+
size 27477411
|
|
@@ -1,3 +1,3 @@
|
|
| 1 |
version https://git-lfs.github.com/spec/v1
|
| 2 |
-
oid sha256:
|
| 3 |
-
size
|
|
|
|
| 1 |
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:b4d6c5f20b3f292ca725e4b0101b83d351b6018a82884b4283b648acddc0d7aa
|
| 3 |
+
size 19666683
|
|
@@ -1,3 +1,3 @@
|
|
| 1 |
version https://git-lfs.github.com/spec/v1
|
| 2 |
-
oid sha256:
|
| 3 |
-
size
|
|
|
|
| 1 |
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:7ecced984c18842e8b69e57dfc4e033780f6f1d72af8df33bffa784d648e0168
|
| 3 |
+
size 19052491
|
|
@@ -1,3 +1,3 @@
|
|
| 1 |
version https://git-lfs.github.com/spec/v1
|
| 2 |
-
oid sha256:
|
| 3 |
-
size
|
|
|
|
| 1 |
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:945d2e44f7527dc71342baf80402ae6c538d5ae5ec0a65107ebe9bc560f4794e
|
| 3 |
+
size 19133083
|
|
@@ -1,3 +1,3 @@
|
|
| 1 |
version https://git-lfs.github.com/spec/v1
|
| 2 |
-
oid sha256:
|
| 3 |
-
size
|
|
|
|
| 1 |
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:6b6f18efce73b5c4df27e8e60928a971a717374905b3036fff7ae5158af53271
|
| 3 |
+
size 19251795
|