rssn 0.2.9

A comprehensive scientific computing library for Rust, aiming for feature parity with NumPy and SymPy.
Documentation
use crate::ffi_apis::common::BincodeBuffer;
use crate::ffi_apis::common::from_bincode_buffer;
use crate::ffi_apis::common::to_bincode_buffer;
use crate::symbolic::core::Expr;
use crate::symbolic::geometric_algebra::Multivector;

/// Creates a new scalar multivector (Bincode)
#[unsafe(no_mangle)]
pub extern "C" fn rssn_bincode_multivector_scalar(
    p: u32,
    q: u32,
    r: u32,
    value_buf: BincodeBuffer,
) -> BincodeBuffer {
    let value: Option<Expr> = from_bincode_buffer(&value_buf);

    if let Some(val) = value {
        let mv = Multivector::scalar((p, q, r), val);

        to_bincode_buffer(&mv)
    } else {
        BincodeBuffer::empty()
    }
}

/// Computes geometric product (Bincode)
#[unsafe(no_mangle)]
pub extern "C" fn rssn_bincode_multivector_geometric_product(
    a_buf: BincodeBuffer,
    b_buf: BincodeBuffer,
) -> BincodeBuffer {
    let a: Option<Multivector> = from_bincode_buffer(&a_buf);

    let b: Option<Multivector> = from_bincode_buffer(&b_buf);

    match (a, b) {
        | (Some(mv_a), Some(mv_b)) => {
            let result = mv_a.geometric_product(&mv_b);

            to_bincode_buffer(&result)
        },
        | _ => BincodeBuffer::empty(),
    }
}

/// Computes outer product (Bincode)
#[unsafe(no_mangle)]
pub extern "C" fn rssn_bincode_multivector_outer_product(
    a_buf: BincodeBuffer,
    b_buf: BincodeBuffer,
) -> BincodeBuffer {
    let a: Option<Multivector> = from_bincode_buffer(&a_buf);

    let b: Option<Multivector> = from_bincode_buffer(&b_buf);

    match (a, b) {
        | (Some(mv_a), Some(mv_b)) => {
            let result = mv_a.outer_product(&mv_b);

            to_bincode_buffer(&result)
        },
        | _ => BincodeBuffer::empty(),
    }
}

/// Computes inner product (Bincode)
#[unsafe(no_mangle)]
pub extern "C" fn rssn_bincode_multivector_inner_product(
    a_buf: BincodeBuffer,
    b_buf: BincodeBuffer,
) -> BincodeBuffer {
    let a: Option<Multivector> = from_bincode_buffer(&a_buf);

    let b: Option<Multivector> = from_bincode_buffer(&b_buf);

    match (a, b) {
        | (Some(mv_a), Some(mv_b)) => {
            let result = mv_a.inner_product(&mv_b);

            to_bincode_buffer(&result)
        },
        | _ => BincodeBuffer::empty(),
    }
}

/// Computes reverse (Bincode)
#[unsafe(no_mangle)]
pub extern "C" fn rssn_bincode_multivector_reverse(mv_buf: BincodeBuffer) -> BincodeBuffer {
    let mv: Option<Multivector> = from_bincode_buffer(&mv_buf);

    if let Some(multivector) = mv {
        let result = multivector.reverse();

        to_bincode_buffer(&result)
    } else {
        BincodeBuffer::empty()
    }
}

/// Computes grade projection (Bincode)
#[unsafe(no_mangle)]
pub extern "C" fn rssn_bincode_multivector_grade_projection(
    mv_buf: BincodeBuffer,
    grade: u32,
) -> BincodeBuffer {
    let mv: Option<Multivector> = from_bincode_buffer(&mv_buf);

    if let Some(multivector) = mv {
        let result = multivector.grade_projection(grade);

        to_bincode_buffer(&result)
    } else {
        BincodeBuffer::empty()
    }
}

/// Computes magnitude (Bincode)
#[unsafe(no_mangle)]
pub extern "C" fn rssn_bincode_multivector_magnitude(mv_buf: BincodeBuffer) -> BincodeBuffer {
    let mv: Option<Multivector> = from_bincode_buffer(&mv_buf);

    if let Some(multivector) = mv {
        let result = multivector.magnitude();

        to_bincode_buffer(&result)
    } else {
        BincodeBuffer::empty()
    }
}