code wiki / (root) / nx_damages_gate.nx

nx_damages_gate.nx source

↩ module page · 88 lines · 4507 B

1// nx_damages_gate.nx -- PREJUDGMENT INTEREST GATE. 2// Proves the exact day count (via composed nx_sol), simple and annually-compounded interest, that compound 3// exceeds simple for the same period, the total-award composition, a full real scenario ($50k loss over an 4// exact 3-year interval at 8pct simple = $12k interest), and the fail-closed refusals (judgment before 5// accrual, negative principal/rate/days, sentinel propagation). license_tier: ORIGINAL No hw writes (Rule 26). expect_exit: 0 6 7import "nx_damages_lib.nx" 8import "nx_matter_lib.nx" 9 10func dm_puts(s: *u8) -> i64 { var n: i64 = 0; while s[n] != (0 as u8) { n = n + 1 } sys_write(1, s, n); return 0 } 11func dm_putn(v: i64) -> i64 { 12 let t: *u8 = sys_mmap(32) 13 var o: i64 = 0 14 var m: i64 = v 15 if m < 0 { t[o] = 45 as u8; o = o + 1; m = 0 - m } 16 let d: *u8 = sys_mmap(32) 17 var k: i64 = 0 18 if m == 0 { d[0] = 48 as u8; k = 1 } 19 while m > 0 { d[k] = (48 + (m % 10)) as u8; m = m / 10; k = k + 1 } 20 var i: i64 = 0 21 while i < k { t[o] = d[k - 1 - i]; o = o + 1; i = i + 1 } 22 sys_write(1, t, o) 23 return 0 24} 25func dm_ck(cnt: *i64, name: *u8, got: i64, want: i64) -> i64 { 26 if got == want { 27 cnt[0] = cnt[0] + 1 28 dm_puts(" PASS " as *u8); dm_puts(name); dm_puts(" = " as *u8); dm_putn(got); dm_puts("\n" as *u8) 29 return 1 30 } 31 cnt[1] = cnt[1] + 1 32 dm_puts(" FAIL " as *u8); dm_puts(name); dm_puts(" got " as *u8); dm_putn(got) 33 dm_puts(" want " as *u8); dm_putn(want); dm_puts("\n" as *u8) 34 return 0 35} 36 37func main(argc: i64, argv: *i64) -> i64 { 38 let cnt: *i64 = sys_mmap(16) as *i64 39 cnt[0] = 0 40 cnt[1] = 0 41 42 dm_puts("NISHI-DAMAGES-GATE (prejudgment interest: exact day count via nx_sol, simple/compound, fail-closed)\n" as *u8) 43 44 // ---- exact day count (composed from nx_sol) ---- 45 dm_ck(cnt, "D1 2020-01-01 to 2022-01-01 = 731 days (leap-aware)" as *u8, dmg_days_between(2020, 1, 1, 2022, 1, 1), 731) 46 47 // ---- simple interest: $1000.00 principal at 10pct ---- 48 dm_ck(cnt, "D2 simple 100000c @10pct for 365d = 10000 ($100)" as *u8, dmg_simple_interest(100000, 1000, 365), 10000) 49 dm_ck(cnt, "D3 simple 100000c @10pct for 730d = 20000 ($200)" as *u8, dmg_simple_interest(100000, 1000, 730), 20000) 50 dm_ck(cnt, "D4 simple for 0 days = 0" as *u8, dmg_simple_interest(100000, 1000, 0), 0) 51 52 // ---- annually compounded ---- 53 dm_ck(cnt, "D5 compound 100000c @10pct for 2yr = 21000 interest" as *u8, dmg_compound_interest(100000, 1000, 2), 21000) 54 let comp: i64 = dmg_compound_interest(100000, 1000, 2) 55 let simp: i64 = dmg_simple_interest(100000, 1000, 730) 56 var cgt: i64 = 0 57 if comp > simp { cgt = 1 } 58 dm_ck(cnt, "D6 compound > simple over the same 2 years" as *u8, cgt, 1) 59 dm_ck(cnt, "D7 compound for 0 years = 0" as *u8, dmg_compound_interest(100000, 1000, 0), 0) 60 61 // ---- total award ---- 62 dm_ck(cnt, "D8 total award = principal + interest = 120000" as *u8, dmg_total_award(100000, 20000), 120000) 63 64 // ---- *REAL SCENARIO: $50,000 loss on 2020-03-15, judgment 2023-03-15, 8pct simple ---- 65 let days: i64 = dmg_days_between(2020, 3, 15, 2023, 3, 15) 66 dm_ck(cnt, "D9 exact interval 2020-03-15 to 2023-03-15 = 1095 days" as *u8, days, 1095) 67 let intr: i64 = dmg_simple_interest(5000000, 800, days) 68 dm_ck(cnt, "D10 prejudgment interest = 1200000c ($12,000 = 8pct x 3yr x $50k)" as *u8, intr, 1200000) 69 dm_ck(cnt, "D11 total award = 6200000c ($62,000)" as *u8, dmg_total_award(5000000, intr), 6200000) 70 71 // ---- *FAIL-CLOSED ---- 72 dm_ck(cnt, "D12 judgment BEFORE accrual -> DMG_BAD" as *u8, dmg_days_between(2022, 1, 1, 2020, 1, 1), DMG_BAD) 73 dm_ck(cnt, "D13 negative principal -> DMG_BAD" as *u8, dmg_simple_interest(0 - 100, 1000, 365), DMG_BAD) 74 dm_ck(cnt, "D14 negative rate -> DMG_BAD" as *u8, dmg_simple_interest(100000, 0 - 5, 365), DMG_BAD) 75 dm_ck(cnt, "D15 negative days -> DMG_BAD" as *u8, dmg_simple_interest(100000, 1000, 0 - 5), DMG_BAD) 76 dm_ck(cnt, "D16 total award propagates the sentinel" as *u8, dmg_total_award(100000, DMG_BAD), DMG_BAD) 77 78 dm_puts("nx_damages_gate: pass=" as *u8); dm_putn(cnt[0]) 79 dm_puts(" fail=" as *u8); dm_putn(cnt[1]); dm_puts("\n" as *u8) 80 if cnt[1] == 0 { 81 dm_puts("DAMAGES nx_damages: VERDICT=GREEN (exact prejudgment interest on a composed nx_sol day count; fail-closed)\n" as *u8) 82 sys_exit(0) 83 return 0 84 } 85 dm_puts("DAMAGES nx_damages: VERDICT=RED\n" as *u8) 86 sys_exit(1) 87 return 1 88}