1#![allow(dead_code)]
7#![allow(non_camel_case_types)]
9
10use crate::c_api::*;
11use std::ptr;
12
13#[repr(C)]
15pub struct _jobject {
16 _private: [u8; 0],
17}
18pub type jobject = *mut _jobject;
19
20#[repr(C)]
21pub struct _jclass {
22 _private: [u8; 0],
23}
24pub type jclass = *mut _jclass;
25
26#[repr(C)]
27pub struct _JNIEnv {
28 _private: [u8; 0],
29}
30pub type JNIEnv = *mut _JNIEnv;
31
32pub type jlong = i64;
33pub type jint = i32;
34pub type jfloat = f32;
35pub type jdouble = f64;
36pub type jboolean = u8;
37pub type jsize = jint;
38
39#[repr(C)]
41pub struct _jfloatArray {
42 _private: [u8; 0],
43}
44pub type jfloatArray = *mut _jfloatArray;
45
46#[repr(C)]
47pub struct _jintArray {
48 _private: [u8; 0],
49}
50pub type jintArray = *mut _jintArray;
51
52#[no_mangle]
54pub unsafe extern "C" fn Java_com_torsh_Tensor_nativeCreateTensor(
55 _env: JNIEnv,
56 _class: jclass,
57 _data: jfloatArray,
58 _shape: jintArray,
59 _dtype: jint,
60) -> jlong {
61 let tensor_ptr = torsh_tensor_new(
71 ptr::null(), ptr::null(), 0, TorshDType::F32,
75 );
76
77 tensor_ptr as jlong
78}
79
80#[no_mangle]
82pub unsafe extern "C" fn Java_com_torsh_Tensor_nativeAdd(
83 _env: JNIEnv,
84 _class: jclass,
85 a_handle: jlong,
86 b_handle: jlong,
87) -> jlong {
88 let a = a_handle as *mut TorshTensor;
89 let b = b_handle as *mut TorshTensor;
90
91 let error = torsh_tensor_add(a, b, a);
93 if error != TorshError::Success {
94 return 0; }
96 a as jlong
97}
98
99#[no_mangle]
101pub unsafe extern "C" fn Java_com_torsh_Tensor_nativeMultiply(
102 _env: JNIEnv,
103 _class: jclass,
104 a_handle: jlong,
105 b_handle: jlong,
106) -> jlong {
107 let a = a_handle as *mut TorshTensor;
108 let b = b_handle as *mut TorshTensor;
109
110 let error = torsh_tensor_mul(a, b, a);
112 if error != TorshError::Success {
113 return 0; }
115 a as jlong
116}
117
118#[no_mangle]
120pub unsafe extern "C" fn Java_com_torsh_Tensor_nativeMatmul(
121 _env: JNIEnv,
122 _class: jclass,
123 a_handle: jlong,
124 b_handle: jlong,
125) -> jlong {
126 let a = a_handle as *mut TorshTensor;
127 let b = b_handle as *mut TorshTensor;
128
129 let error = torsh_tensor_matmul(a, b, a);
131 if error != TorshError::Success {
132 return 0; }
134 a as jlong
135}
136
137#[no_mangle]
139pub unsafe extern "C" fn Java_com_torsh_Tensor_nativeRelu(
140 _env: JNIEnv,
141 _class: jclass,
142 tensor_handle: jlong,
143) -> jlong {
144 let tensor = tensor_handle as *mut TorshTensor;
145
146 let error = torsh_tensor_relu(tensor, tensor);
148 if error != TorshError::Success {
149 return 0; }
151 tensor as jlong
152}
153
154#[no_mangle]
156pub unsafe extern "C" fn Java_com_torsh_Tensor_nativeGetShape(
157 _env: JNIEnv,
158 _class: jclass,
159 tensor_handle: jlong,
160) -> jintArray {
161 let _tensor = tensor_handle as *mut TorshTensor;
162
163 ptr::null_mut()
170}
171
172#[no_mangle]
174pub unsafe extern "C" fn Java_com_torsh_Tensor_nativeGetData(
175 _env: JNIEnv,
176 _class: jclass,
177 tensor_handle: jlong,
178) -> jfloatArray {
179 let _tensor = tensor_handle as *mut TorshTensor;
180
181 ptr::null_mut()
188}
189
190#[no_mangle]
192pub unsafe extern "C" fn Java_com_torsh_Tensor_nativeFreeTensor(
193 _env: JNIEnv,
194 _class: jclass,
195 tensor_handle: jlong,
196) {
197 let tensor = tensor_handle as *mut TorshTensor;
198 torsh_tensor_free(tensor);
199}
200
201#[no_mangle]
203pub unsafe extern "C" fn Java_com_torsh_nn_Linear_nativeCreateLinear(
204 _env: JNIEnv,
205 _class: jclass,
206 in_features: jint,
207 out_features: jint,
208 bias: jboolean,
209) -> jlong {
210 let module = torsh_linear_new(in_features as usize, out_features as usize, bias != 0);
211 module as jlong
212}
213
214#[no_mangle]
216pub unsafe extern "C" fn Java_com_torsh_nn_Linear_nativeForward(
217 _env: JNIEnv,
218 _class: jclass,
219 module_handle: jlong,
220 input_handle: jlong,
221) -> jlong {
222 let module = module_handle as *mut TorshModule;
223 let input = input_handle as *mut TorshTensor;
224
225 let error = torsh_linear_forward(module, input, input);
227 if error != TorshError::Success {
228 return 0; }
230 input as jlong
231}
232
233#[no_mangle]
235pub unsafe extern "C" fn Java_com_torsh_nn_Linear_nativeFreeModule(
236 _env: JNIEnv,
237 _class: jclass,
238 module_handle: jlong,
239) {
240 let module = module_handle as *mut TorshModule;
241 torsh_module_free(module);
242}
243
244#[no_mangle]
246pub unsafe extern "C" fn Java_com_torsh_optim_SGD_nativeCreateSGD(
247 _env: JNIEnv,
248 _class: jclass,
249 learning_rate: jfloat,
250 momentum: jfloat,
251) -> jlong {
252 let optimizer = torsh_sgd_new(learning_rate, momentum);
253 optimizer as jlong
254}
255
256#[no_mangle]
258pub unsafe extern "C" fn Java_com_torsh_optim_Adam_nativeCreateAdam(
259 _env: JNIEnv,
260 _class: jclass,
261 learning_rate: jfloat,
262 beta1: jfloat,
263 beta2: jfloat,
264 epsilon: jfloat,
265) -> jlong {
266 let optimizer = torsh_adam_new(learning_rate, beta1, beta2, epsilon);
267 optimizer as jlong
268}
269
270#[no_mangle]
272pub unsafe extern "C" fn Java_com_torsh_optim_Optimizer_nativeStep(
273 _env: JNIEnv,
274 _class: jclass,
275 optimizer_handle: jlong,
276 _parameters: jlong, _gradients: jlong, _param_count: jint,
279) -> jboolean {
280 let optimizer = optimizer_handle as *mut TorshOptimizer;
281
282 let result = torsh_optimizer_step(optimizer);
286
287 (result == TorshError::Success) as jboolean
288}
289
290#[no_mangle]
292pub unsafe extern "C" fn Java_com_torsh_optim_Optimizer_nativeFreeOptimizer(
293 _env: JNIEnv,
294 _class: jclass,
295 optimizer_handle: jlong,
296) {
297 let optimizer = optimizer_handle as *mut TorshOptimizer;
298 torsh_optimizer_free(optimizer);
299}
300
301#[no_mangle]
303pub unsafe extern "C" fn Java_com_torsh_cuda_CUDA_nativeIsAvailable(
304 _env: JNIEnv,
305 _class: jclass,
306) -> jboolean {
307 (torsh_cuda_is_available() != 0) as jboolean
308}
309
310#[no_mangle]
312pub unsafe extern "C" fn Java_com_torsh_cuda_CUDA_nativeDeviceCount(
313 _env: JNIEnv,
314 _class: jclass,
315) -> jint {
316 torsh_cuda_device_count()
317}
318
319#[no_mangle]
321pub unsafe extern "C" fn Java_com_torsh_TorshNative_nativeGetVersion(
322 _env: JNIEnv,
323 _class: jclass,
324) -> jobject {
325 ptr::null_mut()
331}
332
333#[no_mangle]
335pub unsafe extern "C" fn Java_com_torsh_TorshNative_nativeGetLastError(
336 _env: JNIEnv,
337 _class: jclass,
338) -> jobject {
339 ptr::null_mut()
345}
346
347#[no_mangle]
349pub unsafe extern "C" fn Java_com_torsh_TorshNative_nativeClearLastError(
350 _env: JNIEnv,
351 _class: jclass,
352) {
353 torsh_clear_last_error();
354}
355
356#[cfg(test)]
357mod tests {
358 use super::*;
359
360 #[test]
361 fn test_java_jni_function_names() {
362 assert!(true);
365 }
366
367 #[test]
368 fn test_java_tensor_handle_conversions() {
369 let test_ptr = 0x123456789abcdef0u64 as *mut TorshTensor;
371 let handle = test_ptr as jlong;
372 let converted_back = handle as *mut TorshTensor;
373 assert_eq!(test_ptr, converted_back);
374 }
375
376 #[test]
377 fn test_java_module_handle_conversions() {
378 let test_ptr = 0x123456789abcdef0u64 as *mut TorshModule;
380 let handle = test_ptr as jlong;
381 let converted_back = handle as *mut TorshModule;
382 assert_eq!(test_ptr, converted_back);
383 }
384
385 #[test]
386 fn test_java_optimizer_handle_conversions() {
387 let test_ptr = 0x123456789abcdef0u64 as *mut TorshOptimizer;
389 let handle = test_ptr as jlong;
390 let converted_back = handle as *mut TorshOptimizer;
391 assert_eq!(test_ptr, converted_back);
392 }
393}