#ifndef MLX_ARRAY_H
#define MLX_ARRAY_H
#include "mlx/c/string.h"
#include <float.h>
#include <stdbool.h>
#include <stdint.h>
#include <stdlib.h>
#include "half.h"
#ifdef __cplusplus
extern "C" {
#endif
typedef struct mlx_array_ {
void* ctx;
} mlx_array;
static mlx_array mlx_array_empty;
typedef enum mlx_dtype_ {
MLX_BOOL,
MLX_UINT8,
MLX_UINT16,
MLX_UINT32,
MLX_UINT64,
MLX_INT8,
MLX_INT16,
MLX_INT32,
MLX_INT64,
MLX_FLOAT16,
MLX_FLOAT32,
MLX_FLOAT64,
MLX_BFLOAT16,
MLX_COMPLEX64,
} mlx_dtype;
size_t mlx_dtype_size(mlx_dtype dtype);
int mlx_array_tostring(mlx_string* str, const mlx_array arr);
mlx_array mlx_array_new();
int mlx_array_free(mlx_array arr);
mlx_array mlx_array_new_bool(bool val);
mlx_array mlx_array_new_int(int val);
mlx_array mlx_array_new_float32(float val);
mlx_array mlx_array_new_float(float val);
mlx_array mlx_array_new_float64(double val);
mlx_array mlx_array_new_double(double val);
mlx_array mlx_array_new_complex(float real_val, float imag_val);
mlx_array mlx_array_new_data(
const void* data,
const int* shape,
int dim,
mlx_dtype dtype);
int mlx_array_set(mlx_array* arr, const mlx_array src);
int mlx_array_set_bool(mlx_array* arr, bool val);
int mlx_array_set_int(mlx_array* arr, int val);
int mlx_array_set_float32(mlx_array* arr, float val);
int mlx_array_set_float(mlx_array* arr, float val);
int mlx_array_set_float64(mlx_array* arr, double val);
int mlx_array_set_double(mlx_array* arr, double val);
int mlx_array_set_complex(mlx_array* arr, float real_val, float imag_val);
int mlx_array_set_data(
mlx_array* arr,
const void* data,
const int* shape,
int dim,
mlx_dtype dtype);
size_t mlx_array_itemsize(const mlx_array arr);
size_t mlx_array_size(const mlx_array arr);
size_t mlx_array_nbytes(const mlx_array arr);
size_t mlx_array_ndim(const mlx_array arr);
const int* mlx_array_shape(const mlx_array arr);
const size_t* mlx_array_strides(const mlx_array arr);
int mlx_array_dim(const mlx_array arr, int dim);
mlx_dtype mlx_array_dtype(const mlx_array arr);
int mlx_array_eval(mlx_array arr);
int mlx_array_item_bool(bool* res, const mlx_array arr);
int mlx_array_item_uint8(uint8_t* res, const mlx_array arr);
int mlx_array_item_uint16(uint16_t* res, const mlx_array arr);
int mlx_array_item_uint32(uint32_t* res, const mlx_array arr);
int mlx_array_item_uint64(uint64_t* res, const mlx_array arr);
int mlx_array_item_int8(int8_t* res, const mlx_array arr);
int mlx_array_item_int16(int16_t* res, const mlx_array arr);
int mlx_array_item_int32(int32_t* res, const mlx_array arr);
int mlx_array_item_int64(int64_t* res, const mlx_array arr);
int mlx_array_item_float32(float* res, const mlx_array arr);
int mlx_array_item_float64(double* res, const mlx_array arr);
int mlx_array_item_complex64(float _Complex* res, const mlx_array arr);
#ifdef HAS_FLOAT16
int mlx_array_item_float16(float16_t* res, const mlx_array arr);
#endif
#ifdef HAS_BFLOAT16
int mlx_array_item_bfloat16(bfloat16_t* res, const mlx_array arr);
#endif
const bool* mlx_array_data_bool(const mlx_array arr);
const uint8_t* mlx_array_data_uint8(const mlx_array arr);
const uint16_t* mlx_array_data_uint16(const mlx_array arr);
const uint32_t* mlx_array_data_uint32(const mlx_array arr);
const uint64_t* mlx_array_data_uint64(const mlx_array arr);
const int8_t* mlx_array_data_int8(const mlx_array arr);
const int16_t* mlx_array_data_int16(const mlx_array arr);
const int32_t* mlx_array_data_int32(const mlx_array arr);
const int64_t* mlx_array_data_int64(const mlx_array arr);
const float* mlx_array_data_float32(const mlx_array arr);
const double* mlx_array_data_float64(const mlx_array arr);
const float _Complex* mlx_array_data_complex64(const mlx_array arr);
#ifdef HAS_FLOAT16
const float16_t* mlx_array_data_float16(const mlx_array arr);
#endif
#ifdef HAS_BFLOAT16
const bfloat16_t* mlx_array_data_bfloat16(const mlx_array arr);
#endif
int _mlx_array_is_available(bool* res, const mlx_array arr);
int _mlx_array_wait(const mlx_array arr);
int _mlx_array_is_contiguous(bool* res, const mlx_array arr);
int _mlx_array_is_row_contiguous(bool* res, const mlx_array arr);
int _mlx_array_is_col_contiguous(bool* res, const mlx_array arr);
#ifdef __cplusplus
}
#endif
#endif