1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
use crateExpr;
use crate;
/// # Safety
///
/// This function is unsafe because it dereferences raw pointers as part of the FFI boundary.
/// The caller must ensure:
/// 1. All pointer arguments are valid and point to initialized memory.
/// 2. The memory layout of passed structures matches the expected C-ABI layout.
/// 3. Any pointers returned by this function are managed according to the API's ownership rules.
unsafe
// Convert HypothesisTest to a boxed Expr (representing a struct/map)
// Since HypothesisTest is a struct, we maybe should return it as a serialized string or abstract handle?
// Handle API typically returns *mut Expr. We can wrap HypothesisTest in Expr::Custom or just return test_statistic?
// The user likely wants the full test result.
// A better way is to return *mut HypothesisTest if we want to expose it as an opaque type, or return a standardized Expr representation (e.g. Map).
// However, Expr doesn't have a Map variant.
// Let's assume we return the `test_statistic` for now, OR we add a FFI function to get specific fields.
// Actually, let's just return the test statistic as the primary result, or create separate functions for p-value.
// BUT, to be comprehensive, let's assume the user wants the full object.
// We can serialize it to JSON and return string in JSON API.
// In Handle API, we might return an opaque handle to HypothesisTest, but `Expr` is the standard handle type.
// Let's assume we return `test_statistic` as the Expr handle for simple usage.
// AND provide a specific function to get p-value expr.
// Better yet, let's implement `rssn_one_sample_t_test` returning `*mut HypothesisTest` (opaque).
// But existing pattern uses `*mut Expr`.
// Let's define an opaque wrapper or just return `test_statistic` Expr for now to keep simple consistency with "symbolic math" theme,
// AND provide `rssn_one_sample_t_test_details` to get p-value etc.
// Wait, the prompt implies "implement FFI for stats_inference".
// Let's create proper opaque handles for `HypothesisTest` ?
// Usually, we stick to `Expr` if possible.
// Let's wrap HypothesisTest in `Expr::Tuple` or similar if we strictly return `Expr`.
// Tuple(stat, p_value, df) seems reasonable?
/// Performs a one-sample t-test.
///
/// Takes a raw pointer to an array of `Expr` (data), its length,
/// and a raw pointer to an `Expr` (target mean).
/// Returns a raw pointer to an `Expr` tuple containing the test statistic,
/// p-value formula, and degrees of freedom.
///
/// # Safety
///
/// This function is unsafe because it dereferences raw pointers as part of the FFI boundary.
/// The caller must ensure:
/// 1. All pointer arguments are valid and point to initialized memory.
/// 2. The memory layout of passed structures matches the expected C-ABI layout.
/// 3. Any pointers returned by this function are managed according to the API's ownership rules.
pub unsafe extern "C"
/// Performs a two-sample t-test.
///
/// Takes raw pointers to two arrays of `Expr` (data sets), their lengths,
/// and a raw pointer to an `Expr` (hypothesized difference in means).
/// Returns a raw pointer to an `Expr` tuple containing the test statistic,
/// p-value formula, and degrees of freedom.
///
/// # Safety
///
/// This function is unsafe because it dereferences raw pointers as part of the FFI boundary.
/// The caller must ensure:
/// 1. All pointer arguments are valid and point to initialized memory.
/// 2. The memory layout of passed structures matches the expected C-ABI layout.
/// 3. Any pointers returned by this function are managed according to the API's ownership rules.
pub unsafe extern "C"
/// Performs a z-test.
///
/// Takes a raw pointer to an array of `Expr` (data), its length,
/// a raw pointer to an `Expr` (target mean), and a raw pointer to an `Expr` (population standard deviation).
/// Returns a raw pointer to an `Expr` tuple containing the test statistic,
/// p-value formula, and a placeholder for degrees of freedom.
///
/// # Safety
///
/// This function is unsafe because it dereferences raw pointers as part of the FFI boundary.
/// The caller must ensure:
/// 1. All pointer arguments are valid and point to initialized memory.
/// 2. The memory layout of passed structures matches the expected C-ABI layout.
/// 3. Any pointers returned by this function are managed according to the API's ownership rules.
pub unsafe extern "C"