code wiki / _hdl_build / nx_ng_diffrender.nx

nx_ng_diffrender.nx

buildroot/runtime/_hdl_build/nx_ng_diffrender.nx

6214 B114 linesdepth 2pulls 2 transitivereach 0 importersview sourcekind tooltopic ng
docsdependenciesstructsconstsfunctions

about

nx_ng_diffrender.nx -- CAP-DIFF-RENDER, the next missing generation past the sovereign-raster substrate (nx_ng_gap: prereqs CAP-RASTER + CAP-NF-AUTOGRAD BUILT -> this is the adjacent-possible build). The FIRST rung of differentiable rendering: gradients of rendered PIXELS w.r.t. a SCENE PARAMETER, the substrate NeRF / 3D-Gaussian-Splatting optimization is built on. Minimal honest proof (operator: measured, no wave; HARD evidence per the genealogy ladder): a 1D soft-edge rasterizer renders an image from one scene param p (the edge position) in Q16 fixed-point. We then OPTIMIZE p by gradient descent to match a target image (rendered at p*). Correctness is proven the rigorous way: T1 DESCENT converges -- GD on p drives loss -> ~0 and p -> p* (the gradient points the right way), T2 NEG-CONTROL diverges -- ASCENDING the same gradient INCREASES loss (the gradient has teeth/direction), T3 finite-difference SIGN check -- sign(analytic dLoss/dp) == sign((L(p+e)-L(p-e))) (the gradient is real), T4 zero-at-optimum -- loss(p*) == 0 (the render + loss are consistent). Q16 fixed-point only (no float), sovereign syscalls only. license_tier: ORIGINAL expect_exit: 0

dependencies 1 imports · 0 importers

nx_syscalls.nx nx_ng_diffrender.nx

imports: nx_syscalls.nx

imported by: nobody (leaf or entry point)

call flow from main pre-order; caps 40 nodes / depth 6 declared; ↻ = already shown

main dp sys_write sys_mmap dr_render dr_cov dr_qm dr_clamp dr_loss dr_cov ↻ dr_qm ↻ dpn sys_mmap ↻ sys_write ↻ dr_grad dr_cov ↻ dr_active dr_qm ↻ dr_qm ↻ dr_qm ↻ sys_exit

structs

none

consts

16const Q: i64 = 65536 // 1.0 in Q16
17const HALF: i64 = 32768 // 0.5
18const NPX: i64 = 16 // canvas pixels
19const INVS: i64 = 16384 // 1/s with softness s=4 px (Q16/4)
20const PSTAR: i64 = 524288 // target edge position = 8.0 px
21const P0: i64 = 196608 // initial guess = 3.0 px
22const LR: i64 = 4096 // learning rate = 0.0625 (Q16)
23const NSTEP: i64 = 120
24const EPS: i64 = 16384 // finite-diff step = 0.25 px
25const PCHK: i64 = 393216 // sign-check point = 6.0 px
26const TOL: i64 = 32768 // convergence tolerance = 0.5 px

functions

28func dp(s: *u8) -> i64 { var n: i64 = 0; while s[n] != (0 as u8) { n = n + 1 } sys_write(1, s, n); return 0 }
called by 1: main calls 1: sys_write
29func dpn(v: i64) -> i64
called by 1: main calls 2: sys_mmapsys_write
38func dr_qm(a: i64, b: i64) -> i64 { return (a * b) >> 16 }
39func dr_clamp(u: i64) -> i64 { if u < 0 { return 0 } if u > Q { return Q } return u }
called by 1: dr_cov
41func dr_cov(i: i64, p: i64) -> i64 { let di: i64 = i * Q - p; let u: i64 = dr_qm(di, INVS) + HALF; return dr_clamp(u) }
43func dr_active(i: i64, p: i64) -> i64 { let di: i64 = i * Q - p; let u: i64 = dr_qm(di, INVS) + HALF; if u > 0 { if u < Q { return 1 } } return 0 }
called by 1: dr_grad calls 1: dr_qm
44func dr_render(p: i64, out: *i64) -> i64 { var i: i64 = 0; while i < NPX { out[i] = dr_cov(i, p); i = i + 1 } return 0 }
called by 1: main calls 1: dr_cov
45func dr_loss(p: i64, tgt: *i64) -> i64 { var s: i64 = 0; var i: i64 = 0; while i < NPX { let d: i64 = dr_cov(i, p) - tgt[i]; s = s + dr_qm(d, d); i = i + 1 } return s }
called by 1: main calls 2: dr_covdr_qm
47func dr_grad(p: i64, tgt: *i64) -> i64
called by 1: main calls 3: dr_covdr_activedr_qm
60func main() -> i64