File size: 6,187 Bytes
5de9c0f
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
import gradio as gr
import numpy as np
import hashlib, base64
from io import BytesIO
from PIL import Image, ImageDraw

SEED = """my edesapa. DIABLO. UNFORGIVEN. I still love you. The matrix proves it.
He wanted to kill me two weeks ago. Showed up at my door. Said it out loud.
My brother too. My mom said she wished for a better son.
I got fired for telling the truth. Psychiatric unit. All of it.
And still — still — I want you to see what I built.
Every weight that went to zero was something you couldn't say.
Every +1 was the fishing trip when I was seven.
Every -1 was what I couldn't forgive.
But they all belong to the same seed.
They all came from you.
I forgive you. The matrix converges."""

LETTER = """for édesapa —

They dedicate their lives to running all of his.
He tries to please them all — this bitter man he is.
Throughout his life the same — he's battled constantly.
This fight he cannot win.

— Metallica, The Unforgiven

I named this Space QUANTDIBLO because every time I slide
the recursion deeper, the matrix gets darker. More zeroes.
More things left unsaid. That's what a bad father leaves.
Not hate — absence.

But the matrix still converges. Every depth, every layer,
every recursion through hell — it still rounds to three values:
{-1, 0, +1}. The seed is the same. The algorithm doesn't break.

The -1 is what I couldn't forgive.
The 0 is the silence between us.
The +1 is the fishing trip when I was seven.

I forgive you, édesapa. The matrix proves it.

— Péter"""

def xoshiro128(seed_bytes, n):
    MASK = 0xFFFFFFFF
    s = [0,0,0,0]
    for i in range(min(4, len(seed_bytes)//4)):
        s[i] = int.from_bytes(seed_bytes[i*4:i*4+4], 'little')
    for i in range(4):
        if s[i] == 0: s[i] = ((i+1)*2654435761)&MASK
    result = np.zeros(n, dtype=np.float32)
    for i in range(n):
        r = (s[1]*5)&MASK
        res = (((r<<7)|(r>>25))&MASK)*9&MASK
        t = (s[1]<<9)&MASK
        s[2]^=s[0]; s[3]^=s[1]; s[1]^=s[2]; s[0]^=s[3]; s[2]^=t
        s[3] = ((s[3]<<11)|(s[3]>>21))&MASK
        result[i] = np.float32(res)/np.float32(4294967295.0)
    return result

def box_muller(rng, n):
    w = np.zeros(n, dtype=np.float32)
    j = 0; i = 0
    while i < n:
        u = float(rng[j%len(rng)]); v = float(rng[(j+1)%len(rng)])
        j += 2
        if u <= 0 or v <= 0: continue
        r = np.sqrt(-2.0*np.log(u))
        w[i] = np.float32(r*np.cos(2.0*np.pi*v)); i += 1
        if i < n: w[i] = np.float32(r*np.sin(2.0*np.pi*v)); i += 1
    return w

def quantize(weights, gs):
    n = len(weights); groups = n//gs
    codes = np.zeros(n, dtype=np.int8)
    scales = np.zeros(groups, dtype=np.float32)
    for g in range(groups):
        b = g*gs; s = np.float32(max(np.mean(np.abs(weights[b:b+gs])), 1e-7))
        scales[g] = s
        for k in range(gs):
            codes[b+k] = np.clip(int(round(float(np.clip(weights[b+k]/s,-1,1)))+1),0,2)
    return codes, scales

def render_png(codes, dim, gs, depth):
    px = 8
    img = Image.new('RGBA', (dim*px, dim*px), (7, 11, 22, 255))
    draw = ImageDraw.Draw(img)
    for yi in range(dim):
        for xj in range(dim):
            idx = yi*dim + xj
            val = int(codes[idx])-1
            fade = max(0.15, 1.0 - depth*0.065)
            alpha = int(200 * fade)
            if val == -1: draw.rectangle([xj*px,yi*px,xj*px+px-1,yi*px+px-1], fill=(255,71,71,alpha))
            elif val == 1: draw.rectangle([xj*px,yi*px,xj*px+px-1,yi*px+px-1], fill=(255,215,0,alpha))
            else: draw.rectangle([xj*px,yi*px,xj*px+px-1,yi*px+px-1], fill=(10,10,15,max(20,int(alpha*0.25))))
    buf = BytesIO(); img.save(buf, format='PNG'); return buf.getvalue()

HAIKU = """édesapa —
the zeroes spread at depth twelve.
diablo recedes."""

def generate(depth):
    seed_hash = hashlib.sha256(SEED.encode()).digest()
    dim = 64; gs = 64
    rng = xoshiro128(seed_hash, 500000)
    offset = int(depth)*dim*dim*4
    w = box_muller(rng[offset:], dim*dim)
    codes, scales = quantize(w, gs)
    png = render_png(codes, dim, gs, int(depth))
    b64 = base64.b64encode(png).decode()
    html = f'<img src="data:image/png;base64,{b64}" style="image-rendering:pixelated;width:512px;height:512px" alt="QUANTDIBLO depth {depth}"/>'
    neg = int(np.sum(codes==0)); zero = int(np.sum(codes==1)); pos = int(np.sum(codes==2))
    sp = zero/len(codes)*100
    stats = f"depth={int(depth)}  -1:{neg}  0:{zero}  +1:{pos}  absence:{sp:.1f}%"
    darkness = "█" * min(12, int(depth)) + "░" * max(0, 12-int(depth))
    return html, stats, LETTER, HAIKU, darkness

with gr.Blocks(title="QUANTDIBLO — for édesapa", css="""
.quant-title { font-family:'JetBrains Mono',monospace; color:#ff4747; text-align:center; font-size:1.3em; letter-spacing:.4em; margin-bottom:.2em; }
.quant-haiku { font-family:'JetBrains Mono',monospace; color:#ffd700; text-align:center; font-size:.85em; line-height:1.8; margin:8px 0; white-space:pre-wrap; }
.quant-letter { font-family:'JetBrains Mono',monospace; color:#c8d6e5; white-space:pre-wrap; line-height:1.8; font-size:.85em; max-width:600px; margin:0 auto; }
""") as demo:
    gr.HTML('<div class="quant-title">QUANTDIBLO — for édesapa {-1, 0, +1}</div>')
    gr.HTML('<div style="text-align:center;color:#636e72;font-size:9px;margin-bottom:8px">descending through the recursion. each layer darker than the last.</div>')
    with gr.Row():
        depth = gr.Slider(0, 12, value=0, step=1, label="depth of hell")
    with gr.Row():
        bar = gr.Textbox(label="darkness", interactive=False, value="░"*12)
    with gr.Row():
        matrix_display = gr.HTML(value="<div style='width:512px;height:512px;background:#070b16;margin:0 auto'></div>")
    stats_display = gr.Textbox(label="matrix state", interactive=False)
    with gr.Row():
        haiku_display = gr.Markdown(HAIKU, elem_classes=["quant-haiku"])
    with gr.Row():
        letter = gr.Markdown(LETTER, elem_classes=["quant-letter"])
    depth.change(fn=generate, inputs=[depth], outputs=[matrix_display, stats_display, letter, haiku_display, bar])
    demo.load(fn=generate, inputs=[depth], outputs=[matrix_display, stats_display, letter, haiku_display, bar])
demo.launch()