| Crates.io | torsh-ffi |
| lib.rs | torsh-ffi |
| version | 0.1.0-alpha.2 |
| created_at | 2025-09-30 03:35:07.820554+00 |
| updated_at | 2025-12-22 05:27:23.667165+00 |
| description | Foreign Function Interface bindings for ToRSh |
| homepage | https://github.com/cool-japan/torsh/ |
| repository | https://github.com/cool-japan/torsh/ |
| max_upload_size | |
| id | 1860532 |
| size | 1,522,566 |
Foreign Function Interface for ToRSh, providing C and Python bindings.
This crate enables ToRSh to be used from other programming languages through:
#include <torsh.h>
int main() {
// Initialize ToRSh
torsh_init();
// Create tensors
float data[] = {1.0, 2.0, 3.0, 4.0};
int64_t shape[] = {2, 2};
torsh_tensor_t* tensor = torsh_tensor_from_array(data, shape, 2, TORSH_F32);
// Perform operations
torsh_tensor_t* result = torsh_add(tensor, tensor);
// Get data back
float* result_data = torsh_tensor_data_ptr(result);
// Cleanup
torsh_tensor_free(tensor);
torsh_tensor_free(result);
torsh_cleanup();
return 0;
}
// Create a simple model
torsh_module_t* model = torsh_sequential_new();
torsh_sequential_add(model, torsh_linear_new(784, 128, true));
torsh_sequential_add(model, torsh_relu_new());
torsh_sequential_add(model, torsh_linear_new(128, 10, true));
// Forward pass
torsh_tensor_t* output = torsh_module_forward(model, input);
// Create optimizer
torsh_optimizer_t* optimizer = torsh_adam_new(
torsh_module_parameters(model),
0.001, // learning rate
0.9, // beta1
0.999, // beta2
1e-8 // epsilon
);
// Training step
torsh_optimizer_zero_grad(optimizer);
torsh_backward(loss, false);
torsh_optimizer_step(optimizer);
# From source
python setup.py install
# Or via pip (when available)
pip install torsh
import torsh
# Tensor operations
x = torsh.tensor([[1, 2], [3, 4]], dtype=torsh.float32)
y = torsh.tensor([[5, 6], [7, 8]], dtype=torsh.float32)
z = torsh.matmul(x, y)
# Autograd
x = torsh.tensor([2.0], requires_grad=True)
y = x ** 2
y.backward()
print(x.grad) # tensor([4.0])
# Neural networks
import torsh.nn as nn
import torsh.nn.functional as F
class Net(nn.Module):
def __init__(self):
super(Net, self).__init__()
self.fc1 = nn.Linear(784, 128)
self.fc2 = nn.Linear(128, 10)
def forward(self, x):
x = F.relu(self.fc1(x))
return self.fc2(x)
model = Net()
optimizer = torsh.optim.Adam(model.parameters(), lr=0.001)
# Convert between PyTorch and ToRSh
import torch
import torsh
# PyTorch to ToRSh
torch_tensor = torch.randn(10, 20)
torsh_tensor = torsh.from_pytorch(torch_tensor)
# ToRSh to PyTorch
torch_tensor = torsh_tensor.to_pytorch()
# Share memory (zero-copy)
shared = torsh.as_tensor(torch_tensor)
torsh_error_t* error = NULL;
torsh_tensor_t* result = torsh_matmul_with_error(a, b, &error);
if (error != NULL) {
const char* msg = torsh_error_message(error);
fprintf(stderr, "Error: %s\n", msg);
torsh_error_free(error);
return -1;
}
try:
result = torsh.matmul(a, b)
except torsh.ShapeMismatchError as e:
print(f"Shape error: {e}")
except torsh.OutOfMemoryError as e:
print(f"Memory error: {e}")
// Reference counting
torsh_tensor_retain(tensor); // Increment ref count
torsh_tensor_release(tensor); // Decrement ref count
// Manual memory management
void* data = torsh_malloc(1024);
torsh_free(data);
// Memory pools
torsh_memory_pool_t* pool = torsh_memory_pool_new(1 << 20); // 1MB
torsh_tensor_t* tensor = torsh_tensor_from_pool(pool, shape, ndim, dtype);
torsh_memory_pool_free(pool); // Frees all tensors in pool
Memory is managed automatically through Python's garbage collector.
require 'ffi'
module ToRSh
extend FFI::Library
ffi_lib 'torsh'
attach_function :torsh_init, [], :void
attach_function :torsh_tensor_from_array, [:pointer, :pointer, :int, :int], :pointer
# ... more bindings
end
public class ToRSh {
static {
System.loadLibrary("torsh_jni");
}
public static native void init();
public static native long tensorFromArray(float[] data, long[] shape);
// ... more methods
}
The FFI layer adds minimal overhead:
Licensed under either of
at your option.