code wiki / _hdl_build / nx_deltaclass_lib.nx

nx_deltaclass_lib.nx source

↩ module page · 518 lines · 26467 B

1// nx_deltaclass_lib.nx -- WHY a headline ratio moved: SCOPE vs EXECUTION, decomposed EXACTLY. 2// 3// THE DEBT THIS EATS: the ecomat headline went 500 -> 418 permil over two weeks and READ AS DECAY. 4// It was not decay. Delivery rose 34 -> 51 levels (+250 permil at a FIXED bar) while the bar itself 5// rose 68 -> 122 (-332 permil of pure requirement growth). Net -82. Nobody could tell those apart 6// without deriving it by hand, so a marathon had no defined start and no defined end. 7// 8// THE DECOMPOSITION IS EXACT, not a heuristic. For ratio = cur/bar: 9// exec_effect = permil(cur1,bar0) - permil(cur0,bar0) <- what DELIVERY did, bar held FIXED 10// scope_effect = permil(cur1,bar1) - permil(cur1,bar0) <- what the REQUIREMENT move did 11// total = permil(cur1,bar1) - permil(cur0,bar0) 12// residual = total - exec - scope <- integer truncation, EMITTED not hidden 13// Both effects are computed INDEPENDENTLY and the residual is PRINTED rather than derived away, so 14// truncation stays visible. Deriving one term from the other would force residual==0 by construction 15// and hide the very rounding the integer-truncation law says goes silent. 16// 17// TWO ORTHOGONAL AXES, deliberately NOT collapsed into one label: a sample can raise the bar AND 18// deliver in the same window, and flattening that into a single enum is exactly how real progress 19// gets misread as thrashing. 20// 21// license_tier: ORIGINAL No hw writes (Rule 26). 22import "nx_syscalls.nx" 23 24const DC_PERMIL: i64 = 1000 25 26// scope axis -- what the BAR (the requirement) did 27const DCS_FLAT: i64 = 0 28const DCS_ADMIT: i64 = 1 29const DCS_RAISE: i64 = 2 30const DCS_LOWER: i64 = 3 31 32// execution axis -- what the NUMERATOR (delivery) did 33const DCE_FLAT: i64 = 0 34const DCE_GAIN: i64 = 1 35const DCE_LOSS: i64 = 2 36 37// marathon verdict -- THE START/END CRITERION 38const DCV_CONVERGING: i64 = 0 39const DCV_SCOPE_BOUND: i64 = 1 40const DCV_DIVERGING: i64 = 2 41const DCV_STALLED: i64 = 3 42const DCV_THRASH: i64 = 4 43// A LOSS is not a STALL. Lumping them together tells the operator "nothing moved" while ground is 44// being given up -- the worst direction for a status word to be wrong. Found by running the CLI on 45// the live ledger: a 52->51 window reported STALLED. 46const DCV_REGRESSION: i64 = 5 47 48// -1 sentinel = evidence absent. NEVER a silent 0: an UNMEASURED gap must not read as a CLOSED one. 49func dc_unmeasured() -> i64 { return 0 - 1 } 50 51func dc_abs(v: i64) -> i64 { if v < 0 { return 0 - v } return v } 52 53func dc_permil(cur: i64, bar: i64) -> i64 { 54 if bar <= 0 { return dc_unmeasured() } 55 if cur < 0 { return dc_unmeasured() } 56 return cur * DC_PERMIL / bar 57} 58 59// The bar moved -> requirements changed. ADMIT (new territory scoped in) is distinguished from 60// RAISE (same territory, higher target) because they demand OPPOSITE responses: admit is a 61// deliberate widening, raise is a standard tightening. 62func dc_scope_class(bar0: i64, bar1: i64, dom0: i64, dom1: i64) -> i64 { 63 if bar1 < bar0 { return DCS_LOWER } 64 if bar1 > bar0 { 65 if dom1 > dom0 { return DCS_ADMIT } 66 return DCS_RAISE 67 } 68 return DCS_FLAT 69} 70 71func dc_exec_class(cur0: i64, cur1: i64) -> i64 { 72 if cur1 > cur0 { return DCE_GAIN } 73 if cur1 < cur0 { return DCE_LOSS } 74 return DCE_FLAT 75} 76 77// what the ratio would have done had the BAR NOT MOVED 78func dc_exec_effect(cur0: i64, cur1: i64, bar0: i64) -> i64 { 79 let a: i64 = dc_permil(cur1, bar0) 80 let b: i64 = dc_permil(cur0, bar0) 81 if a == dc_unmeasured() { return dc_unmeasured() } 82 if b == dc_unmeasured() { return dc_unmeasured() } 83 return a - b 84} 85 86// what the BAR MOVE alone did, holding delivery at its NEW value 87func dc_scope_effect(cur1: i64, bar0: i64, bar1: i64) -> i64 { 88 let a: i64 = dc_permil(cur1, bar1) 89 let b: i64 = dc_permil(cur1, bar0) 90 if a == dc_unmeasured() { return dc_unmeasured() } 91 if b == dc_unmeasured() { return dc_unmeasured() } 92 return a - b 93} 94 95func dc_total(cur0: i64, bar0: i64, cur1: i64, bar1: i64) -> i64 { 96 let a: i64 = dc_permil(cur1, bar1) 97 let b: i64 = dc_permil(cur0, bar0) 98 if a == dc_unmeasured() { return dc_unmeasured() } 99 if b == dc_unmeasured() { return dc_unmeasured() } 100 return a - b 101} 102 103// the truncation artifact, MADE VISIBLE. Bounded small; a large residual means the inputs lied. 104func dc_residual(cur0: i64, bar0: i64, cur1: i64, bar1: i64) -> i64 { 105 let t: i64 = dc_total(cur0, bar0, cur1, bar1) 106 let e: i64 = dc_exec_effect(cur0, cur1, bar0) 107 let s: i64 = dc_scope_effect(cur1, bar0, bar1) 108 if t == dc_unmeasured() { return dc_unmeasured() } 109 if e == dc_unmeasured() { return dc_unmeasured() } 110 if s == dc_unmeasured() { return dc_unmeasured() } 111 return t - e - s 112} 113 114// levels still owed. Clamped at 0: delivery above bar is a bar that needs raising, not a negative gap. 115func dc_gap(cur: i64, bar: i64) -> i64 { 116 if bar < cur { return 0 } 117 return bar - cur 118} 119 120// THE NUMBER THAT ENDS THE ARGUMENT: is the bar growing faster than we close it? 121// If yes there is no ETA at any effort level -- the remedy is a scope decision, not more hours. 122func dc_diverging(cur0: i64, bar0: i64, cur1: i64, bar1: i64) -> i64 { 123 let db: i64 = bar1 - bar0 124 let dc: i64 = cur1 - cur0 125 if db <= 0 { return 0 } 126 if db > dc { return 1 } 127 return 0 128} 129 130// windows remaining at the OBSERVED net rate; unmeasured when there is no finite answer. 131// Ceiling division so a partial window counts as a whole one -- never round an ETA down. 132func dc_eta(cur0: i64, bar0: i64, cur1: i64, bar1: i64) -> i64 { 133 if bar1 <= 0 { return dc_unmeasured() } 134 if dc_diverging(cur0, bar0, cur1, bar1) == 1 { return dc_unmeasured() } 135 let net: i64 = (cur1 - cur0) - (bar1 - bar0) 136 if net <= 0 { return dc_unmeasured() } 137 let g: i64 = dc_gap(cur1, bar1) 138 if g == 0 { return 0 } 139 return (g + net - 1) / net 140} 141 142// moved==1 means the window contained real movement that netted out (a cycle), not a flat line. 143// Without that flag a stalled run and a thrashing run are indistinguishable at the endpoints. 144func dc_verdict(cur0: i64, bar0: i64, cur1: i64, bar1: i64, moved: i64) -> i64 { 145 if bar0 <= 0 { return dc_unmeasured() } 146 if bar1 <= 0 { return dc_unmeasured() } 147 if dc_diverging(cur0, bar0, cur1, bar1) == 1 { return DCV_DIVERGING } 148 if bar1 != bar0 { 149 let e: i64 = dc_exec_effect(cur0, cur1, bar0) 150 let s: i64 = dc_scope_effect(cur1, bar0, bar1) 151 if dc_abs(s) > dc_abs(e) { return DCV_SCOPE_BOUND } 152 } 153 if cur1 > cur0 { return DCV_CONVERGING } 154 if cur1 == cur0 { 155 if moved == 1 { return DCV_THRASH } 156 return DCV_STALLED 157 } 158 return DCV_REGRESSION 159} 160 161// ============ DM7 (devmgmt rung): dc_adopt_delta -- THE ADOPTION-DELTA EMITTER ============ 162// A LEVEL CANNOT EXPRESS A TRAJECTORY. One drift census says "162 stale"; two say "and it is 163// shrinking". This is the SECOND READER OF AN OLD LOG -- it composes census rows nx_artifactdrift 164// already appended to knowledge/status/artifactdrift.log and adds NO new collector and NO new load 165// on the array, which is the whole point of the rung: the cheapest new timescale is a new reader. 166// 167// TWO THINGS IT REFUSES TO DO, both measured hazards rather than hypotheticals: 168// 169// 1. COUNT A GATE'S TEST CENSUS AS REAL MOVEMENT. The log interleaves production sweeps with gate 170// fixture sweeps -- there is a real row reading `distinct=6` between two reading `distinct=963`. 171// The producer stamps `reg=<registry>` precisely so the two are mechanically separable, so a row 172// is PRODUCTION only when its reg= names the registry the caller asked about. Rows written before 173// that field existed carry NO reg=, and they are UNKNOWN-PROVENANCE: their own bucket, never 174// folded into either side. Guessing their provenance is how a fixture becomes a trend. 175// 176// 2. PRESENT A FOSSIL-DERIVED NUMBER AS MOVEMENT. A BEHIND row is measured against the last build 177// ANYBODY ran, so a stale reference can invert the sign of the very delta a promote campaign 178// would act on. The producer already qualifies each BEHIND row REF-FRESH / REF-FOSSIL / 179// REF-UNKNOWN and publishes `considerable` = UNDECLARED and REF-FRESH together. The promotable 180// delta is therefore the delta of `considerable`, and when either row predates those fields it 181// is emitted as UNMEASURED -- an axis that cannot see must abstain, never acquit. 182// 183// EVERY PARTITION IS PRINTED WITH ITS SUM, at BOTH levels and on BOTH the level and the delta: a 184// partition is a claim, and a delta of a partition is a claim about a claim. 185const DCA_UNMEASURED: i64 = 0 - 1 186const DCA_MAXROWS: i64 = 4096 // parsed census rows retained; overflow REFUSES loudly 187const DCA_FIELDS: i64 = 16 // fields captured per row (index consts below) 188const DCA_F_EPOCH: i64 = 0 189const DCA_F_DISTINCT: i64 = 1 190const DCA_F_IDENTICAL: i64 = 2 191const DCA_F_STALE: i64 = 3 192const DCA_F_BEHIND: i64 = 4 193const DCA_F_AHEAD: i64 = 5 194const DCA_F_RESIZED: i64 = 6 195const DCA_F_NOBUILD: i64 = 7 196const DCA_F_NOSERVED: i64 = 8 197const DCA_F_STAGEDPTR: i64 = 9 198const DCA_F_CONSIDERABLE: i64 = 10 199const DCA_F_REFFRESH: i64 = 11 200const DCA_F_REFFOSSIL: i64 = 12 201const DCA_F_UNDECLARED: i64 = 13 202const DCA_F_INFLIGHT: i64 = 14 203const DCA_CH_NL: i64 = 10 // ASCII newline 204const DCA_CH_SP: i64 = 32 // ASCII space 205const DCA_CH_0: i64 = 48 // ASCII '0' 206const DCA_CH_9: i64 = 57 // ASCII '9' 207const DCA_VCLASS: i64 = 32 // distinct nx_catalog VERDICT classes retained 208const DCA_VCELL: i64 = 64 // one verdict-class name cell 209 210func dca_len(s: *u8) -> i64 { var n: i64 = 0; while s[n] != (0 as u8) { n = n + 1 } return n } 211func dca_cat(d: *u8, o: i64, s: *u8) -> i64 { var i: i64 = 0; var p: i64 = o; while s[i] != (0 as u8) { d[p] = s[i]; p = p + 1; i = i + 1 } return p } 212func dca_catn(d: *u8, o: i64, v: i64) -> i64 { 213 let t: *u8 = sys_mmap(28) 214 var p: i64 = o 215 var m: i64 = v 216 if m < 0 { d[p] = 45 as u8; p = p + 1; m = 0 - m } 217 var k: i64 = 0 218 if m == 0 { t[0] = DCA_CH_0 as u8; k = 1 } 219 while m > 0 { t[k] = (DCA_CH_0 + (m % 10)) as u8; m = m / 10; k = k + 1 } 220 var i: i64 = 0 221 while i < k { d[p] = t[k-1-i]; p = p + 1; i = i + 1 } 222 return p 223} 224func dca_at(q: *u8, i: i64, e: i64, lit: *u8) -> i64 { 225 let ll: i64 = dca_len(lit) 226 if i + ll > e { return 0 } 227 var k: i64 = 0 228 var ok: i64 = 1 229 while k < ll { if q[i+k] != lit[k] { ok = 0; k = ll } else { k = k + 1 } } 230 return ok 231} 232// Read `key=<int>` from ONE line only. Anchored at a token boundary (line start or a space) so that 233// `own_undeclared=` can never be read as `undeclared=` -- a suffix match here would silently report a 234// different column under the right name, which is the confident-wrong-answer class this file exists 235// to stop. Returns DCA_UNMEASURED when the key is absent: never 0, because an absent field and a 236// measured zero demand opposite conclusions. 237func dca_field(q: *u8, ls: i64, le: i64, key: *u8) -> i64 { 238 let kl: i64 = dca_len(key) 239 var i: i64 = ls 240 var res: i64 = DCA_UNMEASURED 241 var go: i64 = 1 242 while go == 1 { 243 if i + kl > le { go = 0 } else { 244 var bound: i64 = 0 245 if i == ls { bound = 1 } else { if (q[i-1] as i64) == DCA_CH_SP { bound = 1 } } 246 if bound == 1 { 247 if dca_at(q, i, le, key) == 1 { 248 var j: i64 = i + kl 249 var v: i64 = 0 250 var any: i64 = 0 251 var g2: i64 = 1 252 while g2 == 1 { 253 if j >= le { g2 = 0 } else { 254 let c: i64 = q[j] as i64 255 if c < DCA_CH_0 { g2 = 0 } else { 256 if c > DCA_CH_9 { g2 = 0 } else { v = v * 10 + (c - DCA_CH_0); any = 1; j = j + 1 } 257 } 258 } 259 } 260 if any == 1 { res = v } 261 go = 0 262 } else { i = i + 1 } 263 } else { i = i + 1 } 264 } 265 } 266 return res 267} 268// PRODUCTION iff `reg=` is present AND names the registry the caller asked about. 269// 1 = PRODUCTION 0 = OTHER-REGISTRY (a gate fixture) -1 = UNKNOWN-PROVENANCE (no reg= at all) 270func dca_provenance(q: *u8, ls: i64, le: i64, reg: *u8) -> i64 { 271 let k: *u8 = " reg=" as *u8 272 let kl: i64 = dca_len(k) 273 var i: i64 = ls 274 var found: i64 = 0 - 1 275 var go: i64 = 1 276 while go == 1 { 277 if i + kl > le { go = 0 } else { 278 if dca_at(q, i, le, k) == 1 { 279 var j: i64 = i + kl 280 var m: i64 = 0 281 let rl: i64 = dca_len(reg) 282 var eq: i64 = 1 283 while m < rl { if j + m >= le { eq = 0; m = rl } else { if q[j+m] != reg[m] { eq = 0; m = rl } else { m = m + 1 } } } 284 if eq == 1 { if j + rl < le { if (q[j+rl] as i64) != DCA_CH_SP { eq = 0 } } } 285 if eq == 1 { found = 1 } else { found = 0 } 286 go = 0 287 } else { i = i + 1 } 288 } 289 } 290 return found 291} 292func dca_sums(f: *i64) -> i64 { 293 if f[DCA_F_DISTINCT] < 0 { return 0 } 294 if f[DCA_F_IDENTICAL] + f[DCA_F_STALE] + f[DCA_F_NOBUILD] + f[DCA_F_NOSERVED] + f[DCA_F_STAGEDPTR] != f[DCA_F_DISTINCT] { return 0 } 295 if f[DCA_F_BEHIND] + f[DCA_F_AHEAD] + f[DCA_F_RESIZED] != f[DCA_F_STALE] { return 0 } 296 return 1 297} 298func dca_drow(d: *u8, p: i64, name: *u8, a: i64, b: i64) -> i64 { 299 var o: i64 = dca_cat(d, p, "DELTA " as *u8) 300 o = dca_cat(d, o, name) 301 o = dca_cat(d, o, " prev=" as *u8); o = dca_catn(d, o, a) 302 o = dca_cat(d, o, " cur=" as *u8); o = dca_catn(d, o, b) 303 o = dca_cat(d, o, " d=" as *u8) 304 if a < 0 { o = dca_cat(d, o, "UNMEASURED" as *u8) } else { if b < 0 { o = dca_cat(d, o, "UNMEASURED" as *u8) } else { o = dca_catn(d, o, b - a) } } 305 d[o] = DCA_CH_NL as u8 306 return o + 1 307} 308// cx[0]=prod_rows cx[1]=rows_total cx[2]=refuse-code (0 ok) 309// returns report bytes, -1 log unreadable, -2 fewer than two PRODUCTION rows, -3 row table capped. 310func dc_adopt_delta(logp: *u8, reg: *u8, catp: *u8, d: *u8, cx: *i64) -> i64 { 311 cx[0] = 0 312 cx[1] = 0 313 cx[2] = 0 314 let nlen: *i64 = sys_mmap(16) as *i64 315 let q: *u8 = sys_map_file(logp, nlen) 316 if (q as i64) == 0 { return 0 - 1 } 317 let n: i64 = nlen[0] 318 let rows: *i64 = sys_mmap(8 * DCA_MAXROWS * DCA_FIELDS) as *i64 319 var nprod: i64 = 0 320 var ntot: i64 = 0 321 var nfix: i64 = 0 322 var nunk: i64 = 0 323 var nbad: i64 = 0 324 var capped: i64 = 0 325 var i: i64 = 0 326 while i < n { 327 var le: i64 = i 328 var s2: i64 = 1 329 while s2 == 1 { if le >= n { s2 = 0 } else { if (q[le] as i64) == DCA_CH_NL { s2 = 0 } else { le = le + 1 } } } 330 if le > i { 331 let ep: i64 = dca_field(q, i, le, "epoch=" as *u8) 332 if ep >= 0 { 333 ntot = ntot + 1 334 let pv: i64 = dca_provenance(q, i, le, reg) 335 if pv == 0 { nfix = nfix + 1 } 336 if pv < 0 { nunk = nunk + 1 } 337 if pv == 1 { 338 if nprod >= DCA_MAXROWS { capped = 1 } else { 339 let b: i64 = nprod * DCA_FIELDS 340 rows[b + DCA_F_EPOCH] = ep 341 rows[b + DCA_F_DISTINCT] = dca_field(q, i, le, "distinct=" as *u8) 342 rows[b + DCA_F_IDENTICAL] = dca_field(q, i, le, "identical=" as *u8) 343 rows[b + DCA_F_STALE] = dca_field(q, i, le, "stale=" as *u8) 344 rows[b + DCA_F_BEHIND] = dca_field(q, i, le, "behind=" as *u8) 345 rows[b + DCA_F_AHEAD] = dca_field(q, i, le, "ahead=" as *u8) 346 rows[b + DCA_F_RESIZED] = dca_field(q, i, le, "resized=" as *u8) 347 rows[b + DCA_F_NOBUILD] = dca_field(q, i, le, "nobuild=" as *u8) 348 rows[b + DCA_F_NOSERVED] = dca_field(q, i, le, "noserved=" as *u8) 349 rows[b + DCA_F_STAGEDPTR] = dca_field(q, i, le, "stagedptr=" as *u8) 350 rows[b + DCA_F_CONSIDERABLE] = dca_field(q, i, le, "considerable=" as *u8) 351 rows[b + DCA_F_REFFRESH] = dca_field(q, i, le, "ref_fresh=" as *u8) 352 rows[b + DCA_F_REFFOSSIL] = dca_field(q, i, le, "ref_fossil=" as *u8) 353 rows[b + DCA_F_UNDECLARED] = dca_field(q, i, le, "own_undeclared=" as *u8) 354 rows[b + DCA_F_INFLIGHT] = dca_field(q, i, le, "own_inflight=" as *u8) 355 if dca_sums(((rows as i64) + b * 8) as *i64) == 0 { nbad = nbad + 1 } 356 nprod = nprod + 1 357 } 358 } 359 } 360 } 361 i = le + 1 362 } 363 cx[0] = nprod 364 cx[1] = ntot 365 if capped == 1 { cx[2] = 3; return 0 - 3 } 366 if nprod < 2 { cx[2] = 2; return 0 - 2 } 367 let a: *i64 = ((rows as i64) + (nprod - 2) * DCA_FIELDS * 8) as *i64 368 let b2: *i64 = ((rows as i64) + (nprod - 1) * DCA_FIELDS * 8) as *i64 369 var p: i64 = 0 370 p = dca_cat(d, p, "# NX-ADOPT-DELTA v=1 tool=nx_deltaclass averb=adoptdelta\n" as *u8) 371 p = dca_cat(d, p, "# LOG " as *u8); p = dca_cat(d, p, logp) 372 p = dca_cat(d, p, " REGISTRY " as *u8); p = dca_cat(d, p, reg) 373 p = dca_cat(d, p, " log_bytes=" as *u8); p = dca_catn(d, p, n) 374 d[p] = DCA_CH_NL as u8; p = p + 1 375 // the provenance partition IS the guard against grading a fixture, so it is printed first 376 p = dca_cat(d, p, "# PROVENANCE rows=" as *u8); p = dca_catn(d, p, ntot) 377 p = dca_cat(d, p, " production=" as *u8); p = dca_catn(d, p, nprod) 378 p = dca_cat(d, p, " other_registry=" as *u8); p = dca_catn(d, p, nfix) 379 p = dca_cat(d, p, " unknown_provenance=" as *u8); p = dca_catn(d, p, nunk) 380 p = dca_cat(d, p, " sum=" as *u8); p = dca_catn(d, p, nprod + nfix + nunk) 381 p = dca_cat(d, p, " sum_ok=" as *u8) 382 if nprod + nfix + nunk == ntot { p = dca_catn(d, p, 1) } else { p = dca_catn(d, p, 0) } 383 d[p] = DCA_CH_NL as u8; p = p + 1 384 p = dca_cat(d, p, "# BEATS prev_epoch=" as *u8); p = dca_catn(d, p, a[DCA_F_EPOCH]) 385 p = dca_cat(d, p, " cur_epoch=" as *u8); p = dca_catn(d, p, b2[DCA_F_EPOCH]) 386 p = dca_cat(d, p, " span_s=" as *u8); p = dca_catn(d, p, b2[DCA_F_EPOCH] - a[DCA_F_EPOCH]) 387 p = dca_cat(d, p, " malformed_production_rows=" as *u8); p = dca_catn(d, p, nbad) 388 p = dca_cat(d, p, " prev_row_partition_ok=" as *u8); p = dca_catn(d, p, dca_sums(a)) 389 p = dca_cat(d, p, " cur_row_partition_ok=" as *u8); p = dca_catn(d, p, dca_sums(b2)) 390 d[p] = DCA_CH_NL as u8; p = p + 1 391 p = dca_drow(d, p, "distinct" as *u8, a[DCA_F_DISTINCT], b2[DCA_F_DISTINCT]) 392 p = dca_drow(d, p, "identical" as *u8, a[DCA_F_IDENTICAL], b2[DCA_F_IDENTICAL]) 393 p = dca_drow(d, p, "stale" as *u8, a[DCA_F_STALE], b2[DCA_F_STALE]) 394 p = dca_drow(d, p, "behind" as *u8, a[DCA_F_BEHIND], b2[DCA_F_BEHIND]) 395 p = dca_drow(d, p, "ahead" as *u8, a[DCA_F_AHEAD], b2[DCA_F_AHEAD]) 396 p = dca_drow(d, p, "resized" as *u8, a[DCA_F_RESIZED], b2[DCA_F_RESIZED]) 397 p = dca_drow(d, p, "nobuild" as *u8, a[DCA_F_NOBUILD], b2[DCA_F_NOBUILD]) 398 p = dca_drow(d, p, "noserved" as *u8, a[DCA_F_NOSERVED], b2[DCA_F_NOSERVED]) 399 p = dca_drow(d, p, "stagedptr" as *u8, a[DCA_F_STAGEDPTR], b2[DCA_F_STAGEDPTR]) 400 p = dca_drow(d, p, "own_undeclared" as *u8, a[DCA_F_UNDECLARED], b2[DCA_F_UNDECLARED]) 401 p = dca_drow(d, p, "own_inflight" as *u8, a[DCA_F_INFLIGHT], b2[DCA_F_INFLIGHT]) 402 p = dca_drow(d, p, "ref_fossil" as *u8, a[DCA_F_REFFOSSIL], b2[DCA_F_REFFOSSIL]) 403 // THE DELTA OF A PARTITION IS ITSELF A PARTITION -- and if it did not reconcile, one of the two 404 // rows was read with a different column set and every number above would be quietly wrong. 405 let dd: i64 = b2[DCA_F_DISTINCT] - a[DCA_F_DISTINCT] 406 let dp: i64 = (b2[DCA_F_IDENTICAL] - a[DCA_F_IDENTICAL]) + (b2[DCA_F_STALE] - a[DCA_F_STALE]) + (b2[DCA_F_NOBUILD] - a[DCA_F_NOBUILD]) + (b2[DCA_F_NOSERVED] - a[DCA_F_NOSERVED]) + (b2[DCA_F_STAGEDPTR] - a[DCA_F_STAGEDPTR]) 407 let ds: i64 = b2[DCA_F_STALE] - a[DCA_F_STALE] 408 let dsp: i64 = (b2[DCA_F_BEHIND] - a[DCA_F_BEHIND]) + (b2[DCA_F_AHEAD] - a[DCA_F_AHEAD]) + (b2[DCA_F_RESIZED] - a[DCA_F_RESIZED]) 409 p = dca_cat(d, p, "# DELTA-PARTITION d_distinct=" as *u8); p = dca_catn(d, p, dd) 410 p = dca_cat(d, p, " d_classes_sum=" as *u8); p = dca_catn(d, p, dp) 411 p = dca_cat(d, p, " delta_sum_ok=" as *u8) 412 if dd == dp { p = dca_catn(d, p, 1) } else { p = dca_catn(d, p, 0) } 413 p = dca_cat(d, p, " d_stale=" as *u8); p = dca_catn(d, p, ds) 414 p = dca_cat(d, p, " d_stale_sub_sum=" as *u8); p = dca_catn(d, p, dsp) 415 p = dca_cat(d, p, " stale_sub_sum_ok=" as *u8) 416 if ds == dsp { p = dca_catn(d, p, 1) } else { p = dca_catn(d, p, 0) } 417 d[p] = DCA_CH_NL as u8; p = p + 1 418 // PROMOTABLE: `considerable` already means UNDECLARED and REF-FRESH together, so a REF-FOSSIL row 419 // is excluded BY CONSTRUCTION rather than counted and apologised for afterwards. If either beat 420 // predates the field, the axis says UNMEASURED -- a promote campaign sized off a fossil-derived 421 // number points at exactly the action that destroys capability. 422 p = dca_cat(d, p, "# PROMOTABLE prev=" as *u8); p = dca_catn(d, p, a[DCA_F_CONSIDERABLE]) 423 p = dca_cat(d, p, " cur=" as *u8); p = dca_catn(d, p, b2[DCA_F_CONSIDERABLE]) 424 p = dca_cat(d, p, " d=" as *u8) 425 var promo_ok: i64 = 1 426 if a[DCA_F_CONSIDERABLE] < 0 { promo_ok = 0 } 427 if b2[DCA_F_CONSIDERABLE] < 0 { promo_ok = 0 } 428 if promo_ok == 1 { p = dca_catn(d, p, b2[DCA_F_CONSIDERABLE] - a[DCA_F_CONSIDERABLE]) } else { p = dca_cat(d, p, "UNMEASURED" as *u8) } 429 p = dca_cat(d, p, " fossil_excluded_by_construction=" as *u8); p = dca_catn(d, p, promo_ok) 430 p = dca_cat(d, p, " cur_ref_fossil=" as *u8); p = dca_catn(d, p, b2[DCA_F_REFFOSSIL]) 431 d[p] = DCA_CH_NL as u8; p = p + 1 432 // second census, composed not re-run 433 p = dca_cat(d, p, "# CATALOG " as *u8) 434 var have_cat: i64 = 0 435 if dca_len(catp) > 0 { if dca_at(catp, 0, dca_len(catp), "-" as *u8) == 0 { have_cat = 1 } } 436 if have_cat == 0 { p = dca_cat(d, p, "UNMEASURED input=<nx_catalog capture path> (an axis that cannot see abstains; it does not report an empty census)" as *u8) } else { 437 let clen: *i64 = sys_mmap(16) as *i64 438 let cq: *u8 = sys_map_file(catp, clen) 439 if (cq as i64) == 0 { p = dca_cat(d, p, "UNREADABLE path=" as *u8); p = dca_cat(d, p, catp) } else { 440 let cn: i64 = clen[0] 441 let voff: *i64 = sys_mmap(8 * DCA_VCLASS) as *i64 442 let vlen: *i64 = sys_mmap(8 * DCA_VCLASS) as *i64 443 let vcnt: *i64 = sys_mmap(8 * DCA_VCLASS) as *i64 444 var nv: i64 = 0 445 var names: i64 = 0 446 var vcap: i64 = 0 447 var j: i64 = 0 448 while j < cn { 449 var je: i64 = j 450 var s3: i64 = 1 451 while s3 == 1 { if je >= cn { s3 = 0 } else { if (cq[je] as i64) == DCA_CH_NL { s3 = 0 } else { je = je + 1 } } } 452 var k: i64 = j 453 var hit: i64 = 0 - 1 454 while k < je { if dca_at(cq, k, je, "VERDICT " as *u8) == 1 { hit = k; k = je } else { k = k + 1 } } 455 if hit >= 0 { 456 // separate cursor + explicit flag: a loop that exits by clobbering its own cursor 457 // destroys the span it was computing, and it has been written wrong here before. 458 var vs: i64 = hit + dca_len("VERDICT " as *u8) 459 var gsp: i64 = 1 460 while gsp == 1 { if vs >= je { gsp = 0 } else { if (cq[vs] as i64) == DCA_CH_SP { vs = vs + 1 } else { gsp = 0 } } } 461 var ve: i64 = vs 462 var gve: i64 = 1 463 while gve == 1 { if ve >= je { gve = 0 } else { if (cq[ve] as i64) == DCA_CH_SP { gve = 0 } else { ve = ve + 1 } } } 464 var found: i64 = 0 - 1 465 var t: i64 = 0 466 while t < nv { 467 if vlen[t] == ve - vs { 468 var m: i64 = 0 469 var eq: i64 = 1 470 while m < ve - vs { if cq[voff[t]+m] != cq[vs+m] { eq = 0; m = ve - vs } else { m = m + 1 } } 471 if eq == 1 { found = t; t = nv } 472 } 473 t = t + 1 474 } 475 if found < 0 { 476 if nv >= DCA_VCLASS { vcap = 1 } else { voff[nv] = vs; vlen[nv] = ve - vs; vcnt[nv] = 1; nv = nv + 1 } 477 } else { vcnt[found] = vcnt[found] + 1 } 478 names = names + 1 479 } 480 j = je + 1 481 } 482 p = dca_cat(d, p, "path=" as *u8); p = dca_cat(d, p, catp) 483 p = dca_cat(d, p, " names=" as *u8); p = dca_catn(d, p, names) 484 p = dca_cat(d, p, " classes=" as *u8); p = dca_catn(d, p, nv) 485 p = dca_cat(d, p, " class_table_capped=" as *u8); p = dca_catn(d, p, vcap) 486 d[p] = DCA_CH_NL as u8; p = p + 1 487 var t2: i64 = 0 488 var csum: i64 = 0 489 while t2 < nv { 490 p = dca_cat(d, p, "CATALOG-CLASS " as *u8) 491 var m2: i64 = 0 492 while m2 < vlen[t2] { d[p] = cq[voff[t2]+m2]; p = p + 1; m2 = m2 + 1 } 493 p = dca_cat(d, p, " n=" as *u8); p = dca_catn(d, p, vcnt[t2]) 494 d[p] = DCA_CH_NL as u8; p = p + 1 495 csum = csum + vcnt[t2] 496 t2 = t2 + 1 497 } 498 p = dca_cat(d, p, "# CATALOG-PARTITION classes_sum=" as *u8); p = dca_catn(d, p, csum) 499 p = dca_cat(d, p, " names=" as *u8); p = dca_catn(d, p, names) 500 p = dca_cat(d, p, " sum_ok=" as *u8) 501 if csum == names { p = dca_catn(d, p, 1) } else { p = dca_catn(d, p, 0) } 502 } 503 } 504 d[p] = DCA_CH_NL as u8; p = p + 1 505 p = dca_cat(d, p, "ADOPTDELTA production_rows=" as *u8); p = dca_catn(d, p, nprod) 506 p = dca_cat(d, p, " d_distinct=" as *u8); p = dca_catn(d, p, dd) 507 p = dca_cat(d, p, " d_stale=" as *u8); p = dca_catn(d, p, ds) 508 p = dca_cat(d, p, " sum_ok=" as *u8) 509 var allok: i64 = 1 510 if dd != dp { allok = 0 } 511 if ds != dsp { allok = 0 } 512 if dca_sums(a) == 0 { allok = 0 } 513 if dca_sums(b2) == 0 { allok = 0 } 514 if nprod + nfix + nunk != ntot { allok = 0 } 515 p = dca_catn(d, p, allok) 516 d[p] = DCA_CH_NL as u8; p = p + 1 517 return p 518}