#ifndef FLODL_SHIM_H
#define FLODL_SHIM_H
#include <stdint.h>
#ifdef __cplusplus
extern "C" {
#endif
typedef void* FlodlTensor;
char* flodl_zeros(int64_t* shape, int ndim, int dtype, int device_type,
int device_index, FlodlTensor* result);
char* flodl_ones(int64_t* shape, int ndim, int dtype, int device_type,
int device_index, FlodlTensor* result);
char* flodl_rand(int64_t* shape, int ndim, int dtype, int device_type,
int device_index, FlodlTensor* result);
char* flodl_randn(int64_t* shape, int ndim, int dtype, int device_type,
int device_index, FlodlTensor* result);
char* flodl_from_blob(void* data, int64_t* shape, int ndim, int dtype,
int device_type, int device_index, FlodlTensor* result);
char* flodl_linspace(double start, double end, int64_t steps, int dtype,
int device_type, int device_index, FlodlTensor* result);
char* flodl_arange(double start, double end, double step, int dtype,
int device_type, int device_index, FlodlTensor* result);
char* flodl_expand(FlodlTensor t, int64_t* new_shape, int ndim,
FlodlTensor* result);
void flodl_free_tensor(FlodlTensor t);
char* flodl_shallow_clone(FlodlTensor t, FlodlTensor* result);
char* flodl_deep_clone(FlodlTensor t, FlodlTensor* result);
int flodl_ndim(FlodlTensor t);
int64_t flodl_shape(FlodlTensor t, int dim);
int flodl_dtype(FlodlTensor t);
int flodl_device_type(FlodlTensor t);
int flodl_device_index(FlodlTensor t);
int64_t flodl_numel(FlodlTensor t);
int64_t flodl_storage_nbytes(FlodlTensor t);
char* flodl_copy_data(FlodlTensor t, void* buffer, int64_t buffer_bytes);
char* flodl_add(FlodlTensor a, FlodlTensor b, FlodlTensor* result);
char* flodl_sub(FlodlTensor a, FlodlTensor b, FlodlTensor* result);
char* flodl_mul(FlodlTensor a, FlodlTensor b, FlodlTensor* result);
char* flodl_div(FlodlTensor a, FlodlTensor b, FlodlTensor* result);
char* flodl_matmul(FlodlTensor a, FlodlTensor b, FlodlTensor* result);
char* flodl_add_scalar(FlodlTensor t, double scalar, FlodlTensor* result);
char* flodl_mul_scalar(FlodlTensor t, double scalar, FlodlTensor* result);
char* flodl_div_scalar(FlodlTensor t, double scalar, FlodlTensor* result);
char* flodl_neg(FlodlTensor t, FlodlTensor* result);
char* flodl_relu(FlodlTensor t, FlodlTensor* result);
char* flodl_sigmoid(FlodlTensor t, FlodlTensor* result);
char* flodl_tanh_op(FlodlTensor t, FlodlTensor* result);
char* flodl_softmax(FlodlTensor t, int dim, FlodlTensor* result);
char* flodl_log_softmax(FlodlTensor t, int dim, FlodlTensor* result);
char* flodl_gelu(FlodlTensor t, FlodlTensor* result);
char* flodl_gelu_tanh(FlodlTensor t, FlodlTensor* result);
char* flodl_silu(FlodlTensor t, FlodlTensor* result);
char* flodl_leaky_relu(FlodlTensor t, double negative_slope, FlodlTensor* result);
char* flodl_elu(FlodlTensor t, double alpha, FlodlTensor* result);
char* flodl_softplus(FlodlTensor t, double beta, double threshold,
FlodlTensor* result);
char* flodl_mish(FlodlTensor t, FlodlTensor* result);
char* flodl_selu(FlodlTensor t, FlodlTensor* result);
char* flodl_hardswish(FlodlTensor t, FlodlTensor* result);
char* flodl_hardsigmoid(FlodlTensor t, FlodlTensor* result);
char* flodl_prelu(FlodlTensor t, FlodlTensor weight, FlodlTensor* result);
char* flodl_native_layer_norm(FlodlTensor input, FlodlTensor weight, FlodlTensor bias,
int64_t normalized_size, double eps,
FlodlTensor* output, FlodlTensor* mean, FlodlTensor* rstd);
char* flodl_group_norm(FlodlTensor input, int64_t num_groups,
FlodlTensor weight, FlodlTensor bias,
double eps, FlodlTensor* result);
char* flodl_exp(FlodlTensor t, FlodlTensor* result);
char* flodl_log(FlodlTensor t, FlodlTensor* result);
char* flodl_sqrt(FlodlTensor t, FlodlTensor* result);
char* flodl_abs(FlodlTensor t, FlodlTensor* result);
char* flodl_pow_scalar(FlodlTensor t, double exponent, FlodlTensor* result);
char* flodl_triu(FlodlTensor t, int64_t diagonal, FlodlTensor* result);
char* flodl_tril(FlodlTensor t, int64_t diagonal, FlodlTensor* result);
char* flodl_clamp(FlodlTensor t, double min_val, double max_val,
FlodlTensor* result);
char* flodl_clamp_min(FlodlTensor t, double min_val, FlodlTensor* result);
char* flodl_clamp_max(FlodlTensor t, double max_val, FlodlTensor* result);
char* flodl_log1p(FlodlTensor t, FlodlTensor* result);
char* flodl_expm1(FlodlTensor t, FlodlTensor* result);
char* flodl_log2(FlodlTensor t, FlodlTensor* result);
char* flodl_log10(FlodlTensor t, FlodlTensor* result);
char* flodl_sum(FlodlTensor t, FlodlTensor* result);
char* flodl_mean(FlodlTensor t, FlodlTensor* result);
char* flodl_sum_dim(FlodlTensor t, int dim, int keepdim, FlodlTensor* result);
char* flodl_mean_dim(FlodlTensor t, int dim, int keepdim, FlodlTensor* result);
char* flodl_prod(FlodlTensor t, FlodlTensor* result);
char* flodl_prod_dim(FlodlTensor t, int dim, int keepdim, FlodlTensor* result);
char* flodl_cumsum(FlodlTensor t, int dim, FlodlTensor* result);
char* flodl_logsumexp(FlodlTensor t, int dim, int keepdim, FlodlTensor* result);
char* flodl_min(FlodlTensor t, FlodlTensor* result);
char* flodl_max(FlodlTensor t, FlodlTensor* result);
char* flodl_norm(FlodlTensor t, FlodlTensor* result);
char* flodl_min_dim(FlodlTensor t, int dim, int keepdim, FlodlTensor* result);
char* flodl_max_dim(FlodlTensor t, int dim, int keepdim, FlodlTensor* result);
char* flodl_argmax(FlodlTensor t, int dim, int keepdim, FlodlTensor* result);
char* flodl_cumprod(FlodlTensor t, int dim, FlodlTensor* result);
char* flodl_norm_p_dim(FlodlTensor t, double p, int dim, int keepdim,
FlodlTensor* result);
char* flodl_sum_dims(FlodlTensor t, int64_t* dims, int ndims, int keepdim,
FlodlTensor* result);
char* flodl_median(FlodlTensor t, FlodlTensor* result);
char* flodl_median_dim(FlodlTensor t, int dim, int keepdim,
FlodlTensor* values, FlodlTensor* indices);
char* flodl_count_nonzero(FlodlTensor t, FlodlTensor* result);
char* flodl_count_nonzero_dim(FlodlTensor t, int dim, FlodlTensor* result);
char* flodl_nonzero(FlodlTensor t, FlodlTensor* result);
char* flodl_unique(FlodlTensor t, int sorted, int return_inverse,
FlodlTensor* output, FlodlTensor* inverse_indices);
char* flodl_unique_consecutive(FlodlTensor t, int return_inverse,
FlodlTensor* output, FlodlTensor* inverse_indices);
char* flodl_searchsorted(FlodlTensor sorted_seq, FlodlTensor values,
FlodlTensor* result);
char* flodl_diagonal(FlodlTensor t, int64_t offset, int dim1, int dim2,
FlodlTensor* result);
char* flodl_movedim(FlodlTensor t, int64_t src, int64_t dst,
FlodlTensor* result);
char* flodl_tile(FlodlTensor t, int64_t* reps, int ndim, FlodlTensor* result);
char* flodl_gt_scalar(FlodlTensor t, double scalar, FlodlTensor* result);
char* flodl_ge_scalar(FlodlTensor t, double scalar, FlodlTensor* result);
char* flodl_le_scalar(FlodlTensor t, double scalar, FlodlTensor* result);
char* flodl_lt_scalar(FlodlTensor t, double scalar, FlodlTensor* result);
char* flodl_eq_scalar(FlodlTensor t, double scalar, FlodlTensor* result);
char* flodl_ne_scalar(FlodlTensor t, double scalar, FlodlTensor* result);
char* flodl_isnan(FlodlTensor t, FlodlTensor* result);
char* flodl_isinf(FlodlTensor t, FlodlTensor* result);
char* flodl_logical_and(FlodlTensor a, FlodlTensor b, FlodlTensor* result);
char* flodl_logical_or(FlodlTensor a, FlodlTensor b, FlodlTensor* result);
char* flodl_logical_not(FlodlTensor t, FlodlTensor* result);
char* flodl_any(FlodlTensor t, FlodlTensor* result);
char* flodl_all(FlodlTensor t, FlodlTensor* result);
char* flodl_gt_tensor(FlodlTensor a, FlodlTensor b, FlodlTensor* result);
char* flodl_lt_tensor(FlodlTensor a, FlodlTensor b, FlodlTensor* result);
char* flodl_ge_tensor(FlodlTensor a, FlodlTensor b, FlodlTensor* result);
char* flodl_le_tensor(FlodlTensor a, FlodlTensor b, FlodlTensor* result);
char* flodl_eq_tensor(FlodlTensor a, FlodlTensor b, FlodlTensor* result);
char* flodl_ne_tensor(FlodlTensor a, FlodlTensor b, FlodlTensor* result);
char* flodl_atan2(FlodlTensor a, FlodlTensor b, FlodlTensor* result);
char* flodl_maximum(FlodlTensor a, FlodlTensor b, FlodlTensor* result);
char* flodl_minimum(FlodlTensor a, FlodlTensor b, FlodlTensor* result);
char* flodl_argmin(FlodlTensor t, int dim, int keepdim, FlodlTensor* result);
char* flodl_var(FlodlTensor t, FlodlTensor* result);
char* flodl_std_op(FlodlTensor t, FlodlTensor* result);
char* flodl_var_dim(FlodlTensor t, int dim, int keepdim, FlodlTensor* result);
char* flodl_std_dim(FlodlTensor t, int dim, int keepdim, FlodlTensor* result);
char* flodl_sin(FlodlTensor t, FlodlTensor* result);
char* flodl_cos(FlodlTensor t, FlodlTensor* result);
char* flodl_tan(FlodlTensor t, FlodlTensor* result);
char* flodl_asin(FlodlTensor t, FlodlTensor* result);
char* flodl_acos(FlodlTensor t, FlodlTensor* result);
char* flodl_atan(FlodlTensor t, FlodlTensor* result);
char* flodl_sign(FlodlTensor t, FlodlTensor* result);
char* flodl_floor(FlodlTensor t, FlodlTensor* result);
char* flodl_ceil(FlodlTensor t, FlodlTensor* result);
char* flodl_round(FlodlTensor t, FlodlTensor* result);
char* flodl_reciprocal(FlodlTensor t, FlodlTensor* result);
char* flodl_erf(FlodlTensor t, FlodlTensor* result);
char* flodl_erfc(FlodlTensor t, FlodlTensor* result);
char* flodl_trunc(FlodlTensor t, FlodlTensor* result);
char* flodl_frac(FlodlTensor t, FlodlTensor* result);
char* flodl_fmod_scalar(FlodlTensor t, double scalar, FlodlTensor* result);
char* flodl_fmod_tensor(FlodlTensor a, FlodlTensor b, FlodlTensor* result);
char* flodl_remainder_scalar(FlodlTensor t, double scalar, FlodlTensor* result);
char* flodl_remainder_tensor(FlodlTensor a, FlodlTensor b, FlodlTensor* result);
char* flodl_lerp(FlodlTensor a, FlodlTensor b, double weight, FlodlTensor* result);
char* flodl_lerp_tensor(FlodlTensor a, FlodlTensor b, FlodlTensor weight,
FlodlTensor* result);
char* flodl_isclose(FlodlTensor a, FlodlTensor b, double rtol, double atol,
FlodlTensor* result);
char* flodl_addmm(FlodlTensor bias, FlodlTensor mat1, FlodlTensor mat2,
double beta, double alpha, FlodlTensor* result);
char* flodl_addcmul(FlodlTensor self, FlodlTensor t1, FlodlTensor t2,
double value, FlodlTensor* result);
char* flodl_addcdiv(FlodlTensor self, FlodlTensor t1, FlodlTensor t2,
double value, FlodlTensor* result);
char* flodl_gather(FlodlTensor t, int dim, FlodlTensor index,
FlodlTensor* result);
char* flodl_scatter_add(FlodlTensor t, int dim, FlodlTensor index,
FlodlTensor src, FlodlTensor* result);
char* flodl_topk(FlodlTensor t, int64_t k, int dim, int largest, int sorted,
FlodlTensor* values, FlodlTensor* indices);
char* flodl_sort(FlodlTensor t, int dim, int descending,
FlodlTensor* values, FlodlTensor* indices);
char* flodl_eye(int64_t n, int dtype, int device_type, int device_index,
FlodlTensor* result);
char* flodl_randperm(int64_t n, int dtype, int device_type, int device_index,
FlodlTensor* result);
char* flodl_multinomial(FlodlTensor probs, int64_t num_samples,
int replacement, FlodlTensor* result);
char* flodl_full(int64_t* shape, int ndim, double value, int dtype,
int device_type, int device_index, FlodlTensor* result);
char* flodl_chunk(FlodlTensor t, int chunks, int dim,
FlodlTensor** results, int* count);
char* flodl_repeat(FlodlTensor t, int64_t* repeats, int ndim,
FlodlTensor* result);
char* flodl_pad(FlodlTensor t, int64_t* padding, int pad_len, double value,
FlodlTensor* result);
char* flodl_pad_mode(FlodlTensor t, int64_t* padding, int pad_len,
int mode, double value, FlodlTensor* result);
char* flodl_interpolate(FlodlTensor input, int64_t* output_size, int ndim,
int mode, int align_corners, FlodlTensor* result);
char* flodl_flip(FlodlTensor t, int64_t* dims, int ndim, FlodlTensor* result);
char* flodl_roll(FlodlTensor t, int64_t shift, int dim, FlodlTensor* result);
char* flodl_split(FlodlTensor t, int64_t split_size, int dim,
FlodlTensor** results, int* count);
char* flodl_unbind(FlodlTensor t, int dim,
FlodlTensor** results, int* count);
char* flodl_contiguous(FlodlTensor t, FlodlTensor* result);
int flodl_is_contiguous(FlodlTensor t);
char* flodl_argsort(FlodlTensor t, int dim, int descending, FlodlTensor* result);
char* flodl_scatter(FlodlTensor t, int dim, FlodlTensor index,
FlodlTensor src, FlodlTensor* result);
char* flodl_reshape(FlodlTensor t, int64_t* shape, int ndim, FlodlTensor* result);
char* flodl_transpose(FlodlTensor t, int dim0, int dim1, FlodlTensor* result);
char* flodl_permute(FlodlTensor t, int64_t* dims, int ndim, FlodlTensor* result);
char* flodl_select(FlodlTensor t, int dim, int64_t index, FlodlTensor* result);
char* flodl_narrow(FlodlTensor t, int dim, int64_t start, int64_t length,
FlodlTensor* result);
char* flodl_squeeze(FlodlTensor t, int dim, FlodlTensor* result);
char* flodl_unsqueeze(FlodlTensor t, int dim, FlodlTensor* result);
char* flodl_flatten(FlodlTensor t, int start_dim, int end_dim, FlodlTensor* result);
char* flodl_select_scatter(FlodlTensor input, FlodlTensor src, int dim,
int64_t index, FlodlTensor* result);
char* flodl_narrow_scatter(FlodlTensor input, FlodlTensor src, int dim,
int64_t start, FlodlTensor* result);
char* flodl_index_select(FlodlTensor t, int dim, FlodlTensor index,
FlodlTensor* result);
char* flodl_index_add(FlodlTensor t, int dim, FlodlTensor index,
FlodlTensor src, FlodlTensor* result);
char* flodl_cat2(FlodlTensor a, FlodlTensor b, int dim, FlodlTensor* result);
char* flodl_cat(FlodlTensor* tensors, int count, int dim, FlodlTensor* result);
char* flodl_stack(FlodlTensor* tensors, int count, int dim, FlodlTensor* result);
char* flodl_masked_fill(FlodlTensor t, FlodlTensor mask, double value,
FlodlTensor* result);
char* flodl_where(FlodlTensor condition, FlodlTensor x, FlodlTensor y,
FlodlTensor* result);
char* flodl_zeros_like(FlodlTensor t, FlodlTensor* result);
char* flodl_ones_like(FlodlTensor t, FlodlTensor* result);
char* flodl_full_like(FlodlTensor t, double value, FlodlTensor* result);
char* flodl_rand_like(FlodlTensor t, FlodlTensor* result);
char* flodl_randn_like(FlodlTensor t, FlodlTensor* result);
char* flodl_randint(int64_t low, int64_t high, int64_t* shape, int ndim,
int dtype, int device_type, int device_index,
FlodlTensor* result);
char* flodl_empty(int64_t* shape, int ndim, int dtype, int device_type,
int device_index, FlodlTensor* result);
char* flodl_one_hot(FlodlTensor t, int64_t num_classes, FlodlTensor* result);
char* flodl_bernoulli(FlodlTensor t, FlodlTensor* result);
char* flodl_conv2d(FlodlTensor input, FlodlTensor weight, FlodlTensor bias,
int64_t* stride, int64_t* padding, int64_t* dilation,
int64_t groups, FlodlTensor* result);
char* flodl_conv1d(FlodlTensor input, FlodlTensor weight, FlodlTensor bias,
int64_t stride, int64_t padding, int64_t dilation,
int64_t groups, FlodlTensor* result);
char* flodl_conv_transpose2d(FlodlTensor input, FlodlTensor weight, FlodlTensor bias,
int64_t* stride, int64_t* padding,
int64_t* output_padding, int64_t* dilation,
int64_t groups, FlodlTensor* result);
char* flodl_conv_transpose1d(FlodlTensor input, FlodlTensor weight, FlodlTensor bias,
int64_t stride, int64_t padding,
int64_t output_padding, int64_t dilation,
int64_t groups, FlodlTensor* result);
char* flodl_max_pool2d(FlodlTensor input, int64_t* kernel_size,
int64_t* stride, int64_t* padding, int64_t* dilation,
int ceil_mode, FlodlTensor* result);
char* flodl_avg_pool2d(FlodlTensor input, int64_t* kernel_size,
int64_t* stride, int64_t* padding,
int ceil_mode, int count_include_pad,
FlodlTensor* result);
char* flodl_adaptive_avg_pool2d(FlodlTensor input, int64_t* output_size,
FlodlTensor* result);
char* flodl_adaptive_max_pool2d(FlodlTensor input, int64_t* output_size,
FlodlTensor* result);
char* flodl_im2col(FlodlTensor input, int64_t* kernel_size, int64_t* dilation,
int64_t* padding, int64_t* stride, FlodlTensor* result);
char* flodl_col2im(FlodlTensor input, int64_t* output_size,
int64_t* kernel_size, int64_t* dilation,
int64_t* padding, int64_t* stride, FlodlTensor* result);
char* flodl_conv3d(FlodlTensor input, FlodlTensor weight, FlodlTensor bias,
int64_t* stride, int64_t* padding, int64_t* dilation,
int64_t groups, FlodlTensor* result);
char* flodl_conv_transpose3d(FlodlTensor input, FlodlTensor weight, FlodlTensor bias,
int64_t* stride, int64_t* padding,
int64_t* output_padding, int64_t* dilation,
int64_t groups, FlodlTensor* result);
char* flodl_max_pool1d(FlodlTensor input, int64_t kernel_size,
int64_t stride, int64_t padding, int64_t dilation,
int ceil_mode, FlodlTensor* result);
char* flodl_avg_pool1d(FlodlTensor input, int64_t kernel_size,
int64_t stride, int64_t padding,
int ceil_mode, int count_include_pad,
FlodlTensor* result);
char* flodl_instance_norm(FlodlTensor input, FlodlTensor weight, FlodlTensor bias,
FlodlTensor running_mean, FlodlTensor running_var,
int use_input_stats, double momentum, double eps,
FlodlTensor* result);
char* flodl_pixel_shuffle(FlodlTensor input, int64_t upscale_factor,
FlodlTensor* result);
char* flodl_pixel_unshuffle(FlodlTensor input, int64_t downscale_factor,
FlodlTensor* result);
char* flodl_bilinear(FlodlTensor input1, FlodlTensor input2,
FlodlTensor weight, FlodlTensor bias,
FlodlTensor* result);
char* flodl_grid_sample(FlodlTensor input, FlodlTensor grid,
int mode, int padding_mode, int align_corners,
FlodlTensor* result);
char* flodl_scaled_dot_product_attention(
FlodlTensor query, FlodlTensor key, FlodlTensor value,
FlodlTensor attn_mask,
double dropout_p, int is_causal, double scale,
FlodlTensor* result);
char* flodl_linear(FlodlTensor input, FlodlTensor weight, FlodlTensor bias,
FlodlTensor* result);
char* flodl_gru_cell(FlodlTensor input, FlodlTensor hx,
FlodlTensor w_ih, FlodlTensor w_hh,
FlodlTensor b_ih, FlodlTensor b_hh,
FlodlTensor* result);
char* flodl_lstm_cell(FlodlTensor input, FlodlTensor hx, FlodlTensor cx,
FlodlTensor w_ih, FlodlTensor w_hh,
FlodlTensor b_ih, FlodlTensor b_hh,
FlodlTensor* h_out, FlodlTensor* c_out);
char* flodl_lstm(FlodlTensor input, FlodlTensor h_0, FlodlTensor c_0,
const FlodlTensor* params, int64_t num_params,
int64_t num_layers, bool batch_first, bool flatten,
FlodlTensor* output, FlodlTensor* h_n, FlodlTensor* c_n);
char* flodl_gru(FlodlTensor input, FlodlTensor h_0,
const FlodlTensor* params, int64_t num_params,
int64_t num_layers, bool batch_first, bool flatten,
FlodlTensor* output, FlodlTensor* h_n);
char* flodl_rnn_params_create(const FlodlTensor* params, int64_t num_params,
int64_t mode, int64_t num_layers, bool batch_first,
bool flatten, void** out);
void flodl_rnn_params_free(void* rp);
char* flodl_lstm_cached(FlodlTensor input, FlodlTensor h_0, FlodlTensor c_0,
void* rp, int64_t num_layers, bool batch_first,
FlodlTensor* output, FlodlTensor* h_n, FlodlTensor* c_n);
char* flodl_gru_cached(FlodlTensor input, FlodlTensor h_0,
void* rp, int64_t num_layers, bool batch_first,
FlodlTensor* output, FlodlTensor* h_n);
char* flodl_to_device(FlodlTensor t, int device_type, int device_index,
FlodlTensor* result);
char* flodl_to_device_async(FlodlTensor t, int device_type, int device_index,
FlodlTensor* result);
int flodl_gpu_is_available(void);
int flodl_gpu_device_count(void);
int flodl_force_gpu_link(void);
void flodl_set_cudnn_benchmark(int enable);
void flodl_manual_seed(uint64_t seed);
void flodl_gpu_manual_seed_all(uint64_t seed);
void flodl_set_current_device(int device_index);
int flodl_get_current_device(void);
void flodl_gpu_synchronize(int device_index);
char* flodl_gpu_mem_info(int device_index, uint64_t* used_bytes, uint64_t* total_bytes);
int flodl_gpu_smi_mem_info(int device_index, uint64_t* used_bytes, uint64_t* total_bytes);
char* flodl_gpu_alloc_bytes(int device_index, uint64_t* allocated_bytes);
char* flodl_gpu_active_bytes(int device_index, uint64_t* active_bytes);
char* flodl_gpu_peak_active_bytes(int device_index, uint64_t* peak_bytes);
char* flodl_gpu_peak_reserved_bytes(int device_index, uint64_t* peak_bytes);
void flodl_gpu_reset_peak_stats(int device_index);
void flodl_gpu_empty_cache(void);
int flodl_gpu_utilization(int device_index);
int flodl_gpu_has_primary_context(int device_index);
char* flodl_gpu_device_name(int device_index, char* buf, int buf_len);
char* flodl_gpu_arch_name(int device_index, char* buf, int buf_len);
char* flodl_gpu_is_integrated(int device_index, int* out);
char* flodl_cuda_compute_capability(int device_index, int* major, int* minor);
char* flodl_to_dtype(FlodlTensor t, int dtype, FlodlTensor* result);
char* flodl_all_finite(FlodlTensor t, int* result);
char* flodl_set_requires_grad(FlodlTensor t, int requires_grad, FlodlTensor* result);
int flodl_requires_grad(FlodlTensor t);
char* flodl_ensure_grad_accumulator(FlodlTensor t, void** handle_out);
void flodl_grad_accumulator_delete(void* handle);
char* flodl_backward(FlodlTensor t);
char* flodl_grad(FlodlTensor t, FlodlTensor* result);
char* flodl_set_grad(FlodlTensor t, FlodlTensor grad);
char* flodl_zero_grad(FlodlTensor t);
char* flodl_detach(FlodlTensor t, FlodlTensor* result);
char* flodl_detach_(FlodlTensor t);
int flodl_is_leaf(FlodlTensor t);
void* flodl_no_grad_guard_new(void);
void flodl_no_grad_guard_delete(void* guard);
int flodl_is_grad_enabled(void);
void* flodl_autocast_guard_new(int device_type, int dtype);
void flodl_autocast_guard_delete(void* guard);
int flodl_is_autocast_enabled(int device_type);
char* flodl_add_(FlodlTensor t, FlodlTensor other);
char* flodl_sub_(FlodlTensor t, FlodlTensor other);
char* flodl_mul_scalar_(FlodlTensor t, double scalar);
char* flodl_add_scalar_(FlodlTensor t, double scalar);
char* flodl_zero_(FlodlTensor t);
char* flodl_mul_(FlodlTensor t, FlodlTensor other);
char* flodl_div_scalar_(FlodlTensor t, double scalar);
char* flodl_div_(FlodlTensor t, FlodlTensor other);
char* flodl_fill_(FlodlTensor t, double value);
char* flodl_meshgrid(FlodlTensor* tensors, int count,
FlodlTensor** results, int* result_count);
char* flodl_normalize(FlodlTensor t, double p, int dim, FlodlTensor* result);
char* flodl_cosine_similarity(FlodlTensor a, FlodlTensor b,
int64_t dim, double eps, FlodlTensor* result);
char* flodl_cdist(FlodlTensor x, FlodlTensor y, double p,
FlodlTensor* result);
char* flodl_adam_step(FlodlTensor param, FlodlTensor grad,
FlodlTensor m, FlodlTensor v,
double lr, double beta1, double beta2, double eps,
double weight_decay, int64_t step);
char* flodl_adam_step_batched(FlodlTensor* params, FlodlTensor* grads,
FlodlTensor* ms, FlodlTensor* vs,
double* lrs, int count,
double beta1, double beta2, double eps,
double weight_decay, int64_t step);
char* flodl_fused_adam_(FlodlTensor* params, FlodlTensor* grads,
FlodlTensor* exp_avgs, FlodlTensor* exp_avg_sqs,
int count, double lr,
double beta1, double beta2, double eps,
double weight_decay, const int64_t* steps,
FlodlTensor grad_scale, FlodlTensor found_inf);
char* flodl_fused_adamw_(FlodlTensor* params, FlodlTensor* grads,
FlodlTensor* exp_avgs, FlodlTensor* exp_avg_sqs,
int count, double lr,
double beta1, double beta2, double eps,
double weight_decay, const int64_t* steps,
FlodlTensor grad_scale, FlodlTensor found_inf);
char* flodl_pin_memory(FlodlTensor t, FlodlTensor* result);
int flodl_is_pinned(FlodlTensor t);
int flodl_malloc_trim(void);
void flodl_zero_grad_set_to_none(FlodlTensor t);
char* flodl_clip_grad_norm(FlodlTensor* params, int count,
double max_norm, double* total_norm_out);
char* flodl_foreach_add_scalar_(FlodlTensor* tensors, int count, double scalar);
char* flodl_foreach_mul_scalar_(FlodlTensor* tensors, int count, double scalar);
char* flodl_foreach_zero_(FlodlTensor* tensors, int count);
char* flodl_foreach_add_list_(FlodlTensor* tensors1, FlodlTensor* tensors2,
int count, double alpha);
char* flodl_foreach_norm(FlodlTensor* tensors, int count, double ord,
FlodlTensor* results);
char* flodl_foreach_lerp_scalar_(FlodlTensor* tensors1, FlodlTensor* tensors2,
int count, double weight);
char* flodl_foreach_sqrt_(FlodlTensor* tensors, int count);
int64_t flodl_autograd_node_count(FlodlTensor t);
char* flodl_mse_loss(FlodlTensor pred, FlodlTensor target,
int64_t reduction, FlodlTensor* result);
char* flodl_cross_entropy_loss(FlodlTensor pred, FlodlTensor target,
int64_t reduction, int64_t ignore_index,
double label_smoothing, FlodlTensor* result);
char* flodl_bce_with_logits_loss(FlodlTensor pred, FlodlTensor target,
int64_t reduction, FlodlTensor* result);
char* flodl_bce_loss(FlodlTensor pred, FlodlTensor target,
int64_t reduction, FlodlTensor* result);
char* flodl_l1_loss(FlodlTensor pred, FlodlTensor target,
int64_t reduction, FlodlTensor* result);
char* flodl_smooth_l1_loss(FlodlTensor pred, FlodlTensor target,
int64_t reduction, double beta,
FlodlTensor* result);
char* flodl_kl_div_loss(FlodlTensor input, FlodlTensor target,
int64_t reduction, int log_target,
FlodlTensor* result);
char* flodl_nll_loss(FlodlTensor input, FlodlTensor target,
int64_t reduction, int64_t ignore_index,
FlodlTensor* result);
char* flodl_ctc_loss(FlodlTensor log_probs, FlodlTensor targets,
FlodlTensor input_lengths, FlodlTensor target_lengths,
int64_t blank, int64_t reduction, FlodlTensor* result);
char* flodl_batch_norm(FlodlTensor input, FlodlTensor weight,
FlodlTensor bias, FlodlTensor running_mean,
FlodlTensor running_var, int training,
double momentum, double eps,
FlodlTensor* result);
char* flodl_dropout(FlodlTensor input, double p, int training,
FlodlTensor* result);
char* flodl_feature_dropout(FlodlTensor input, double p, int training,
FlodlTensor* result);
char* flodl_embedding(FlodlTensor weight, FlodlTensor indices,
int64_t padding_idx,
int scale_grad_by_freq, int sparse,
FlodlTensor* result);
char* flodl_embedding_bag(FlodlTensor weight, FlodlTensor indices,
FlodlTensor offsets, int64_t mode,
FlodlTensor* result);
char* flodl_copy_(FlodlTensor dst, FlodlTensor src, int non_blocking);
char* flodl_to_channels_last(FlodlTensor t, FlodlTensor* result);
int flodl_is_channels_last(FlodlTensor t);
char* flodl_gpu_graph_new(void** graph_out);
char* flodl_gpu_graph_capture_begin(void* graph, uint64_t pool_hi,
uint64_t pool_lo, int mode);
char* flodl_gpu_graph_capture_end(void* graph);
char* flodl_gpu_graph_replay(void* graph);
char* flodl_gpu_graph_reset(void* graph);
void flodl_gpu_graph_delete(void* graph);
void flodl_gpu_graph_pool(void* graph, uint64_t* pool_hi, uint64_t* pool_lo);
void flodl_gpu_graph_pool_handle(uint64_t* pool_hi, uint64_t* pool_lo);
char* flodl_gpu_event_new(int flags, void** event_out);
char* flodl_gpu_event_record(void* event);
char* flodl_gpu_event_record_on_stream(void* event, void* stream);
char* flodl_gpu_event_synchronize(void* event);
char* flodl_gpu_event_elapsed_time(void* start, void* end, float* ms_out);
int flodl_gpu_event_query(void* event);
void flodl_gpu_event_delete(void* event);
char* flodl_gpu_stream_new(int device_index, int high_priority, void** stream_out);
char* flodl_gpu_stream_synchronize(void* stream);
char* flodl_gpu_stream_wait_event(void* stream, void* event);
char* flodl_tensor_record_stream(void* tensor, void* stream);
int flodl_gpu_stream_query(void* stream);
void flodl_gpu_stream_set_current(void* stream);
void* flodl_gpu_stream_get_current(int device_index);
void flodl_gpu_stream_restore_default(int device_index);
void flodl_gpu_stream_delete(void* stream);
char* flodl_nccl_init(int ndev, const int* devlist, void** handle_out);
void flodl_nccl_destroy(void* handle);
char* flodl_nccl_all_reduce(void* handle, FlodlTensor* tensors,
void** streams, int op);
char* flodl_nccl_broadcast(void* handle, FlodlTensor* tensors,
void** streams, int root);
int flodl_nccl_size(void* handle);
#define FLODL_NCCL_UNIQUE_ID_BYTES 128
char* flodl_nccl_runtime_version(int* version_out);
char* flodl_nccl_get_unique_id(void* uid_out);
char* flodl_nccl_init_rank(int rank, int nranks, const void* uid,
void** handle_out);
void flodl_nccl_destroy_rank(void* handle);
char* flodl_nccl_all_reduce_rank(void* handle, FlodlTensor* tensors,
int ntensors, void* stream, int op);
char* flodl_nccl_redop_premulsum_create_rank(void* handle, float scalar,
int* op_out);
char* flodl_nccl_redop_destroy_rank(void* handle, int op);
char* flodl_nccl_broadcast_rank(void* handle, FlodlTensor* tensors,
int ntensors, void* stream, int root);
char* flodl_nccl_abort_rank(void* handle);
char* flodl_nccl_split_rank(void* group_handle, int rank,
void** rank_handle_out);
void flodl_free_string(char* s);
#define FLODL_FLOAT16 5
#define FLODL_BFLOAT16 15
#define FLODL_FLOAT32 6
#define FLODL_FLOAT64 7
#define FLODL_INT32 3
#define FLODL_INT64 4
#define FLODL_CPU 0
#define FLODL_CUDA 1
#ifdef __cplusplus
}
#endif
#endif