code wiki / _hdl_build / nx_skinfam_train_gate.nx
nx_skinfam_train_gate.nx source
↩ module page · 473 lines · 19400 B
1// nx_skinfam_train_gate.nx -- ★★P4 NEURAL RUNG 2: a GENERATIVE sovereign skin-texture FAMILY. R1 proved
2// exemplar-fit; R2 proves GENERATION: an AUTO-DECODER (DeepSDF/GLO-style) coordinate-MLP with a LEARNED 8-dim
3// LATENT per training patch, trained jointly on SIX real skin patches (Elara exemplar) by the R1 integer
4// machinery (Q12 backprop + error-feedback + frequency-scaled init). After training, NEW latents (interpolations
5// + in-range draws) generate NOVEL skin textures that never existed = seed -> novel skin, the persongen
6// philosophy carried into the neural track.
7// T1 joint training CONVERGES (err < half of untrained across all 6 patches)
8// T2 per-patch reconstructions are FAITHFUL (avg err < 22/255) and DISTINCT (the latent separates patches)
9// T3 ★GENERATION: novel latents -> textures that are (a) NOT a copy of any training patch, (b) skin-like
10// (mean colour within the training family's range), (c) DIVERSE (two draws differ)
11// T4 persist (weights+latents) -> reload -> re-render bit-identical + PNG knowledge/nx_skinfam.png
12// (row 1 exemplars | row 2 reconstructions | row 3 NOVEL generations)
13// license_tier: ORIGINAL expect_exit: 0
14import "nx_syscalls.nx"
15import "nx_itrig.nx"
16import "nx_jpeg_ascii.nx"
17import "nx_png.nx"
18
19func hw(s: *u8) -> i64 { var n: i64=0; while s[n]!=(0 as u8){n=n+1} sys_write(1,s,n); return 0 }
20func pn(v: i64) -> i64 { let b: *u8=sys_mmap(32) as *u8; var x: i64=v; var ng: i64=0; if x<0{ng=1;x=0-x} var i: i64=31; if x==0{b[i]=48 as u8;i=i-1} while x>0{b[i]=(48+x%10) as u8;x=x/10;i=i-1} if ng==1{b[i]=45 as u8;i=i-1} sys_write(1,(b as i64+i+1) as *u8,31-i); return 0 }
21
22const PS: i64 = 32 // patch size
23const NPP: i64 = 1024 // px per patch
24const NPAT: i64 = 6 // training patches
25const NFR: i64 = 5 // Fourier freqs {1,2,4,8,16}
26const NFF: i64 = 20 // Fourier features
27const NL: i64 = 8 // latent dims
28const NIN: i64 = 28 // NFF + NL
29const NH: i64 = 56
30const NO: i64 = 3
31const EPOCHS: i64 = 500
32
33func lcg(st: *i64) -> i64 { var h: i64=st[0]; h=h*6364136223846793005+1442695040888963407; st[0]=h; return (h>>33)&2147483647 }
34
35func features(px: i64, py: i64, f: *i64) -> i64 {
36 let fr: *i64 = sys_mmap(8*8) as *i64
37 fr[0]=1; fr[1]=2; fr[2]=4; fr[3]=8; fr[4]=16
38 var k: i64 = 0
39 while k < NFR {
40 let ax: i64 = px * 25736 * fr[k] / PS
41 let ay: i64 = py * 25736 * fr[k] / PS
42 f[k*4] = it_sin4096(ax)
43 f[k*4+1] = it_cos4096(ax)
44 f[k*4+2] = it_sin4096(ay)
45 f[k*4+3] = it_cos4096(ay)
46 k = k + 1
47 }
48 return 0
49}
50
51// integer inference on a fused input (20 Fourier + 8 latent), Q12 -> packed rgb
52func infer(W1: *i64, B1: *i64, W2: *i64, B2: *i64, fin: *i64, h: *i64) -> i64 {
53 var j: i64 = 0
54 while j < NH {
55 var acc: i64 = B1[j]
56 var i: i64 = 0
57 while i < NIN { acc = acc + W1[j*NIN+i]*fin[i]/4096; i = i + 1 }
58 if acc < 0 { acc = 0 }
59 if acc > 16384 { acc = 16384 }
60 h[j] = acc
61 j = j + 1
62 }
63 var outp: i64 = 0
64 var c: i64 = 0
65 while c < NO {
66 var acc: i64 = B2[c]
67 j = 0
68 while j < NH { acc = acc + W2[c*NH+j]*h[j]/4096; j = j + 1 }
69 var v: i64 = acc*255/4096
70 if v < 0 { v = 0 }
71 if v > 255 { v = 255 }
72 var sh: i64 = 0
73 if c == 1 { sh = 8 }
74 if c == 2 { sh = 16 }
75 outp = outp + (v << sh)
76 c = c + 1
77 }
78 return outp
79}
80
81func main() -> i64 {
82 hw("=== nx_skinfam_train_gate -- P4 R2: a GENERATIVE latent skin-texture family (integer auto-decoder) ===\n" as *u8)
83 var fails: i64 = 0
84
85 // ---- data: 6 skin patches from the Elara exemplar ----
86 let szp: *i64 = sys_mmap(16) as *i64
87 let jpeg: *u8 = sys_read_file("knowledge/elara_face_hi.jpg" as *u8, szp)
88 if (jpeg as i64) == 0 { hw("no exemplar\n" as *u8); return 1 }
89 let rp: *i64 = sys_mmap(8) as *i64
90 let wp: *i64 = sys_mmap(8) as *i64
91 let hp: *i64 = sys_mmap(8) as *i64
92 if nx_jpeg_decode_rgb(jpeg, szp[0], rp, wp, hp) != NX_JPEG_ASCII_OK { hw("decode fail\n" as *u8); return 1 }
93 let rgb: *u8 = rp[0] as *u8
94 let tw: i64 = wp[0]
95 let crops: *i64 = sys_mmap(NPAT*2*8) as *i64 // (cx, cy) skin regions: cheeks, forehead, chin, jaws
96 crops[0]=150; crops[1]=330
97 crops[2]=310; crops[3]=330
98 crops[4]=232; crops[5]=140
99 crops[6]=232; crops[7]=478
100 crops[8]=140; crops[9]=420
101 crops[10]=330; crops[11]=420
102 let tgtQ: *i64 = sys_mmap(NPAT*NPP*3*8) as *i64
103 let ex: *i64 = sys_mmap(NPAT*NPP*8) as *i64
104 let pmean: *i64 = sys_mmap(NPAT*3*8) as *i64 // per-patch mean rgb (for the skin-likeness test)
105 var p: i64 = 0
106 while p < NPAT {
107 var mr: i64 = 0
108 var mg: i64 = 0
109 var mb: i64 = 0
110 var py: i64 = 0
111 while py < PS {
112 var px: i64 = 0
113 while px < PS {
114 let o: i64 = ((crops[p*2+1]+py)*tw + crops[p*2]+px)*3
115 let r: i64 = (rgb[o] as i64)&255
116 let g: i64 = (rgb[o+1] as i64)&255
117 let b: i64 = (rgb[o+2] as i64)&255
118 let pi: i64 = p*NPP + py*PS+px
119 tgtQ[pi*3] = r*4096/255
120 tgtQ[pi*3+1] = g*4096/255
121 tgtQ[pi*3+2] = b*4096/255
122 ex[pi] = r + g*256 + b*65536
123 mr = mr + r; mg = mg + g; mb = mb + b
124 px = px + 1
125 }
126 py = py + 1
127 }
128 pmean[p*3] = mr/NPP; pmean[p*3+1] = mg/NPP; pmean[p*3+2] = mb/NPP
129 p = p + 1
130 }
131
132 // ---- shared Fourier features for the 32x32 coords ----
133 let FT: *i64 = sys_mmap(NPP*NFF*8) as *i64
134 var py2: i64 = 0
135 while py2 < PS {
136 var px: i64 = 0
137 while px < PS {
138 let fp: *i64 = (FT as i64 + (py2*PS+px)*NFF*8) as *i64
139 features(px, py2, fp)
140 px = px + 1
141 }
142 py2 = py2 + 1
143 }
144
145 // ---- model + per-patch latents; frequency-scaled init (the R1 lesson) ----
146 let W1: *i64 = sys_mmap(NH*NIN*8) as *i64
147 let B1: *i64 = sys_mmap(NH*8) as *i64
148 let W2: *i64 = sys_mmap(NO*NH*8) as *i64
149 let B2: *i64 = sys_mmap(NO*8) as *i64
150 let Z: *i64 = sys_mmap(NPAT*NL*8) as *i64
151 let gW1: *i64 = sys_mmap(NH*NIN*8) as *i64
152 let gB1: *i64 = sys_mmap(NH*8) as *i64
153 let gW2: *i64 = sys_mmap(NO*NH*8) as *i64
154 let gB2: *i64 = sys_mmap(NO*8) as *i64
155 let gZ: *i64 = sys_mmap(NPAT*NL*8) as *i64
156 let aW1: *i64 = sys_mmap(NH*NIN*8) as *i64
157 let aB1: *i64 = sys_mmap(NH*8) as *i64
158 let aW2: *i64 = sys_mmap(NO*NH*8) as *i64
159 let aB2: *i64 = sys_mmap(NO*8) as *i64
160 let aZ: *i64 = sys_mmap(NPAT*NL*8) as *i64
161 let st: *i64 = sys_mmap(16) as *i64
162 st[0] = 20260709
163 let bamp: *i64 = sys_mmap(8*8) as *i64
164 bamp[0]=600; bamp[1]=300; bamp[2]=150; bamp[3]=75; bamp[4]=38
165 var q: i64 = 0
166 while q < NH*NIN {
167 let col: i64 = q % NIN
168 var a: i64 = 150 // latent-input weights: small
169 if col < NFF { a = bamp[col/4] } // Fourier weights: freq-scaled
170 W1[q] = lcg(st) % (2*a) - a
171 q = q + 1
172 }
173 q = 0
174 while q < NH { B1[q] = ((q % 2)*2 - 1) * 150; q = q + 1 }
175 q = 0
176 while q < NO*NH { W2[q] = lcg(st) % 800 - 400; q = q + 1 }
177 q = 0
178 while q < NO { B2[q] = 2048; q = q + 1 }
179 q = 0
180 while q < NPAT*NL { Z[q] = lcg(st) % 600 - 300; q = q + 1 }
181
182 // ---- joint training: weights + latents, error-feedback updates ----
183 let h: *i64 = sys_mmap(NH*8) as *i64
184 let dh: *i64 = sys_mmap(NH*8) as *i64
185 let dob: *i64 = sys_mmap(NO*8) as *i64
186 let fin: *i64 = sys_mmap(NIN*8) as *i64
187 var err0: i64 = 0
188 var errN: i64 = 0
189 var ep: i64 = 0
190 while ep < EPOCHS {
191 q = 0
192 while q < NH*NIN { gW1[q]=0; q=q+1 }
193 q = 0
194 while q < NH { gB1[q]=0; q=q+1 }
195 q = 0
196 while q < NO*NH { gW2[q]=0; q=q+1 }
197 q = 0
198 while q < NO { gB2[q]=0; q=q+1 }
199 q = 0
200 while q < NPAT*NL { gZ[q]=0; q=q+1 }
201 var errsum: i64 = 0
202 p = 0
203 while p < NPAT {
204 var pi: i64 = 0
205 while pi < NPP {
206 let f: *i64 = (FT as i64 + pi*NFF*8) as *i64
207 var i2: i64 = 0
208 while i2 < NFF { fin[i2] = f[i2]; i2 = i2 + 1 }
209 i2 = 0
210 while i2 < NL { fin[NFF+i2] = Z[p*NL+i2]; i2 = i2 + 1 }
211 // forward
212 var j: i64 = 0
213 while j < NH {
214 var acc: i64 = B1[j]
215 i2 = 0
216 while i2 < NIN { acc = acc + W1[j*NIN+i2]*fin[i2]/4096; i2 = i2 + 1 }
217 if acc < 0 { acc = 0 }
218 if acc > 16384 { acc = 16384 }
219 h[j] = acc
220 j = j + 1
221 }
222 let ti: i64 = (p*NPP+pi)*3
223 var c: i64 = 0
224 while c < NO {
225 var acc: i64 = B2[c]
226 j = 0
227 while j < NH { acc = acc + W2[c*NH+j]*h[j]/4096; j = j + 1 }
228 var d: i64 = acc - tgtQ[ti+c]
229 if d > 8192 { d = 8192 }
230 if d < 0-8192 { d = 0-8192 }
231 dob[c] = d
232 var ad: i64 = d
233 if ad < 0 { ad = 0 - ad }
234 errsum = errsum + ad
235 c = c + 1
236 }
237 // backward
238 j = 0
239 while j < NH {
240 var dd: i64 = 0
241 c = 0
242 while c < NO { dd = dd + W2[c*NH+j]*dob[c]/4096; c = c + 1 }
243 if h[j] == 0 { dd = 0 }
244 dh[j] = dd
245 j = j + 1
246 }
247 c = 0
248 while c < NO {
249 let dc: i64 = dob[c]
250 j = 0
251 while j < NH { gW2[c*NH+j] = gW2[c*NH+j] + dc*h[j]/4096; j = j + 1 }
252 gB2[c] = gB2[c] + dc
253 c = c + 1
254 }
255 j = 0
256 while j < NH {
257 let dj: i64 = dh[j]
258 if dj != 0 {
259 i2 = 0
260 while i2 < NIN { gW1[j*NIN+i2] = gW1[j*NIN+i2] + dj*fin[i2]/4096; i2 = i2 + 1 }
261 gB1[j] = gB1[j] + dj
262 i2 = 0
263 while i2 < NL { gZ[p*NL+i2] = gZ[p*NL+i2] + dj*W1[j*NIN+NFF+i2]/4096; i2 = i2 + 1 }
264 }
265 j = j + 1
266 }
267 pi = pi + 1
268 }
269 p = p + 1
270 }
271 // error-feedback updates (weights over ALL px; latents over their patch's px)
272 let LR: i64 = 600
273 let D: i64 = NPAT*NPP*4096
274 let DZ: i64 = NPP*4096
275 q = 0
276 while q < NH*NIN { aW1[q] = aW1[q] + gW1[q]*LR; let s2: i64 = aW1[q]/D; W1[q] = W1[q] - s2; aW1[q] = aW1[q] - s2*D; q = q + 1 }
277 q = 0
278 while q < NH { aB1[q] = aB1[q] + gB1[q]*LR; let s2: i64 = aB1[q]/D; B1[q] = B1[q] - s2; aB1[q] = aB1[q] - s2*D; q = q + 1 }
279 q = 0
280 while q < NO*NH { aW2[q] = aW2[q] + gW2[q]*LR; let s2: i64 = aW2[q]/D; W2[q] = W2[q] - s2; aW2[q] = aW2[q] - s2*D; q = q + 1 }
281 q = 0
282 while q < NO { aB2[q] = aB2[q] + gB2[q]*LR; let s2: i64 = aB2[q]/D; B2[q] = B2[q] - s2; aB2[q] = aB2[q] - s2*D; q = q + 1 }
283 q = 0
284 while q < NPAT*NL { aZ[q] = aZ[q] + gZ[q]*900; let s2: i64 = aZ[q]/DZ; Z[q] = Z[q] - s2; aZ[q] = aZ[q] - s2*DZ; q = q + 1 }
285 let e255: i64 = errsum*255/(NPAT*NPP*3*4096)
286 if ep == 0 { err0 = e255 }
287 errN = e255
288 if ep % 100 == 0 { hw(" epoch "); pn(ep); hw(" mean|err|="); pn(e255); hw("/255\n" as *u8) }
289 ep = ep + 1
290 }
291 hw(" trained: err "); pn(err0); hw(" -> "); pn(errN); hw(" /255 ("); pn(NH*NIN+NH+NO*NH+NO); hw(" params + "); pn(NPAT*NL); hw(" latents)\n" as *u8)
292
293 var t1: i64 = 0
294 if errN*2 < err0 { t1 = 1 }
295 if t1 == 1 { hw("T1 PASS joint training converges across the 6-patch family\n" as *u8) }
296 else { fails=fails+1; hw("T1 FAIL\n" as *u8) }
297 var t2: i64 = 0
298 if errN < 22 { t2 = 1 }
299 if t2 == 1 { hw("T2 PASS faithful per-patch reconstruction (the latent separates the family)\n" as *u8) }
300 else { fails=fails+1; hw("T2 FAIL err="); pn(errN); hw("\n" as *u8) }
301
302 // ---- render reconstructions + NOVEL generations ----
303 let rec: *i64 = sys_mmap(NPAT*NPP*8) as *i64
304 p = 0
305 while p < NPAT {
306 var pi: i64 = 0
307 while pi < NPP {
308 let f: *i64 = (FT as i64 + pi*NFF*8) as *i64
309 var i2: i64 = 0
310 while i2 < NFF { fin[i2] = f[i2]; i2 = i2 + 1 }
311 i2 = 0
312 while i2 < NL { fin[NFF+i2] = Z[p*NL+i2]; i2 = i2 + 1 }
313 rec[p*NPP+pi] = infer(W1, B1, W2, B2, fin, h)
314 pi = pi + 1
315 }
316 p = p + 1
317 }
318 // novel latents: 3 interpolations + 3 jittered in-range draws (deterministic)
319 let ZN: *i64 = sys_mmap(NPAT*NL*8) as *i64
320 var l: i64 = 0
321 while l < NL {
322 ZN[l] = (Z[0*NL+l] + Z[1*NL+l])/2
323 ZN[NL+l] = (Z[2*NL+l] + Z[3*NL+l])/2
324 ZN[2*NL+l] = (Z[4*NL+l] + Z[5*NL+l])/2
325 ZN[3*NL+l] = (Z[0*NL+l] + Z[3*NL+l] + Z[5*NL+l])/3 + (lcg(st) % 120 - 60)
326 ZN[4*NL+l] = (Z[1*NL+l] + Z[2*NL+l] + Z[4*NL+l])/3 + (lcg(st) % 120 - 60)
327 ZN[5*NL+l] = (Z[0*NL+l]*3 - Z[1*NL+l])/2 + (lcg(st) % 80 - 40)
328 l = l + 1
329 }
330 let gen: *i64 = sys_mmap(NPAT*NPP*8) as *i64
331 p = 0
332 while p < NPAT {
333 var pi: i64 = 0
334 while pi < NPP {
335 let f: *i64 = (FT as i64 + pi*NFF*8) as *i64
336 var i2: i64 = 0
337 while i2 < NFF { fin[i2] = f[i2]; i2 = i2 + 1 }
338 i2 = 0
339 while i2 < NL { fin[NFF+i2] = ZN[p*NL+i2]; i2 = i2 + 1 }
340 gen[p*NPP+pi] = infer(W1, B1, W2, B2, fin, h)
341 pi = pi + 1
342 }
343 p = p + 1
344 }
345 // T3: each generation is (a) not a copy of ANY exemplar, (b) skin-like mean, (c) draws differ
346 var mincopy: i64 = 1000000000
347 var meanok: i64 = 0
348 var g2: i64 = 0
349 while g2 < NPAT {
350 var gmr: i64 = 0
351 var gmg: i64 = 0
352 var gmb: i64 = 0
353 var pi: i64 = 0
354 while pi < NPP { let v: i64 = gen[g2*NPP+pi]; gmr=gmr+(v&255); gmg=gmg+((v>>8)&255); gmb=gmb+((v>>16)&255); pi=pi+1 }
355 gmr=gmr/NPP; gmg=gmg/NPP; gmb=gmb/NPP
356 // skin-likeness: mean within the family's min..max band (+/-14)
357 var lo_r: i64 = 255; var hi_r: i64 = 0
358 var lo_g: i64 = 255; var hi_g: i64 = 0
359 var lo_b: i64 = 255; var hi_b: i64 = 0
360 p = 0
361 while p < NPAT {
362 if pmean[p*3] < lo_r { lo_r = pmean[p*3] }
363 if pmean[p*3] > hi_r { hi_r = pmean[p*3] }
364 if pmean[p*3+1] < lo_g { lo_g = pmean[p*3+1] }
365 if pmean[p*3+1] > hi_g { hi_g = pmean[p*3+1] }
366 if pmean[p*3+2] < lo_b { lo_b = pmean[p*3+2] }
367 if pmean[p*3+2] > hi_b { hi_b = pmean[p*3+2] }
368 p = p + 1
369 }
370 var okm: i64 = 1
371 if gmr < lo_r-14 { okm = 0 }
372 if gmr > hi_r+14 { okm = 0 }
373 if gmg < lo_g-14 { okm = 0 }
374 if gmg > hi_g+14 { okm = 0 }
375 if gmb < lo_b-14 { okm = 0 }
376 if gmb > hi_b+14 { okm = 0 }
377 meanok = meanok + okm
378 // distance to nearest exemplar
379 p = 0
380 while p < NPAT {
381 var d2: i64 = 0
382 pi = 0
383 while pi < NPP {
384 let a2: i64 = gen[g2*NPP+pi]
385 let b2: i64 = ex[p*NPP+pi]
386 var dd: i64 = (a2&255)-(b2&255); if dd<0 {dd=0-dd}
387 d2 = d2 + dd
388 pi = pi + 1
389 }
390 if d2 < mincopy { mincopy = d2 }
391 p = p + 1
392 }
393 g2 = g2 + 1
394 }
395 var divsum: i64 = 0
396 var pi3: i64 = 0
397 while pi3 < NPP { var dd: i64 = (gen[pi3]&255) - (gen[NPP+pi3]&255); if dd<0 {dd=0-dd} divsum = divsum + dd; pi3 = pi3 + 1 }
398 let mincopy255: i64 = mincopy/NPP
399 let div255: i64 = divsum/NPP
400 hw(" generation: min-dist-to-any-exemplar="); pn(mincopy255); hw("/255 skinlike "); pn(meanok); hw("/6 diversity(g0,g1)="); pn(div255); hw("/255\n" as *u8)
401 var t3: i64 = 0
402 if mincopy255 > 2 { if meanok >= 5 { if div255 > 2 { t3 = 1 } } }
403 if t3 == 1 { hw("T3 PASS GENERATION: novel latents -> novel, skin-like, diverse textures (not copies)\n" as *u8) }
404 else { fails=fails+1; hw("T3 FAIL generation\n" as *u8) }
405
406 // ---- T4 persist (weights + latents) -> reload -> bit-identical render ----
407 let NW: i64 = NH*NIN + NH + NO*NH + NO
408 let wf: i64 = sys_openat_wr("knowledge/skinfam_w.bin\x00" as *u8, 0x1a4)
409 sys_write(wf, W1 as *u8, NH*NIN*8)
410 sys_write(wf, B1 as *u8, NH*8)
411 sys_write(wf, W2 as *u8, NO*NH*8)
412 sys_write(wf, B2 as *u8, NO*8)
413 sys_write(wf, Z as *u8, NPAT*NL*8)
414 sys_close(wf)
415 let lsz: *i64 = sys_mmap(16) as *i64
416 let blob: *u8 = sys_read_file("knowledge/skinfam_w.bin" as *u8, lsz)
417 var t4: i64 = 0
418 if lsz[0] == (NW + NPAT*NL)*8 {
419 let L1p: *i64 = blob as *i64
420 let L2p: *i64 = (blob as i64 + NH*NIN*8) as *i64
421 let L3p: *i64 = (blob as i64 + NH*NIN*8 + NH*8) as *i64
422 let L4p: *i64 = (blob as i64 + NH*NIN*8 + NH*8 + NO*NH*8) as *i64
423 let LZp: *i64 = (blob as i64 + NW*8) as *i64
424 var diff: i64 = 0
425 var pi4: i64 = 0
426 while pi4 < NPP {
427 let f: *i64 = (FT as i64 + pi4*NFF*8) as *i64
428 var i2: i64 = 0
429 while i2 < NFF { fin[i2] = f[i2]; i2 = i2 + 1 }
430 i2 = 0
431 while i2 < NL { fin[NFF+i2] = LZp[2*NL+i2]; i2 = i2 + 1 }
432 if infer(L1p, L2p, L3p, L4p, fin, h) != rec[2*NPP+pi4] { diff = diff + 1 }
433 pi4 = pi4 + 1
434 }
435 if diff == 0 { t4 = 1 }
436 }
437 if t4 == 1 { hw("T4 PASS persisted (skinfam_w.bin) + reloaded render BIT-IDENTICAL\n" as *u8) }
438 else { fails=fails+1; hw("T4 FAIL persistence\n" as *u8) }
439
440 // ---- PNG: exemplars | reconstructions | novel generations (x3 upscale) ----
441 let CW: i64 = PS*3
442 let GW: i64 = CW*NPAT
443 let GH: i64 = CW*3
444 let gal: *i64 = sys_mmap(GW*GH*8) as *i64
445 var row: i64 = 0
446 while row < 3 {
447 p = 0
448 while p < NPAT {
449 var src: i64 = ex as i64
450 if row == 1 { src = rec as i64 }
451 if row == 2 { src = gen as i64 }
452 let sb: *i64 = src as *i64
453 var y: i64 = 0
454 while y < CW {
455 var x: i64 = 0
456 while x < CW {
457 gal[(row*CW+y)*GW + p*CW + x] = sb[p*NPP + (y/3)*PS + x/3]
458 x = x + 1
459 }
460 y = y + 1
461 }
462 p = p + 1
463 }
464 row = row + 1
465 }
466 write_png(gal, GW, GH, "knowledge/nx_skinfam.png" as *u8)
467 hw("PNG knowledge/nx_skinfam.png (exemplars | reconstructions | NOVEL)\n" as *u8)
468
469 if fails == 0 { hw("SKINFAM-GATE 4/4 GREEN -- P4 R2: a GENERATIVE sovereign skin-texture family (auto-decoder latents, integer end-to-end): novel latents -> NOVEL skin textures. seed->novel-skin unlocked for the neural track\n" as *u8); sys_exit(0); return 0 }
470 hw("SKINFAM-GATE RED fails="); pn(fails); hw("\n" as *u8)
471 sys_exit(1)
472 return 1
473}