code wiki / (root) / nx_forecast_test.nx

nx_forecast_test.nx source

↩ module page · 96 lines · 2921 B

1// nx_forecast_test.nx -- smoke for time-series forecasters. 2 3import "syscalls.nx" 4import "nx_forecast.nx" 5 6func main() -> i64 { 7 // === Test 1: SES on constant series === 8 let ses: *SES = (sys_mmap(24)) as *SES 9 nx_forecast_ses_init(ses, 8192) 10 var i: i64 = 0 11 while i < 20 { 12 nx_forecast_ses_observe(ses, 100) 13 i = i + 1 14 } 15 if nx_forecast_ses_predict(ses) != 100 { return 1 } 16 17 // === Test 2: SES on alternating series === 18 let ses2: *SES = (sys_mmap(24)) as *SES 19 nx_forecast_ses_init(ses2, 4096) 20 var i2: i64 = 0 21 while i2 < 30 { 22 var x: i64 = 100 23 let par: i64 = i2 - (i2 / 2) * 2 24 if par == 1 { x = 200 } 25 nx_forecast_ses_observe(ses2, x) 26 i2 = i2 + 1 27 } 28 let f2: i64 = nx_forecast_ses_predict(ses2) 29 if f2 < 130 { return 10 } 30 if f2 > 170 { return 11 } 31 32 // === Test 3: SES with alpha=1 hugs latest === 33 let ses3: *SES = (sys_mmap(24)) as *SES 34 nx_forecast_ses_init(ses3, 16384) 35 nx_forecast_ses_observe(ses3, 50) 36 nx_forecast_ses_observe(ses3, 80) 37 if nx_forecast_ses_predict(ses3) != 80 { return 20 } 38 39 // === Test 4: Holt tracks linear trend === 40 let h: *Holt = (sys_mmap(48)) as *Holt 41 nx_forecast_holt_init(h, 8192, 8192) 42 var t: i64 = 1 43 while t <= 10 { 44 nx_forecast_holt_observe(h, t * 10) 45 t = t + 1 46 } 47 let f4: i64 = nx_forecast_holt_predict(h) 48 let d4: i64 = f4 - 110 49 var ad4: i64 = d4 50 if ad4 < 0 { ad4 = -ad4 } 51 if ad4 > 10 { return 30 } 52 let dt: i64 = h.b - 10 53 var adt: i64 = dt 54 if adt < 0 { adt = -adt } 55 if adt > 5 { return 31 } 56 57 // === Test 5: Holt multi-step === 58 let f5: i64 = nx_forecast_holt_predict_h(h, 5) 59 let d5: i64 = f5 - 150 60 var ad5: i64 = d5 61 if ad5 < 0 { ad5 = -ad5 } 62 if ad5 > 15 { return 40 } 63 64 // === Test 6: AR(1) phi=1 === 65 let hist: *i64 = (sys_mmap(4 * 8)) as *i64 66 let coef: *i64 = (sys_mmap(4 * 8)) as *i64 67 hist[0] = 42 68 coef[0] = 16384 69 if nx_forecast_ar_predict(hist, coef, 1) != 42 { return 50 } 70 71 // === Test 7: AR(2) averaging === 72 hist[0] = 100 73 hist[1] = 60 74 coef[0] = 8192 75 coef[1] = 8192 76 if nx_forecast_ar_predict(hist, coef, 2) != 80 { return 60 } 77 78 // === Test 8: AR rollout phi=1 === 79 hist[0] = 10 80 coef[0] = 16384 81 let forecasts: *i64 = (sys_mmap(3 * 8)) as *i64 82 nx_forecast_ar_rollout(hist, coef, 1, 3, forecasts) 83 if forecasts[0] != 10 { return 70 } 84 if forecasts[1] != 10 { return 71 } 85 if forecasts[2] != 10 { return 72 } 86 87 // === Test 9: AR rollout phi=0.5 (decay) === 88 hist[0] = 100 89 coef[0] = 8192 90 nx_forecast_ar_rollout(hist, coef, 1, 3, forecasts) 91 if forecasts[0] != 50 { return 80 } 92 if forecasts[1] != 25 { return 81 } 93 if forecasts[2] != 12 { return 82 } 94 95 return 0 96}