apple-accelerate 0.1.0

Safe Rust bindings for Apple's Accelerate framework on macOS using pure C FFI
Documentation
#![allow(missing_docs, non_camel_case_types, non_upper_case_globals)]

use core::ffi::c_void;

pub type vDSP_Length = usize;
pub type vDSP_Stride = isize;
pub type FFTDirection = i32;
pub type FFTRadix = i32;

pub enum OpaqueFFTSetup {}
pub type FFTSetup = *mut OpaqueFFTSetup;

pub enum vDSP_biquad_SetupStruct {}
pub type vDSP_biquad_Setup = *mut vDSP_biquad_SetupStruct;

#[repr(C)]
pub struct DSPSplitComplex {
    pub realp: *mut f32,
    pub imagp: *mut f32,
}

pub type CBLAS_ORDER = i32;
pub type CBLAS_TRANSPOSE = i32;

pub type vImagePixelCount = u64;
pub type vImage_Error = isize;
pub type vImage_Flags = u32;
pub type Pixel_8888 = [u8; 4];

#[repr(C)]
pub struct vImage_Buffer {
    pub data: *mut c_void,
    pub height: vImagePixelCount,
    pub width: vImagePixelCount,
    pub row_bytes: usize,
}

pub type BNNSFilter = *mut c_void;

#[link(name = "Accelerate", kind = "framework")]
unsafe extern "C" {
    pub fn vDSP_create_fftsetup(log2n: vDSP_Length, radix: FFTRadix) -> FFTSetup;
    pub fn vDSP_destroy_fftsetup(setup: FFTSetup);
    pub fn vDSP_fft_zip(
        setup: FFTSetup,
        split_complex: *const DSPSplitComplex,
        stride: vDSP_Stride,
        log2n: vDSP_Length,
        direction: FFTDirection,
    );

    pub fn vDSP_biquad_CreateSetup(
        coefficients: *const f64,
        sections: vDSP_Length,
    ) -> vDSP_biquad_Setup;
    pub fn vDSP_biquad_DestroySetup(setup: vDSP_biquad_Setup);
    pub fn vDSP_biquad(
        setup: vDSP_biquad_Setup,
        delay: *mut f32,
        input: *const f32,
        input_stride: vDSP_Stride,
        output: *mut f32,
        output_stride: vDSP_Stride,
        length: vDSP_Length,
    );

    pub fn vDSP_vadd(
        a: *const f32,
        a_stride: vDSP_Stride,
        b: *const f32,
        b_stride: vDSP_Stride,
        c: *mut f32,
        c_stride: vDSP_Stride,
        length: vDSP_Length,
    );
    pub fn vDSP_vsub(
        b: *const f32,
        b_stride: vDSP_Stride,
        a: *const f32,
        a_stride: vDSP_Stride,
        c: *mut f32,
        c_stride: vDSP_Stride,
        length: vDSP_Length,
    );
    pub fn vDSP_dotpr(
        a: *const f32,
        a_stride: vDSP_Stride,
        b: *const f32,
        b_stride: vDSP_Stride,
        result: *mut f32,
        length: vDSP_Length,
    );
    pub fn vDSP_maxv(input: *const f32, stride: vDSP_Stride, result: *mut f32, length: vDSP_Length);
    pub fn vDSP_minv(input: *const f32, stride: vDSP_Stride, result: *mut f32, length: vDSP_Length);
    pub fn vDSP_meanv(
        input: *const f32,
        stride: vDSP_Stride,
        result: *mut f32,
        length: vDSP_Length,
    );
    pub fn vDSP_sve(input: *const f32, stride: vDSP_Stride, result: *mut f32, length: vDSP_Length);
    pub fn vDSP_hamm_window(output: *mut f32, length: vDSP_Length, flags: i32);
    pub fn vDSP_blkman_window(output: *mut f32, length: vDSP_Length, flags: i32);

    pub fn cblas_sdot(n: i32, x: *const f32, inc_x: i32, y: *const f32, inc_y: i32) -> f32;
    pub fn cblas_sgemv(
        order: CBLAS_ORDER,
        transpose: CBLAS_TRANSPOSE,
        m: i32,
        n: i32,
        alpha: f32,
        a: *const f32,
        lda: i32,
        x: *const f32,
        inc_x: i32,
        beta: f32,
        y: *mut f32,
        inc_y: i32,
    );
    pub fn cblas_sgemm(
        order: CBLAS_ORDER,
        transpose_a: CBLAS_TRANSPOSE,
        transpose_b: CBLAS_TRANSPOSE,
        m: i32,
        n: i32,
        k: i32,
        alpha: f32,
        a: *const f32,
        lda: i32,
        b: *const f32,
        ldb: i32,
        beta: f32,
        c: *mut f32,
        ldc: i32,
    );

    pub fn vImageRotate_ARGB8888(
        src: *const vImage_Buffer,
        dest: *const vImage_Buffer,
        temp_buffer: *mut c_void,
        angle_in_radians: f32,
        background_color: *const u8,
        flags: vImage_Flags,
    ) -> vImage_Error;
    pub fn vImageBoxConvolve_ARGB8888(
        src: *const vImage_Buffer,
        dest: *const vImage_Buffer,
        temp_buffer: *mut c_void,
        src_offset_to_roi_x: vImagePixelCount,
        src_offset_to_roi_y: vImagePixelCount,
        kernel_height: u32,
        kernel_width: u32,
        background_color: *const u8,
        flags: vImage_Flags,
    ) -> vImage_Error;
    pub fn vImageScale_ARGB8888(
        src: *const vImage_Buffer,
        dest: *const vImage_Buffer,
        temp_buffer: *mut c_void,
        flags: vImage_Flags,
    ) -> vImage_Error;
    pub fn vImageContrastStretch_Planar8(
        src: *const vImage_Buffer,
        dest: *const vImage_Buffer,
        flags: vImage_Flags,
    ) -> vImage_Error;

    pub fn BNNSFilterCreateLayerConvolution(
        layer_params: *const c_void,
        filter_params: *const c_void,
    ) -> BNNSFilter;
    pub fn BNNSFilterCreateLayerFullyConnected(
        layer_params: *const c_void,
        filter_params: *const c_void,
    ) -> BNNSFilter;
    pub fn BNNSFilterApply(filter: BNNSFilter, input: *const c_void, output: *mut c_void) -> i32;
    pub fn BNNSFilterDestroy(filter: BNNSFilter);
}