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}