nx_gsplat_density_gate.nx
buildroot/runtime/nx_gsplat_density_gate.nx
about
nx_gsplat_density_gate.nx -- ADAPTIVE DENSITY: does adding primitives where the residual asks for
them actually reconstruct better, or is it tessellating noise?
*** THE ACCEPT RULE, PRE-DECLARED BEFORE THE IMPLEMENTATION WAS WRITTEN ***
A before/after comparison is NOT good enough here and the reason is specific: densification changes
the primitive count, so "loss fell after densifying" is satisfied by simply fitting longer. The two
arms therefore get the SAME TOTAL FITTING BUDGET and differ only in whether density is adapted:
ARM A (control): 2*FD_STEPS gradient steps at the starting count, no densification
ARM B : FD_STEPS steps, ONE densify, FD_STEPS steps
ACCEPT iff lossB < lossA. Densification then has to earn its result against the fitter working
equally hard without it -- which is the only comparison that can distinguish adapting density from
spending more iterations.
*** REACHABILITY IS ASSERTED FIRST, ARITHMETICALLY, BEFORE ANY ARM IS BELIEVED -- AND IT IS TWO
*** QUESTIONS, NOT ONE. THIS GATE'S FIRST RED PROVED THAT, AGAINST ITS OWN AUTHOR.
v1 built a fixture whose third feature lay BEYOND every primitive's support and asserted exactly
that as its reachability tooth. The tooth PASSED and the run came back RED with gmean=0 -- because
the gradient is accumulated ONLY over each primitive's own footprint, so a feature that no primitive
touches contributes NOTHING to any gradient. The densifier could not feel the residual it was being
asked to fix. THE FIXTURE PROVED THE WRONG REACHABILITY, AND THE TOOTH CERTIFIED IT.
T0a SIGNAL reachable -- the unresolved detail must lie INSIDE the covering primitive's support,
or no gradient carries it and no criterion can ever fire.
T0b IMPROVEMENT reachable -- that detail must be separated by more than the information floor of
one pixel, or more primitives cannot represent what one cannot.
Both are computed from the LIVE conic (gs_splat_rx on the rendered pa), never from a comment.
⚠AND THE UNDERLYING LIMIT IS REAL AND SHARED WITH PUBLISHED 3DGS: densification GROWS primitives
where support already exists; it does not DISCOVER regions nothing covers. Those are the business of
initialisation (a point cloud), not of adaptive density. Naming it here so the next reader does not
re-file this fixture bug as a densifier bug.
*** THE ANTI-VACUITY TOOTH, AND THE FAILURE IT IS BUILT FROM ***
The sibling gate's T14 v1 asserted only `mv_full > 0` -- a bound ANY number satisfies -- and so it
PASSED on a result 46 billion units out. The vacuous-tooth defect, committed inside the gate built to
prevent it. The bounds here are ones only a working implementation can meet:
T4 out > in -- a "densified" run that silently added nothing FAILS
T6 lossB < lossA -- at equal budget; a fit that ends no better than the control has bought
nothing, and one that ends WORSE has diverged
T7 both at once -- adding primitives without reducing residual IS tessellating noise, so
neither half alone is allowed to carry the verdict
T6's bound is the CONTROL's own measured loss, not a chosen epsilon -- there is no tunable number in
dependencies 5 imports · 0 importers
imports: nx_syscalls.nxnx_itrig.nxnx_gsplat.nxnx_gsplat_density.nxnx_gate_verdict.nx
imported by: nobody (leaf or entry point)
call flow from main pre-order; caps 40 nodes / depth 6 declared; ↻ = already shown
structs
| none |
consts
| 55 | const FD_NGMAX: i64 = 16 |
| 56 | const FD_START: i64 = 2 |
| 57 | const FD_TRUTH: i64 = 3 |
| 58 | const FD_STEPS: i64 = 10 |
| 59 | const FD_CAMZ: i64 = 30 |
| 60 | const FD_RTAN: i64 = 560 |
| 65 | const FD_PAIR: i64 = 400 |
| 68 | const FD_FAR: i64 = 5000 |
| 69 | const FD_TILT: i64 = 181 |
| 70 | const FD_W64: i64 = 8 |
| 71 | const FD_BGR: i64 = 26 |
| 72 | const FD_BGG: i64 = 28 |
| 73 | const FD_BGB: i64 = 44 |
| 74 | const FD_OP: i64 = 200 |
functions
| 76 | func fd_abs(v: i64) -> i64 { if v < 0 { return 0 - v } return v } called by 1: main |
| 78 | func fd_truth(g: *i64) -> i64 |
| 93 | func fd_start(g: *i64) -> i64 |
| 99 | func fd_copy(dst: *i64, src: *i64, n: i64) -> i64 called by 1: main |
| 105 | func main() -> i64 |