Integration Guides - ruvnet/ruv-FANN GitHub Wiki

Integration Guides

This comprehensive guide covers all integration options for the ruv-FANN neural network framework, including language bindings, platform integrations, and deployment strategies.

Table of Contents

  1. Python Integration via PyO3
  2. JavaScript/TypeScript Integration
  3. C/C++ FFI Integration
  4. WASM Browser Integration
  5. Cloud Platform Integration
  6. Mobile Platform Integration
  7. Performance Considerations
  8. Best Practices

Python Integration via PyO3

Overview

The ruv-FANN project supports Python integration through PyO3 bindings, enabling seamless interoperability between Rust's performance and Python's ecosystem.

Setup

Prerequisites

# Install PyO3 requirements
pip install maturin pyo3-build
rustup toolchain install nightly

Project Configuration

Add to your Cargo.toml:

[lib]
name = "ruv_fann_py"
crate-type = ["cdylib"]

[dependencies]
pyo3 = { version = "0.20", features = ["extension-module"] }
semantic-cartan-matrix = { path = "../Semantic_Cartan_Matrix" }
numpy = "0.20"

Implementation Example

// src/lib.rs
use pyo3::prelude::*;
use pyo3::types::PyList;
use semantic_cartan_matrix::prelude::*;
use numpy::{PyArray1, PyReadonlyArray1};

/// Python wrapper for RootVector
#[pyclass]
struct PyRootVector {
    inner: RootVector,
}

#[pymethods]
impl PyRootVector {
    #[new]
    fn new() -> Self {
        Self {
            inner: RootVector::zero(),
        }
    }
    
    /// Create from Python list or numpy array
    #[staticmethod]
    fn from_array(arr: PyReadonlyArray1<f32>) -> PyResult<Self> {
        let slice = arr.as_slice()?;
        if slice.len() != 32 {
            return Err(PyErr::new::<pyo3::exceptions::PyValueError, _>(
                "Array must have exactly 32 elements"
            ));
        }
        
        let mut vector = RootVector::zero();
        vector.data.copy_from_slice(slice);
        Ok(Self { inner: vector })
    }
    
    /// Convert to numpy array
    fn to_numpy(&self, py: Python) -> PyResult<Py<PyArray1<f32>>> {
        Ok(PyArray1::from_slice(py, &self.inner.data).to_owned())
    }
    
    /// Compute dot product
    fn dot(&self, other: &PyRootVector) -> f32 {
        self.inner.dot(&other.inner)
    }
    
    /// Normalize in-place
    fn normalize(&mut self) {
        self.inner.normalize();
    }
    
    /// Get magnitude
    fn magnitude(&self) -> f32 {
        self.inner.magnitude()
    }
}

/// Python wrapper for CartanAttention
#[pyclass]
struct PyCartanAttention {
    inner: CartanAttention,
}

#[pymethods]
impl PyCartanAttention {
    #[new]
    fn new() -> PyResult<Self> {
        let cartan = CartanMatrix::identity();
        match CartanAttention::new(cartan) {
            Ok(attention) => Ok(Self { inner: attention }),
            Err(e) => Err(PyErr::new::<pyo3::exceptions::PyRuntimeError, _>(
                format!("Failed to create CartanAttention: {:?}", e)
            )),
        }
    }
    
    /// Apply attention to sequence of vectors
    fn apply_attention(&mut self, vectors: Vec<PyRef<PyRootVector>>) -> PyResult<Vec<PyRootVector>> {
        let input: Vec<RootVector> = vectors.iter()
            .map(|v| v.inner.clone())
            .collect();
            
        match self.inner.apply_attention(&input) {
            Ok(output) => Ok(output.into_iter()
                .map(|v| PyRootVector { inner: v })
                .collect()),
            Err(e) => Err(PyErr::new::<pyo3::exceptions::PyRuntimeError, _>(
                format!("Attention failed: {:?}", e)
            )),
        }
    }
}

/// Python module definition
#[pymodule]
fn ruv_fann_py(_py: Python, m: &PyModule) -> PyResult<()> {
    m.add_class::<PyRootVector>()?;
    m.add_class::<PyCartanAttention>()?;
    
    // Add version info
    m.add("__version__", env!("CARGO_PKG_VERSION"))?;
    
    Ok(())
}

Python Usage

import numpy as np
import ruv_fann_py as rf

# Create vectors
vec1 = rf.PyRootVector()
vec2 = rf.PyRootVector.from_array(np.random.randn(32).astype(np.float32))

# Operations
dot_product = vec1.dot(vec2)
vec2.normalize()
magnitude = vec2.magnitude()

# Convert to numpy for further processing
np_array = vec2.to_numpy()

# Attention mechanism
attention = rf.PyCartanAttention()
output_vectors = attention.apply_attention([vec1, vec2])

print(f"Dot product: {dot_product}")
print(f"Magnitude after normalization: {magnitude}")

Building and Installation

# Build wheel
maturin build --release

# Install locally
maturin develop

# Or install from wheel
pip install target/wheels/ruv_fann_py-*.whl

JavaScript/TypeScript Integration

WASM Integration

The ruv-FANN project provides comprehensive WebAssembly bindings for JavaScript/TypeScript integration.

Build Configuration

# Cargo.toml for WASM target
[lib]
crate-type = ["cdylib"]

[dependencies]
wasm-bindgen = "0.2"
js-sys = "0.3"
web-sys = "0.3"
console_error_panic_hook = "0.1"
wee_alloc = "0.4"

[dependencies.semantic-cartan-matrix]
path = "../Semantic_Cartan_Matrix"
features = ["wasm"]

JavaScript Bindings

// src/lib.rs
use wasm_bindgen::prelude::*;
use semantic_cartan_matrix::prelude::*;

// Set up panic hook and allocator for WASM
#[cfg(feature = "wee_alloc")]
#[global_allocator]
static ALLOC: wee_alloc::WeeAlloc = wee_alloc::WeeAlloc::INIT;

#[wasm_bindgen(start)]
pub fn main() {
    console_error_panic_hook::set_once();
}

/// JavaScript-compatible RootVector
#[wasm_bindgen]
pub struct JsRootVector {
    inner: RootVector,
}

#[wasm_bindgen]
impl JsRootVector {
    #[wasm_bindgen(constructor)]
    pub fn new() -> JsRootVector {
        JsRootVector {
            inner: RootVector::zero(),
        }
    }
    
    /// Create from JavaScript array
    #[wasm_bindgen]
    pub fn from_array(data: &[f32]) -> Result<JsRootVector, JsValue> {
        if data.len() != 32 {
            return Err(JsValue::from_str("Array must have exactly 32 elements"));
        }
        
        let mut vector = RootVector::zero();
        vector.data.copy_from_slice(data);
        Ok(JsRootVector { inner: vector })
    }
    
    /// Convert to JavaScript array
    #[wasm_bindgen]
    pub fn to_array(&self) -> Vec<f32> {
        self.inner.data.to_vec()
    }
    
    /// Compute dot product
    #[wasm_bindgen]
    pub fn dot(&self, other: &JsRootVector) -> f32 {
        self.inner.dot(&other.inner)
    }
    
    /// Normalize in-place
    #[wasm_bindgen]
    pub fn normalize(&mut self) {
        self.inner.normalize();
    }
    
    /// Get magnitude
    #[wasm_bindgen]
    pub fn magnitude(&self) -> f32 {
        self.inner.magnitude()
    }
}

/// JavaScript-compatible MicroNet
#[wasm_bindgen]
pub struct JsMicroNet {
    // Implementation would depend on specific MicroNet type
}

#[wasm_bindgen]
impl JsMicroNet {
    #[wasm_bindgen(constructor)]
    pub fn new() -> Result<JsMicroNet, JsValue> {
        // Initialize micro network
        Ok(JsMicroNet {})
    }
    
    /// Process input through the network
    #[wasm_bindgen]
    pub fn process(&self, input: &[f32]) -> Result<Vec<f32>, JsValue> {
        // Implementation for network processing
        Ok(input.to_vec()) // Placeholder
    }
}

TypeScript Definitions

// ruv-fann.d.ts
export class JsRootVector {
    constructor();
    static from_array(data: Float32Array): JsRootVector;
    to_array(): Float32Array;
    dot(other: JsRootVector): number;
    normalize(): void;
    magnitude(): number;
}

export class JsMicroNet {
    constructor();
    process(input: Float32Array): Float32Array;
}

export interface CartanMatrixConfig {
    dimension: number;
    matrix_type: 'identity' | 'random' | 'custom';
    custom_values?: number[][];
}

export interface AttentionConfig {
    heads: number;
    regularization: number;
    dropout_rate?: number;
}

// Utility functions
export function create_identity_matrix(size: number): number[][];
export function simd_dot_product(a: Float32Array, b: Float32Array): number;

JavaScript Usage

import init, { JsRootVector, JsMicroNet } from './pkg/ruv_fann.js';

async function main() {
    // Initialize WASM module
    await init();
    
    // Create vectors
    const vec1 = new JsRootVector();
    const data = new Float32Array(32);
    for (let i = 0; i < 32; i++) {
        data[i] = Math.random();
    }
    const vec2 = JsRootVector.from_array(data);
    
    // Perform operations
    const dotProduct = vec1.dot(vec2);
    vec2.normalize();
    const magnitude = vec2.magnitude();
    
    // Convert back to JavaScript array
    const result = vec2.to_array();
    
    console.log('Dot product:', dotProduct);
    console.log('Magnitude:', magnitude);
    console.log('Result vector:', result);
    
    // Neural network processing
    const network = new JsMicroNet();
    const input = new Float32Array([1, 2, 3, 4, 5]);
    const output = network.process(input);
    console.log('Network output:', output);
}

main().catch(console.error);

Building WASM

# Install wasm-pack
curl https://rustwasm.github.io/wasm-pack/installer/init.sh -sSf | sh

# Build for web
wasm-pack build --target web --release

# Build for Node.js
wasm-pack build --target nodejs --release

# Build with size optimization
wasm-pack build --target web --release -- --features wasm-opt

C/C++ FFI Integration

Overview

The ruv-FANN framework provides C-compatible FFI bindings for integration with existing C/C++ codebases.

C Header Generation

// src/ffi.rs
use std::ffi::{c_char, c_void, CStr, CString};
use std::ptr;
use semantic_cartan_matrix::prelude::*;

/// Opaque pointer to RootVector
pub struct CRootVector {
    inner: Box<RootVector>,
}

/// Create a new RootVector
#[no_mangle]
pub extern "C" fn ruv_fann_root_vector_new() -> *mut CRootVector {
    let vector = Box::new(RootVector::zero());
    Box::into_raw(Box::new(CRootVector { inner: vector }))
}

/// Create RootVector from array
#[no_mangle]
pub extern "C" fn ruv_fann_root_vector_from_array(
    data: *const f32,
    len: usize,
) -> *mut CRootVector {
    if data.is_null() || len != 32 {
        return ptr::null_mut();
    }
    
    unsafe {
        let slice = std::slice::from_raw_parts(data, len);
        let mut vector = RootVector::zero();
        vector.data.copy_from_slice(slice);
        
        Box::into_raw(Box::new(CRootVector {
            inner: Box::new(vector),
        }))
    }
}

/// Free RootVector
#[no_mangle]
pub extern "C" fn ruv_fann_root_vector_free(vector: *mut CRootVector) {
    if !vector.is_null() {
        unsafe {
            drop(Box::from_raw(vector));
        }
    }
}

/// Compute dot product
#[no_mangle]
pub extern "C" fn ruv_fann_root_vector_dot(
    a: *const CRootVector,
    b: *const CRootVector,
) -> f32 {
    if a.is_null() || b.is_null() {
        return 0.0;
    }
    
    unsafe {
        (*a).inner.dot(&(*b).inner)
    }
}

/// Normalize vector in-place
#[no_mangle]
pub extern "C" fn ruv_fann_root_vector_normalize(vector: *mut CRootVector) {
    if !vector.is_null() {
        unsafe {
            (*vector).inner.normalize();
        }
    }
}

/// Get vector magnitude
#[no_mangle]
pub extern "C" fn ruv_fann_root_vector_magnitude(vector: *const CRootVector) -> f32 {
    if vector.is_null() {
        return 0.0;
    }
    
    unsafe {
        (*vector).inner.magnitude()
    }
}

/// Copy vector data to array
#[no_mangle]
pub extern "C" fn ruv_fann_root_vector_to_array(
    vector: *const CRootVector,
    data: *mut f32,
    len: usize,
) -> bool {
    if vector.is_null() || data.is_null() || len < 32 {
        return false;
    }
    
    unsafe {
        let slice = std::slice::from_raw_parts_mut(data, len);
        slice[..32].copy_from_slice(&(*vector).inner.data);
        true
    }
}

/// Opaque pointer to CartanAttention
pub struct CCartanAttention {
    inner: Box<CartanAttention>,
}

/// Create new CartanAttention
#[no_mangle]
pub extern "C" fn ruv_fann_cartan_attention_new() -> *mut CCartanAttention {
    let cartan = CartanMatrix::identity();
    match CartanAttention::new(cartan) {
        Ok(attention) => Box::into_raw(Box::new(CCartanAttention {
            inner: Box::new(attention),
        })),
        Err(_) => ptr::null_mut(),
    }
}

/// Free CartanAttention
#[no_mangle]
pub extern "C" fn ruv_fann_cartan_attention_free(attention: *mut CCartanAttention) {
    if !attention.is_null() {
        unsafe {
            drop(Box::from_raw(attention));
        }
    }
}

/// Apply attention to vector sequence
#[no_mangle]
pub extern "C" fn ruv_fann_cartan_attention_apply(
    attention: *mut CCartanAttention,
    input_vectors: *const *const CRootVector,
    input_count: usize,
    output_vectors: *mut *mut CRootVector,
    output_count: *mut usize,
) -> bool {
    if attention.is_null() || input_vectors.is_null() || output_vectors.is_null() {
        return false;
    }
    
    unsafe {
        // Convert input vectors
        let input_slice = std::slice::from_raw_parts(input_vectors, input_count);
        let mut input: Vec<RootVector> = Vec::new();
        
        for &vector_ptr in input_slice {
            if vector_ptr.is_null() {
                return false;
            }
            input.push((*vector_ptr).inner.as_ref().clone());
        }
        
        // Apply attention
        match (*attention).inner.apply_attention(&input) {
            Ok(output) => {
                // Convert output vectors
                let mut output_ptrs: Vec<*mut CRootVector> = Vec::new();
                for vector in output {
                    let c_vector = Box::into_raw(Box::new(CRootVector {
                        inner: Box::new(vector),
                    }));
                    output_ptrs.push(c_vector);
                }
                
                // Copy pointers to output array
                let out_slice = std::slice::from_raw_parts_mut(output_vectors, output_ptrs.len());
                out_slice.copy_from_slice(&output_ptrs);
                *output_count = output_ptrs.len();
                
                true
            }
            Err(_) => false,
        }
    }
}

C Header File

// ruv_fann.h
#ifndef RUV_FANN_H
#define RUV_FANN_H

#include <stddef.h>
#include <stdbool.h>

#ifdef __cplusplus
extern "C" {
#endif

// Opaque types
typedef struct CRootVector CRootVector;
typedef struct CCartanAttention CCartanAttention;

// RootVector functions
CRootVector* ruv_fann_root_vector_new(void);
CRootVector* ruv_fann_root_vector_from_array(const float* data, size_t len);
void ruv_fann_root_vector_free(CRootVector* vector);
float ruv_fann_root_vector_dot(const CRootVector* a, const CRootVector* b);
void ruv_fann_root_vector_normalize(CRootVector* vector);
float ruv_fann_root_vector_magnitude(const CRootVector* vector);
bool ruv_fann_root_vector_to_array(const CRootVector* vector, float* data, size_t len);

// CartanAttention functions
CCartanAttention* ruv_fann_cartan_attention_new(void);
void ruv_fann_cartan_attention_free(CCartanAttention* attention);
bool ruv_fann_cartan_attention_apply(
    CCartanAttention* attention,
    const CRootVector* const* input_vectors,
    size_t input_count,
    CRootVector** output_vectors,
    size_t* output_count
);

#ifdef __cplusplus
}
#endif

#endif // RUV_FANN_H

C++ Usage Example

// example.cpp
#include "ruv_fann.h"
#include <iostream>
#include <vector>
#include <memory>

class RootVectorWrapper {
private:
    CRootVector* vector_;
    
public:
    RootVectorWrapper() : vector_(ruv_fann_root_vector_new()) {}
    
    RootVectorWrapper(const std::vector<float>& data) {
        if (data.size() == 32) {
            vector_ = ruv_fann_root_vector_from_array(data.data(), data.size());
        } else {
            vector_ = ruv_fann_root_vector_new();
        }
    }
    
    ~RootVectorWrapper() {
        ruv_fann_root_vector_free(vector_);
    }
    
    // Delete copy constructor and assignment
    RootVectorWrapper(const RootVectorWrapper&) = delete;
    RootVectorWrapper& operator=(const RootVectorWrapper&) = delete;
    
    // Move constructor
    RootVectorWrapper(RootVectorWrapper&& other) noexcept
        : vector_(other.vector_) {
        other.vector_ = nullptr;
    }
    
    float dot(const RootVectorWrapper& other) const {
        return ruv_fann_root_vector_dot(vector_, other.vector_);
    }
    
    void normalize() {
        ruv_fann_root_vector_normalize(vector_);
    }
    
    float magnitude() const {
        return ruv_fann_root_vector_magnitude(vector_);
    }
    
    std::vector<float> to_vector() const {
        std::vector<float> result(32);
        ruv_fann_root_vector_to_array(vector_, result.data(), result.size());
        return result;
    }
    
    CRootVector* raw() const { return vector_; }
};

int main() {
    // Create vectors
    std::vector<float> data(32);
    for (size_t i = 0; i < 32; ++i) {
        data[i] = static_cast<float>(i) / 32.0f;
    }
    
    RootVectorWrapper vec1;
    RootVectorWrapper vec2(data);
    
    // Perform operations
    float dot_product = vec1.dot(vec2);
    vec2.normalize();
    float magnitude = vec2.magnitude();
    
    std::cout << "Dot product: " << dot_product << std::endl;
    std::cout << "Magnitude after normalization: " << magnitude << std::endl;
    
    // Convert back to C++ vector
    std::vector<float> result = vec2.to_vector();
    std::cout << "First few elements: ";
    for (size_t i = 0; i < 5; ++i) {
        std::cout << result[i] << " ";
    }
    std::cout << std::endl;
    
    return 0;
}

Building C/C++ Integration

# Build static library
cargo build --release --lib
cp target/release/libruv_fann.a /usr/local/lib/

# Build shared library
cargo build --release --lib --features cdylib
cp target/release/libruv_fann.so /usr/local/lib/

# Copy header
cp ruv_fann.h /usr/local/include/

# Compile C++ example
g++ -std=c++17 example.cpp -lruv_fann -o example

WASM Browser Integration

Advanced Browser Integration

The ruv-FANN WASM integration provides high-performance neural network capabilities directly in the browser.

WebWorker Integration

// worker.js - Neural network processing in web worker
import init, { JsMicroNet, JsRootVector } from './pkg/ruv_fann.js';

let network = null;
let initialized = false;

async function initializeNetwork() {
    if (!initialized) {
        await init();
        network = new JsMicroNet();
        initialized = true;
    }
}

self.onmessage = async function(e) {
    const { type, data, id } = e.data;
    
    try {
        await initializeNetwork();
        
        switch (type) {
            case 'process':
                const input = new Float32Array(data.input);
                const output = network.process(input);
                self.postMessage({
                    type: 'result',
                    id,
                    data: { output: Array.from(output) }
                });
                break;
                
            case 'batch_process':
                const results = [];
                for (const inputData of data.inputs) {
                    const input = new Float32Array(inputData);
                    const output = network.process(input);
                    results.push(Array.from(output));
                }
                self.postMessage({
                    type: 'batch_result',
                    id,
                    data: { results }
                });
                break;
                
            default:
                throw new Error(`Unknown message type: ${type}`);
        }
    } catch (error) {
        self.postMessage({
            type: 'error',
            id,
            error: error.message
        });
    }
};

Main Thread Integration

// main.js - Main thread neural network interface
class NeuralNetworkService {
    constructor() {
        this.worker = new Worker('./worker.js', { type: 'module' });
        this.requestId = 0;
        this.pendingRequests = new Map();
        
        this.worker.onmessage = (e) => {
            const { type, id, data, error } = e.data;
            const request = this.pendingRequests.get(id);
            
            if (request) {
                this.pendingRequests.delete(id);
                
                if (error) {
                    request.reject(new Error(error));
                } else {
                    request.resolve(data);
                }
            }
        };
    }
    
    async process(input) {
        return new Promise((resolve, reject) => {
            const id = ++this.requestId;
            this.pendingRequests.set(id, { resolve, reject });
            
            this.worker.postMessage({
                type: 'process',
                id,
                data: { input }
            });
        });
    }
    
    async batchProcess(inputs) {
        return new Promise((resolve, reject) => {
            const id = ++this.requestId;
            this.pendingRequests.set(id, { resolve, reject });
            
            this.worker.postMessage({
                type: 'batch_process',
                id,
                data: { inputs }
            });
        });
    }
    
    terminate() {
        this.worker.terminate();
    }
}

// Usage example
async function runNeuralNetwork() {
    const service = new NeuralNetworkService();
    
    try {
        // Single inference
        const input = new Array(32).fill(0).map(() => Math.random());
        const result = await service.process(input);
        console.log('Single result:', result.output);
        
        // Batch inference
        const batchInputs = Array.from({ length: 10 }, () => 
            new Array(32).fill(0).map(() => Math.random())
        );
        const batchResults = await service.batchProcess(batchInputs);
        console.log('Batch results:', batchResults.results);
        
    } catch (error) {
        console.error('Neural network error:', error);
    } finally {
        service.terminate();
    }
}

runNeuralNetwork();

Real-time Visualization

<!DOCTYPE html>
<html>
<head>
    <title>ruv-FANN Real-time Visualization</title>
    <script src="https://d3js.org/d3.v7.min.js"></script>
    <style>
        .vector-bar { fill: steelblue; }
        .vector-bar:hover { fill: orange; }
        .attention-heatmap { stroke: white; stroke-width: 1; }
    </style>
</head>
<body>
    <div id="controls">
        <button id="start">Start Processing</button>
        <button id="stop">Stop Processing</button>
        <input type="range" id="speed" min="10" max="1000" value="100">
        <label for="speed">Update Speed (ms)</label>
    </div>
    
    <div id="visualization">
        <svg id="vector-display" width="800" height="200"></svg>
        <svg id="attention-heatmap" width="800" height="400"></svg>
    </div>
    
    <script type="module">
        import init, { JsRootVector, JsMicroNet } from './pkg/ruv_fann.js';
        
        class RealTimeVisualizer {
            constructor() {
                this.network = null;
                this.isRunning = false;
                this.updateInterval = null;
                
                this.vectorSvg = d3.select('#vector-display');
                this.heatmapSvg = d3.select('#attention-heatmap');
                
                this.setupControls();
                this.setupVisualization();
            }
            
            async initialize() {
                await init();
                this.network = new JsMicroNet();
            }
            
            setupControls() {
                document.getElementById('start').onclick = () => this.start();
                document.getElementById('stop').onclick = () => this.stop();
                
                document.getElementById('speed').oninput = (e) => {
                    if (this.isRunning) {
                        this.stop();
                        this.start();
                    }
                };
            }
            
            setupVisualization() {
                // Setup vector bar chart
                this.vectorSvg.append('g')
                    .attr('class', 'vector-bars')
                    .attr('transform', 'translate(50, 20)');
                    
                // Setup attention heatmap
                this.heatmapSvg.append('g')
                    .attr('class', 'heatmap-cells')
                    .attr('transform', 'translate(50, 50)');
            }
            
            start() {
                if (this.isRunning) return;
                
                this.isRunning = true;
                const speed = document.getElementById('speed').value;
                
                this.updateInterval = setInterval(() => {
                    this.updateVisualization();
                }, speed);
            }
            
            stop() {
                this.isRunning = false;
                if (this.updateInterval) {
                    clearInterval(this.updateInterval);
                    this.updateInterval = null;
                }
            }
            
            updateVisualization() {
                // Generate random input
                const input = new Float32Array(32);
                for (let i = 0; i < 32; i++) {
                    input[i] = Math.random() * 2 - 1;
                }
                
                // Process through network
                const output = this.network.process(input);
                
                // Update vector visualization
                this.updateVectorBars(Array.from(output));
                
                // Update attention heatmap (simulated)
                this.updateAttentionHeatmap();
            }
            
            updateVectorBars(data) {
                const width = 700;
                const height = 150;
                const barWidth = width / data.length;
                
                const scale = d3.scaleLinear()
                    .domain(d3.extent(data))
                    .range([0, height]);
                
                const bars = this.vectorSvg.select('.vector-bars')
                    .selectAll('.vector-bar')
                    .data(data);
                
                bars.enter()
                    .append('rect')
                    .attr('class', 'vector-bar')
                    .attr('x', (d, i) => i * barWidth)
                    .attr('width', barWidth - 1)
                    .merge(bars)
                    .transition()
                    .duration(50)
                    .attr('y', d => height - scale(Math.abs(d)))
                    .attr('height', d => scale(Math.abs(d)))
                    .attr('fill', d => d >= 0 ? 'steelblue' : 'crimson');
            }
            
            updateAttentionHeatmap() {
                // Simulate attention matrix
                const size = 16;
                const cellSize = 20;
                const data = [];
                
                for (let i = 0; i < size; i++) {
                    for (let j = 0; j < size; j++) {
                        data.push({
                            row: i,
                            col: j,
                            value: Math.random()
                        });
                    }
                }
                
                const colorScale = d3.scaleSequential(d3.interpolateViridis)
                    .domain([0, 1]);
                
                const cells = this.heatmapSvg.select('.heatmap-cells')
                    .selectAll('.attention-heatmap')
                    .data(data);
                
                cells.enter()
                    .append('rect')
                    .attr('class', 'attention-heatmap')
                    .attr('x', d => d.col * cellSize)
                    .attr('y', d => d.row * cellSize)
                    .attr('width', cellSize)
                    .attr('height', cellSize)
                    .merge(cells)
                    .transition()
                    .duration(100)
                    .attr('fill', d => colorScale(d.value));
            }
        }
        
        // Initialize and start
        const visualizer = new RealTimeVisualizer();
        await visualizer.initialize();
    </script>
</body>
</html>

Cloud Platform Integration

AWS Integration

Lambda Function Integration

// Cargo.toml for AWS Lambda
[dependencies]
lambda_runtime = "0.8"
lambda_web = "0.2"
serde = { version = "1.0", features = ["derive"] }
serde_json = "1.0"
tokio = { version = "1", features = ["macros"] }
semantic-cartan-matrix = { path = "../Semantic_Cartan_Matrix" }
// src/main.rs - AWS Lambda function
use lambda_runtime::{run, service_fn, Error, LambdaEvent};
use serde::{Deserialize, Serialize};
use semantic_cartan_matrix::prelude::*;

#[derive(Deserialize)]
struct Request {
    vectors: Vec<Vec<f32>>,
    operation: String,
    config: Option<serde_json::Value>,
}

#[derive(Serialize)]
struct Response {
    success: bool,
    results: Vec<Vec<f32>>,
    metrics: ProcessingMetrics,
    message: Option<String>,
}

#[derive(Serialize)]
struct ProcessingMetrics {
    processing_time_ms: u64,
    input_vectors: usize,
    output_vectors: usize,
    memory_used_bytes: usize,
}

async fn function_handler(event: LambdaEvent<Request>) -> Result<Response, Error> {
    let start = std::time::Instant::now();
    let (event, _context) = event.into_parts();
    
    // Validate input
    if event.vectors.is_empty() {
        return Ok(Response {
            success: false,
            results: vec![],
            metrics: ProcessingMetrics {
                processing_time_ms: start.elapsed().as_millis() as u64,
                input_vectors: 0,
                output_vectors: 0,
                memory_used_bytes: 0,
            },
            message: Some("No input vectors provided".to_string()),
        });
    }
    
    // Process based on operation type
    let results = match event.operation.as_str() {
        "normalize" => process_normalize(event.vectors)?,
        "attention" => process_attention(event.vectors)?,
        "dot_products" => process_dot_products(event.vectors)?,
        _ => return Ok(Response {
            success: false,
            results: vec![],
            metrics: ProcessingMetrics {
                processing_time_ms: start.elapsed().as_millis() as u64,
                input_vectors: event.vectors.len(),
                output_vectors: 0,
                memory_used_bytes: 0,
            },
            message: Some(format!("Unknown operation: {}", event.operation)),
        }),
    };
    
    let processing_time = start.elapsed().as_millis() as u64;
    
    Ok(Response {
        success: true,
        results,
        metrics: ProcessingMetrics {
            processing_time_ms: processing_time,
            input_vectors: event.vectors.len(),
            output_vectors: event.vectors.len(),
            memory_used_bytes: std::mem::size_of_val(&event.vectors),
        },
        message: None,
    })
}

fn process_normalize(vectors: Vec<Vec<f32>>) -> Result<Vec<Vec<f32>>, Error> {
    let mut results = Vec::new();
    
    for vec_data in vectors {
        if vec_data.len() != 32 {
            return Err("All vectors must have exactly 32 dimensions".into());
        }
        
        let mut root_vector = RootVector::zero();
        root_vector.data.copy_from_slice(&vec_data);
        root_vector.normalize();
        
        results.push(root_vector.data.to_vec());
    }
    
    Ok(results)
}

fn process_attention(vectors: Vec<Vec<f32>>) -> Result<Vec<Vec<f32>>, Error> {
    let mut input_vectors = Vec::new();
    
    for vec_data in vectors {
        if vec_data.len() != 32 {
            return Err("All vectors must have exactly 32 dimensions".into());
        }
        
        let mut root_vector = RootVector::zero();
        root_vector.data.copy_from_slice(&vec_data);
        input_vectors.push(root_vector);
    }
    
    let cartan = CartanMatrix::identity();
    let mut attention = CartanAttention::new(cartan)
        .map_err(|e| format!("Failed to create attention: {:?}", e))?;
    
    let output_vectors = attention.apply_attention(&input_vectors)
        .map_err(|e| format!("Attention processing failed: {:?}", e))?;
    
    let results: Vec<Vec<f32>> = output_vectors
        .into_iter()
        .map(|v| v.data.to_vec())
        .collect();
    
    Ok(results)
}

fn process_dot_products(vectors: Vec<Vec<f32>>) -> Result<Vec<Vec<f32>>, Error> {
    if vectors.len() < 2 {
        return Err("Need at least 2 vectors for dot products".into());
    }
    
    let mut root_vectors = Vec::new();
    for vec_data in vectors {
        if vec_data.len() != 32 {
            return Err("All vectors must have exactly 32 dimensions".into());
        }
        
        let mut root_vector = RootVector::zero();
        root_vector.data.copy_from_slice(&vec_data);
        root_vectors.push(root_vector);
    }
    
    // Compute pairwise dot products
    let mut results = Vec::new();
    for i in 0..root_vectors.len() {
        let mut row = Vec::new();
        for j in 0..root_vectors.len() {
            row.push(root_vectors[i].dot(&root_vectors[j]));
        }
        results.push(row);
    }
    
    Ok(results)
}

#[tokio::main]
async fn main() -> Result<(), Error> {
    run(service_fn(function_handler)).await
}

Deployment Configuration

# template.yaml - AWS SAM template
AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31

Globals:
  Function:
    Timeout: 30
    MemorySize: 512

Resources:
  RuvFannFunction:
    Type: AWS::Serverless::Function
    Properties:
      CodeUri: target/lambda/ruv-fann/
      Handler: bootstrap
      Runtime: provided.al2
      Events:
        Api:
          Type: Api
          Properties:
            Path: /process
            Method: post
        BatchApi:
          Type: Api
          Properties:
            Path: /batch
            Method: post
      Environment:
        Variables:
          RUST_LOG: info

Outputs:
  RuvFannApi:
    Description: "API Gateway endpoint URL"
    Value: !Sub "https://${ServerlessRestApi}.execute-api.${AWS::Region}.amazonaws.com/Prod"

Google Cloud Platform Integration

Cloud Functions

// src/main.rs - Google Cloud Function
use functions_framework::http;
use google_cloud_functions_runtime::{run, Error};
use serde::{Deserialize, Serialize};
use semantic_cartan_matrix::prelude::*;

#[derive(Deserialize)]
struct CloudRequest {
    vectors: Vec<Vec<f32>>,
    operation: String,
    batch_size: Option<usize>,
}

#[derive(Serialize)]
struct CloudResponse {
    success: bool,
    results: serde_json::Value,
    processing_time_ms: u64,
    version: &'static str,
}

#[http]
async fn ruv_fann_handler(req: functions_framework::Request) -> Result<impl functions_framework::Response, Error> {
    let start = std::time::Instant::now();
    
    // Parse request
    let body: CloudRequest = match req.into_json().await {
        Ok(body) => body,
        Err(e) => {
            return Ok(functions_framework::Response::builder()
                .status(400)
                .header("content-type", "application/json")
                .body(serde_json::json!({
                    "success": false,
                    "error": format!("Invalid JSON: {}", e),
                    "processing_time_ms": start.elapsed().as_millis() as u64,
                    "version": env!("CARGO_PKG_VERSION")
                }).to_string())?);
        }
    };
    
    // Process request
    let results = match process_cloud_request(body).await {
        Ok(results) => results,
        Err(e) => {
            return Ok(functions_framework::Response::builder()
                .status(500)
                .header("content-type", "application/json")
                .body(serde_json::json!({
                    "success": false,
                    "error": e,
                    "processing_time_ms": start.elapsed().as_millis() as u64,
                    "version": env!("CARGO_PKG_VERSION")
                }).to_string())?);
        }
    };
    
    let response = CloudResponse {
        success: true,
        results,
        processing_time_ms: start.elapsed().as_millis() as u64,
        version: env!("CARGO_PKG_VERSION"),
    };
    
    Ok(functions_framework::Response::builder()
        .status(200)
        .header("content-type", "application/json")
        .body(serde_json::to_string(&response)?)?)
}

async fn process_cloud_request(request: CloudRequest) -> Result<serde_json::Value, String> {
    match request.operation.as_str() {
        "neural_inference" => {
            // Batch processing for neural inference
            let batch_size = request.batch_size.unwrap_or(10);
            let mut results = Vec::new();
            
            for chunk in request.vectors.chunks(batch_size) {
                let batch_results = process_neural_batch(chunk.to_vec()).await?;
                results.extend(batch_results);
            }
            
            Ok(serde_json::json!({
                "inference_results": results,
                "total_processed": request.vectors.len(),
                "batch_size": batch_size
            }))
        }
        
        "vector_similarity" => {
            let similarities = compute_vector_similarities(request.vectors).await?;
            Ok(serde_json::json!({
                "similarity_matrix": similarities
            }))
        }
        
        _ => Err(format!("Unknown operation: {}", request.operation))
    }
}

async fn process_neural_batch(vectors: Vec<Vec<f32>>) -> Result<Vec<f32>, String> {
    // Simulate neural network processing
    let mut results = Vec::new();
    
    for vec_data in vectors {
        if vec_data.len() != 32 {
            return Err("Vector must have 32 dimensions".to_string());
        }
        
        let mut root_vector = RootVector::zero();
        root_vector.data.copy_from_slice(&vec_data);
        
        // Simple processing: return magnitude
        results.push(root_vector.magnitude());
    }
    
    Ok(results)
}

async fn compute_vector_similarities(vectors: Vec<Vec<f32>>) -> Result<Vec<Vec<f32>>, String> {
    let mut root_vectors = Vec::new();
    
    for vec_data in vectors {
        if vec_data.len() != 32 {
            return Err("Vector must have 32 dimensions".to_string());
        }
        
        let mut root_vector = RootVector::zero();
        root_vector.data.copy_from_slice(&vec_data);
        root_vector.normalize();
        root_vectors.push(root_vector);
    }
    
    let mut similarity_matrix = Vec::new();
    for i in 0..root_vectors.len() {
        let mut row = Vec::new();
        for j in 0..root_vectors.len() {
            row.push(root_vectors[i].dot(&root_vectors[j]));
        }
        similarity_matrix.push(row);
    }
    
    Ok(similarity_matrix)
}

#[tokio::main]
async fn main() -> Result<(), Error> {
    run(ruv_fann_handler).await
}

Azure Functions Integration

// Cargo.toml for Azure Functions
[dependencies]
azure-functions = "0.15"
serde = { version = "1.0", features = ["derive"] }
serde_json = "1.0"
tokio = { version = "1", features = ["macros"] }
semantic-cartan-matrix = { path = "../Semantic_Cartan_Matrix" }
// src/main.rs - Azure Function
use azure_functions::{
    bindings::{HttpRequest, HttpResponse},
    func,
};
use serde::{Deserialize, Serialize};
use semantic_cartan_matrix::prelude::*;

#[derive(Deserialize)]
struct AzureRequest {
    vectors: Vec<Vec<f32>>,
    operation: String,
    options: Option<serde_json::Value>,
}

#[derive(Serialize)]
struct AzureResponse {
    success: bool,
    data: serde_json::Value,
    metadata: ResponseMetadata,
}

#[derive(Serialize)]
struct ResponseMetadata {
    processing_time_ms: u64,
    function_version: &'static str,
    timestamp: String,
    resource_usage: ResourceUsage,
}

#[derive(Serialize)]
struct ResourceUsage {
    memory_peak_mb: f64,
    cpu_time_ms: u64,
}

#[func]
#[binding(name = "req", type = "httpTrigger")]
#[binding(name = "$return", type = "http")]
pub async fn ruv_fann_azure(req: HttpRequest) -> azure_functions::Result<HttpResponse> {
    let start = std::time::Instant::now();
    let start_memory = get_memory_usage();
    
    // Parse request body
    let request: AzureRequest = match req.json().await {
        Ok(body) => body,
        Err(e) => {
            return Ok(create_error_response(
                format!("Invalid request body: {}", e),
                start,
                start_memory,
            ));
        }
    };
    
    // Process the request
    let result = match process_azure_request(request).await {
        Ok(data) => data,
        Err(e) => {
            return Ok(create_error_response(e, start, start_memory));
        }
    };
    
    let response = AzureResponse {
        success: true,
        data: result,
        metadata: ResponseMetadata {
            processing_time_ms: start.elapsed().as_millis() as u64,
            function_version: env!("CARGO_PKG_VERSION"),
            timestamp: chrono::Utc::now().to_rfc3339(),
            resource_usage: ResourceUsage {
                memory_peak_mb: (get_memory_usage() - start_memory) as f64 / 1024.0 / 1024.0,
                cpu_time_ms: start.elapsed().as_millis() as u64,
            },
        },
    };
    
    Ok(HttpResponse::builder()
        .status(200)
        .header("Content-Type", "application/json")
        .json(&response)?)
}

async fn process_azure_request(request: AzureRequest) -> Result<serde_json::Value, String> {
    match request.operation.as_str() {
        "embedding_similarity" => {
            let embeddings = compute_embeddings(request.vectors).await?;
            Ok(serde_json::json!({
                "embeddings": embeddings,
                "similarity_search_ready": true
            }))
        }
        
        "attention_analysis" => {
            let attention_scores = analyze_attention_patterns(request.vectors).await?;
            Ok(serde_json::json!({
                "attention_patterns": attention_scores,
                "interpretability_metrics": compute_interpretability_metrics(&attention_scores)
            }))
        }
        
        "batch_transform" => {
            let transformed = batch_transform_vectors(request.vectors).await?;
            Ok(serde_json::json!({
                "transformed_vectors": transformed,
                "transformation_applied": "cartan_projection"
            }))
        }
        
        _ => Err(format!("Unsupported operation: {}", request.operation))
    }
}

async fn compute_embeddings(vectors: Vec<Vec<f32>>) -> Result<Vec<Vec<f32>>, String> {
    let mut embeddings = Vec::new();
    
    for vec_data in vectors {
        if vec_data.len() != 32 {
            return Err("Input vectors must have 32 dimensions".to_string());
        }
        
        let mut root_vector = RootVector::zero();
        root_vector.data.copy_from_slice(&vec_data);
        
        // Apply Cartan transformation for embedding
        let cartan = CartanMatrix::identity();
        // Simplified embedding computation
        root_vector.normalize();
        embeddings.push(root_vector.data.to_vec());
    }
    
    Ok(embeddings)
}

async fn analyze_attention_patterns(vectors: Vec<Vec<f32>>) -> Result<Vec<Vec<f32>>, String> {
    let mut input_vectors = Vec::new();
    
    for vec_data in vectors {
        if vec_data.len() != 32 {
            return Err("Input vectors must have 32 dimensions".to_string());
        }
        
        let mut root_vector = RootVector::zero();
        root_vector.data.copy_from_slice(&vec_data);
        input_vectors.push(root_vector);
    }
    
    let cartan = CartanMatrix::identity();
    let mut attention = CartanAttention::new(cartan)
        .map_err(|e| format!("Failed to create attention mechanism: {:?}", e))?;
    
    // Get attention scores (simplified)
    let mut attention_matrix = Vec::new();
    for i in 0..input_vectors.len() {
        let mut row = Vec::new();
        for j in 0..input_vectors.len() {
            let score = input_vectors[i].dot(&input_vectors[j]);
            row.push(score);
        }
        attention_matrix.push(row);
    }
    
    Ok(attention_matrix)
}

async fn batch_transform_vectors(vectors: Vec<Vec<f32>>) -> Result<Vec<Vec<f32>>, String> {
    let mut transformed = Vec::new();
    
    for vec_data in vectors {
        if vec_data.len() != 32 {
            return Err("Input vectors must have 32 dimensions".to_string());
        }
        
        let mut root_vector = RootVector::zero();
        root_vector.data.copy_from_slice(&vec_data);
        
        // Apply Cartan matrix transformation
        root_vector.normalize();
        transformed.push(root_vector.data.to_vec());
    }
    
    Ok(transformed)
}

fn compute_interpretability_metrics(attention_matrix: &[Vec<f32>]) -> serde_json::Value {
    let total_attention: f32 = attention_matrix
        .iter()
        .flat_map(|row| row.iter())
        .sum();
    
    let average_attention = total_attention / (attention_matrix.len() * attention_matrix[0].len()) as f32;
    
    serde_json::json!({
        "average_attention": average_attention,
        "attention_entropy": compute_entropy(attention_matrix),
        "sparsity": compute_sparsity(attention_matrix)
    })
}

fn compute_entropy(matrix: &[Vec<f32>]) -> f32 {
    // Simplified entropy calculation
    let total: f32 = matrix.iter().flat_map(|row| row.iter()).sum();
    let mut entropy = 0.0;
    
    for row in matrix {
        for &value in row {
            if value > 0.0 {
                let prob = value / total;
                entropy -= prob * prob.ln();
            }
        }
    }
    
    entropy
}

fn compute_sparsity(matrix: &[Vec<f32>]) -> f32 {
    let total_elements = matrix.len() * matrix[0].len();
    let non_zero_elements = matrix
        .iter()
        .flat_map(|row| row.iter())
        .filter(|&&x| x.abs() > 1e-6)
        .count();
    
    1.0 - (non_zero_elements as f32 / total_elements as f32)
}

fn create_error_response(error: String, start: std::time::Instant, start_memory: usize) -> HttpResponse {
    let error_response = serde_json::json!({
        "success": false,
        "error": error,
        "metadata": {
            "processing_time_ms": start.elapsed().as_millis() as u64,
            "function_version": env!("CARGO_PKG_VERSION"),
            "timestamp": chrono::Utc::now().to_rfc3339(),
            "resource_usage": {
                "memory_peak_mb": (get_memory_usage() - start_memory) as f64 / 1024.0 / 1024.0,
                "cpu_time_ms": start.elapsed().as_millis() as u64,
            }
        }
    });
    
    HttpResponse::builder()
        .status(400)
        .header("Content-Type", "application/json")
        .json(&error_response)
        .unwrap()
}

fn get_memory_usage() -> usize {
    // Simplified memory usage tracking
    // In production, use proper memory profiling
    std::mem::size_of::<usize>() * 1000
}

Mobile Platform Integration

iOS Integration

Swift Package Setup

// Package.swift
// swift-tools-version: 5.7

import PackageDescription

let package = Package(
    name: "RuvFANN",
    platforms: [
        .iOS(.v13),
        .macOS(.v10_15)
    ],
    products: [
        .library(
            name: "RuvFANN",
            targets: ["RuvFANN"]
        ),
    ],
    targets: [
        .target(
            name: "RuvFANN",
            dependencies: ["RuvFANNRust"]
        ),
        .binaryTarget(
            name: "RuvFANNRust",
            path: "RuvFANNRust.xcframework"
        ),
        .testTarget(
            name: "RuvFANNTests",
            dependencies: ["RuvFANN"]
        ),
    ]
)

Swift Bindings

// Sources/RuvFANN/RuvFANN.swift
import Foundation
import RuvFANNRust

/// Swift wrapper for RootVector
public class RootVector {
    private let handle: UnsafeMutableRawPointer
    
    public init() {
        self.handle = ruv_fann_root_vector_new()
    }
    
    public init(data: [Float]) throws {
        guard data.count == 32 else {
            throw RuvFANNError.invalidDimensions("Vector must have exactly 32 dimensions")
        }
        
        self.handle = data.withUnsafeBufferPointer { buffer in
            ruv_fann_root_vector_from_array(buffer.baseAddress, buffer.count)
        }
        
        if self.handle == nil {
            throw RuvFANNError.initializationFailed("Failed to create RootVector")
        }
    }
    
    deinit {
        ruv_fann_root_vector_free(handle)
    }
    
    public func dot(_ other: RootVector) -> Float {
        return ruv_fann_root_vector_dot(self.handle, other.handle)
    }
    
    public func normalize() {
        ruv_fann_root_vector_normalize(self.handle)
    }
    
    public var magnitude: Float {
        return ruv_fann_root_vector_magnitude(self.handle)
    }
    
    public func toArray() -> [Float] {
        var result = Array<Float>(repeating: 0.0, count: 32)
        let success = result.withUnsafeMutableBufferPointer { buffer in
            ruv_fann_root_vector_to_array(self.handle, buffer.baseAddress, buffer.count)
        }
        
        return success ? result : []
    }
}

/// Swift wrapper for CartanAttention
public class CartanAttention {
    private let handle: UnsafeMutableRawPointer
    
    public init() throws {
        self.handle = ruv_fann_cartan_attention_new()
        if self.handle == nil {
            throw RuvFANNError.initializationFailed("Failed to create CartanAttention")
        }
    }
    
    deinit {
        ruv_fann_cartan_attention_free(handle)
    }
    
    public func applyAttention(to vectors: [RootVector]) throws -> [RootVector] {
        let inputPointers = vectors.map { $0.handle }
        var outputPointers = Array<UnsafeMutableRawPointer?>(repeating: nil, count: vectors.count)
        var outputCount: Int = 0
        
        let success = inputPointers.withUnsafeBufferPointer { inputBuffer in
            outputPointers.withUnsafeMutableBufferPointer { outputBuffer in
                ruv_fann_cartan_attention_apply(
                    self.handle,
                    inputBuffer.baseAddress,
                    inputBuffer.count,
                    outputBuffer.baseAddress,
                    &outputCount
                )
            }
        }
        
        guard success else {
            throw RuvFANNError.processingFailed("Attention processing failed")
        }
        
        // Convert output pointers to RootVector objects
        var results: [RootVector] = []
        for i in 0..<outputCount {
            if let pointer = outputPointers[i] {
                let vector = RootVector()
                // Copy data from result pointer
                results.append(vector)
            }
        }
        
        return results
    }
}

/// Neural network interface for iOS
public class NeuralNetwork {
    private let attention: CartanAttention
    private let config: NetworkConfig
    
    public struct NetworkConfig {
        public let inputDimension: Int
        public let outputDimension: Int
        public let attentionHeads: Int
        public let learningRate: Float
        
        public init(inputDimension: Int = 32,
                   outputDimension: Int = 32,
                   attentionHeads: Int = 8,
                   learningRate: Float = 0.001) {
            self.inputDimension = inputDimension
            self.outputDimension = outputDimension
            self.attentionHeads = attentionHeads
            self.learningRate = learningRate
        }
    }
    
    public init(config: NetworkConfig = NetworkConfig()) throws {
        self.config = config
        self.attention = try CartanAttention()
    }
    
    public func process(_ input: [Float]) async throws -> [Float] {
        return try await withCheckedThrowingContinuation { continuation in
            DispatchQueue.global(qos: .userInitiated).async {
                do {
                    let inputVector = try RootVector(data: input)
                    let results = try self.attention.applyAttention(to: [inputVector])
                    
                    if let first = results.first {
                        continuation.resume(returning: first.toArray())
                    } else {
                        continuation.resume(throwing: RuvFANNError.processingFailed("No output produced"))
                    }
                } catch {
                    continuation.resume(throwing: error)
                }
            }
        }
    }
    
    public func batchProcess(_ inputs: [[Float]]) async throws -> [[Float]] {
        return try await withThrowingTaskGroup(of: [Float].self, returning: [[Float]].self) { group in
            for input in inputs {
                group.addTask {
                    try await self.process(input)
                }
            }
            
            var results: [[Float]] = []
            for try await result in group {
                results.append(result)
            }
            return results
        }
    }
}

/// Error types for RuvFANN
public enum RuvFANNError: Error, LocalizedError {
    case invalidDimensions(String)
    case initializationFailed(String)
    case processingFailed(String)
    case memoryError(String)
    
    public var errorDescription: String? {
        switch self {
        case .invalidDimensions(let message):
            return "Invalid dimensions: \(message)"
        case .initializationFailed(let message):
            return "Initialization failed: \(message)"
        case .processingFailed(let message):
            return "Processing failed: \(message)"
        case .memoryError(let message):
            return "Memory error: \(message)"
        }
    }
}

iOS Usage Example

// ContentView.swift - SwiftUI example
import SwiftUI
import RuvFANN

struct ContentView: View {
    @StateObject private var neuralNetworkManager = NeuralNetworkManager()
    
    var body: some View {
        NavigationView {
            VStack(spacing: 20) {
                Text("ruv-FANN Neural Network")
                    .font(.title)
                    .padding()
                
                if neuralNetworkManager.isProcessing {
                    ProgressView("Processing...")
                        .progressViewStyle(CircularProgressViewStyle())
                } else {
                    VStack {
                        Button("Run Single Inference") {
                            Task {
                                await neuralNetworkManager.runSingleInference()
                            }
                        }
                        .buttonStyle(.borderedProminent)
                        
                        Button("Run Batch Inference") {
                            Task {
                                await neuralNetworkManager.runBatchInference()
                            }
                        }
                        .buttonStyle(.bordered)
                    }
                }
                
                if let results = neuralNetworkManager.lastResults {
                    VStack(alignment: .leading) {
                        Text("Results:")
                            .font(.headline)
                        
                        ScrollView {
                            LazyVStack(alignment: .leading) {
                                ForEach(Array(results.enumerated()), id: \.offset) { index, result in
                                    VStack(alignment: .leading) {
                                        Text("Output \(index + 1):")
                                            .font(.subheadline)
                                            .bold()
                                        
                                        Text(formatArray(result))
                                            .font(.caption)
                                            .foregroundColor(.secondary)
                                    }
                                    .padding(.vertical, 4)
                                }
                            }
                        }
                        .frame(maxHeight: 300)
                    }
                    .padding()
                    .background(Color.gray.opacity(0.1))
                    .cornerRadius(8)
                }
                
                Spacer()
            }
            .padding()
            .navigationTitle("ruv-FANN Demo")
        }
        .alert("Error", isPresented: .constant(neuralNetworkManager.errorMessage != nil)) {
            Button("OK") {
                neuralNetworkManager.errorMessage = nil
            }
        } message: {
            Text(neuralNetworkManager.errorMessage ?? "")
        }
    }
    
    private func formatArray(_ array: [Float]) -> String {
        let formatted = array.prefix(8).map { String(format: "%.3f", $0) }
        return formatted.joined(separator: ", ") + (array.count > 8 ? "..." : "")
    }
}

@MainActor
class NeuralNetworkManager: ObservableObject {
    @Published var isProcessing = false
    @Published var lastResults: [[Float]]?
    @Published var errorMessage: String?
    
    private var network: NeuralNetwork?
    
    init() {
        initializeNetwork()
    }
    
    private func initializeNetwork() {
        do {
            let config = NeuralNetwork.NetworkConfig(
                inputDimension: 32,
                outputDimension: 32,
                attentionHeads: 8,
                learningRate: 0.001
            )
            self.network = try NeuralNetwork(config: config)
        } catch {
            self.errorMessage = "Failed to initialize network: \(error.localizedDescription)"
        }
    }
    
    func runSingleInference() async {
        guard let network = network else { return }
        
        isProcessing = true
        defer { isProcessing = false }
        
        do {
            // Generate random input
            let input = (0..<32).map { _ in Float.random(in: -1...1) }
            
            let result = try await network.process(input)
            self.lastResults = [result]
            
        } catch {
            self.errorMessage = "Inference failed: \(error.localizedDescription)"
        }
    }
    
    func runBatchInference() async {
        guard let network = network else { return }
        
        isProcessing = true
        defer { isProcessing = false }
        
        do {
            // Generate batch of random inputs
            let batchSize = 5
            let inputs = (0..<batchSize).map { _ in
                (0..<32).map { _ in Float.random(in: -1...1) }
            }
            
            let results = try await network.batchProcess(inputs)
            self.lastResults = results
            
        } catch {
            self.errorMessage = "Batch inference failed: \(error.localizedDescription)"
        }
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}

Android Integration

Kotlin Bindings

// RuvFANN.kt
package com.ruvfann.neural

import java.nio.FloatBuffer
import kotlinx.coroutines.*

/**
 * Main interface for ruv-FANN neural network operations on Android
 */
class RuvFANN {
    companion object {
        init {
            System.loadLibrary("ruv_fann_android")
        }
    }
    
    // Native method declarations
    private external fun createRootVector(): Long
    private external fun createRootVectorFromArray(data: FloatArray): Long
    private external fun freeRootVector(handle: Long)
    private external fun rootVectorDot(handle1: Long, handle2: Long): Float
    private external fun rootVectorNormalize(handle: Long)
    private external fun rootVectorMagnitude(handle: Long): Float
    private external fun rootVectorToArray(handle: Long): FloatArray
    
    private external fun createCartanAttention(): Long
    private external fun freeCartanAttention(handle: Long)
    private external fun applyAttention(
        attentionHandle: Long,
        inputHandles: LongArray
    ): LongArray
    
    /**
     * Wrapper class for RootVector
     */
    class RootVector private constructor(private val handle: Long) {
        
        constructor() : this(createRootVector())
        
        constructor(data: FloatArray) : this(
            if (data.size == 32) createRootVectorFromArray(data)
            else throw IllegalArgumentException("Vector must have exactly 32 dimensions")
        )
        
        fun dot(other: RootVector): Float {
            return rootVectorDot(this.handle, other.handle)
        }
        
        fun normalize() {
            rootVectorNormalize(this.handle)
        }
        
        val magnitude: Float
            get() = rootVectorMagnitude(this.handle)
        
        fun toArray(): FloatArray {
            return rootVectorToArray(this.handle)
        }
        
        protected fun finalize() {
            freeRootVector(handle)
        }
        
        internal fun getHandle(): Long = handle
    }
    
    /**
     * Wrapper class for CartanAttention
     */
    class CartanAttention {
        private val handle: Long = createCartanAttention()
        
        fun applyAttention(vectors: List<RootVector>): List<RootVector> {
            val inputHandles = vectors.map { it.getHandle() }.toLongArray()
            val outputHandles = applyAttention(this.handle, inputHandles)
            
            return outputHandles.map { handle ->
                RootVector(handle)
            }
        }
        
        protected fun finalize() {
            freeCartanAttention(handle)
        }
    }
    
    /**
     * High-level neural network interface
     */
    class NeuralNetwork(private val config: NetworkConfig = NetworkConfig()) {
        
        data class NetworkConfig(
            val inputDimension: Int = 32,
            val outputDimension: Int = 32,
            val attentionHeads: Int = 8,
            val learningRate: Float = 0.001f,
            val batchSize: Int = 10
        )
        
        private val attention = CartanAttention()
        private val scope = CoroutineScope(Dispatchers.Default + SupervisorJob())
        
        suspend fun process(input: FloatArray): FloatArray = withContext(Dispatchers.Default) {
            if (input.size != config.inputDimension) {
                throw IllegalArgumentException("Input must have ${config.inputDimension} dimensions")
            }
            
            val inputVector = RootVector(input)
            val results = attention.applyAttention(listOf(inputVector))
            
            results.firstOrNull()?.toArray() 
                ?: throw RuntimeException("Processing failed - no output produced")
        }
        
        suspend fun batchProcess(inputs: List<FloatArray>): List<FloatArray> = withContext(Dispatchers.Default) {
            val chunks = inputs.chunked(config.batchSize)
            val results = mutableListOf<FloatArray>()
            
            chunks.forEach { chunk ->
                val chunkResults = chunk.map { input ->
                    async { process(input) }
                }.awaitAll()
                
                results.addAll(chunkResults)
            }
            
            results
        }
        
        suspend fun processStream(
            inputs: kotlinx.coroutines.flow.Flow<FloatArray>
        ): kotlinx.coroutines.flow.Flow<FloatArray> = inputs.map { input ->
            process(input)
        }.flowOn(Dispatchers.Default)
        
        fun close() {
            scope.cancel()
        }
    }
    
    /**
     * Performance monitoring and benchmarking
     */
    class PerformanceMonitor {
        data class BenchmarkResult(
            val averageLatencyMs: Double,
            val throughputOpsPerSec: Double,
            val memoryUsageMB: Double,
            val accuracy: Double? = null
        )
        
        suspend fun benchmark(
            network: NeuralNetwork,
            testInputs: List<FloatArray>,
            warmupRuns: Int = 10,
            benchmarkRuns: Int = 100
        ): BenchmarkResult = withContext(Dispatchers.Default) {
            // Warmup
            repeat(warmupRuns) {
                network.process(testInputs.random())
            }
            
            // Benchmark
            val startTime = System.nanoTime()
            val startMemory = Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory()
            
            repeat(benchmarkRuns) {
                network.process(testInputs.random())
            }
            
            val endTime = System.nanoTime()
            val endMemory = Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory()
            
            val totalTimeMs = (endTime - startTime) / 1_000_000.0
            val averageLatencyMs = totalTimeMs / benchmarkRuns
            val throughputOpsPerSec = benchmarkRuns / (totalTimeMs / 1000.0)
            val memoryUsageMB = (endMemory - startMemory) / (1024.0 * 1024.0)
            
            BenchmarkResult(
                averageLatencyMs = averageLatencyMs,
                throughputOpsPerSec = throughputOpsPerSec,
                memoryUsageMB = memoryUsageMB
            )
        }
    }
}

Android JNI Implementation

// src/android.rs - JNI bindings for Android
use jni::JNIEnv;
use jni::objects::{JClass, JObject, JFloatArray, JLongArray};
use jni::sys::{jlong, jfloat, jfloatArray, jlongArray};
use std::ptr;
use semantic_cartan_matrix::prelude::*;

// Helper struct to manage native objects
struct NativeRootVector {
    inner: Box<RootVector>,
}

struct NativeCartanAttention {
    inner: Box<CartanAttention>,
}

#[no_mangle]
pub extern "system" fn Java_com_ruvfann_neural_RuvFANN_createRootVector(
    _env: JNIEnv,
    _class: JClass,
) -> jlong {
    let vector = Box::new(RootVector::zero());
    let native = Box::new(NativeRootVector { inner: vector });
    Box::into_raw(native) as jlong
}

#[no_mangle]
pub extern "system" fn Java_com_ruvfann_neural_RuvFANN_createRootVectorFromArray(
    env: JNIEnv,
    _class: JClass,
    data: JFloatArray,
) -> jlong {
    let data_vec = match env.convert_float_array(data) {
        Ok(vec) => vec,
        Err(_) => return 0,
    };
    
    if data_vec.len() != 32 {
        return 0;
    }
    
    let mut vector = RootVector::zero();
    vector.data.copy_from_slice(&data_vec);
    
    let native = Box::new(NativeRootVector {
        inner: Box::new(vector),
    });
    
    Box::into_raw(native) as jlong
}

#[no_mangle]
pub extern "system" fn Java_com_ruvfann_neural_RuvFANN_freeRootVector(
    _env: JNIEnv,
    _class: JClass,
    handle: jlong,
) {
    if handle != 0 {
        unsafe {
            drop(Box::from_raw(handle as *mut NativeRootVector));
        }
    }
}

#[no_mangle]
pub extern "system" fn Java_com_ruvfann_neural_RuvFANN_rootVectorDot(
    _env: JNIEnv,
    _class: JClass,
    handle1: jlong,
    handle2: jlong,
) -> jfloat {
    if handle1 == 0 || handle2 == 0 {
        return 0.0;
    }
    
    unsafe {
        let vec1 = &*(handle1 as *const NativeRootVector);
        let vec2 = &*(handle2 as *const NativeRootVector);
        vec1.inner.dot(&vec2.inner)
    }
}

#[no_mangle]
pub extern "system" fn Java_com_ruvfann_neural_RuvFANN_rootVectorNormalize(
    _env: JNIEnv,
    _class: JClass,
    handle: jlong,
) {
    if handle != 0 {
        unsafe {
            let vec = &mut *(handle as *mut NativeRootVector);
            vec.inner.normalize();
        }
    }
}

#[no_mangle]
pub extern "system" fn Java_com_ruvfann_neural_RuvFANN_rootVectorMagnitude(
    _env: JNIEnv,
    _class: JClass,
    handle: jlong,
) -> jfloat {
    if handle == 0 {
        return 0.0;
    }
    
    unsafe {
        let vec = &*(handle as *const NativeRootVector);
        vec.inner.magnitude()
    }
}

#[no_mangle]
pub extern "system" fn Java_com_ruvfann_neural_RuvFANN_rootVectorToArray(
    env: JNIEnv,
    _class: JClass,
    handle: jlong,
) -> jfloatArray {
    if handle == 0 {
        return ptr::null_mut();
    }
    
    unsafe {
        let vec = &*(handle as *const NativeRootVector);
        let data = &vec.inner.data;
        
        match env.new_float_array(32) {
            Ok(array) => {
                if env.set_float_array_region(array, 0, data).is_ok() {
                    array
                } else {
                    ptr::null_mut()
                }
            }
            Err(_) => ptr::null_mut(),
        }
    }
}

#[no_mangle]
pub extern "system" fn Java_com_ruvfann_neural_RuvFANN_createCartanAttention(
    _env: JNIEnv,
    _class: JClass,
) -> jlong {
    let cartan = CartanMatrix::identity();
    match CartanAttention::new(cartan) {
        Ok(attention) => {
            let native = Box::new(NativeCartanAttention {
                inner: Box::new(attention),
            });
            Box::into_raw(native) as jlong
        }
        Err(_) => 0,
    }
}

#[no_mangle]
pub extern "system" fn Java_com_ruvfann_neural_RuvFANN_freeCartanAttention(
    _env: JNIEnv,
    _class: JClass,
    handle: jlong,
) {
    if handle != 0 {
        unsafe {
            drop(Box::from_raw(handle as *mut NativeCartanAttention));
        }
    }
}

#[no_mangle]
pub extern "system" fn Java_com_ruvfann_neural_RuvFANN_applyAttention(
    env: JNIEnv,
    _class: JClass,
    attention_handle: jlong,
    input_handles: JLongArray,
) -> jlongArray {
    if attention_handle == 0 {
        return ptr::null_mut();
    }
    
    let input_vec = match env.convert_long_array(input_handles) {
        Ok(vec) => vec,
        Err(_) => return ptr::null_mut(),
    };
    
    unsafe {
        let attention = &mut *(attention_handle as *mut NativeCartanAttention);
        
        // Convert input handles to RootVectors
        let mut input_vectors = Vec::new();
        for &handle in &input_vec {
            if handle != 0 {
                let vec = &*(handle as *const NativeRootVector);
                input_vectors.push(vec.inner.as_ref().clone());
            }
        }
        
        // Apply attention
        match attention.inner.apply_attention(&input_vectors) {
            Ok(output_vectors) => {
                // Create output handles
                let mut output_handles = Vec::new();
                for vector in output_vectors {
                    let native = Box::new(NativeRootVector {
                        inner: Box::new(vector),
                    });
                    output_handles.push(Box::into_raw(native) as jlong);
                }
                
                // Convert to Java long array
                match env.new_long_array(output_handles.len() as i32) {
                    Ok(array) => {
                        if env.set_long_array_region(array, 0, &output_handles).is_ok() {
                            array
                        } else {
                            ptr::null_mut()
                        }
                    }
                    Err(_) => ptr::null_mut(),
                }
            }
            Err(_) => ptr::null_mut(),
        }
    }
}

Android Usage Example

// MainActivity.kt
package com.ruvfann.demo

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.Button
import android.widget.TextView
import android.widget.ProgressBar
import androidx.lifecycle.lifecycleScope
import kotlinx.coroutines.launch
import com.ruvfann.neural.RuvFANN
import java.text.DecimalFormat

class MainActivity : AppCompatActivity() {
    
    private lateinit var network: RuvFANN.NeuralNetwork
    private lateinit var monitor: RuvFANN.PerformanceMonitor
    
    private lateinit var resultsText: TextView
    private lateinit var progressBar: ProgressBar
    private lateinit var singleInferenceButton: Button
    private lateinit var batchInferenceButton: Button
    private lateinit var benchmarkButton: Button
    
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        
        initializeViews()
        initializeNetwork()
        setupClickListeners()
    }
    
    private fun initializeViews() {
        resultsText = findViewById(R.id.resultsText)
        progressBar = findViewById(R.id.progressBar)
        singleInferenceButton = findViewById(R.id.singleInferenceButton)
        batchInferenceButton = findViewById(R.id.batchInferenceButton)
        benchmarkButton = findViewById(R.id.benchmarkButton)
    }
    
    private fun initializeNetwork() {
        val config = RuvFANN.NeuralNetwork.NetworkConfig(
            inputDimension = 32,
            outputDimension = 32,
            attentionHeads = 8,
            learningRate = 0.001f,
            batchSize = 10
        )
        
        network = RuvFANN.NeuralNetwork(config)
        monitor = RuvFANN.PerformanceMonitor()
    }
    
    private fun setupClickListeners() {
        singleInferenceButton.setOnClickListener {
            runSingleInference()
        }
        
        batchInferenceButton.setOnClickListener {
            runBatchInference()
        }
        
        benchmarkButton.setOnClickListener {
            runBenchmark()
        }
    }
    
    private fun runSingleInference() {
        lifecycleScope.launch {
            try {
                setUIProcessing(true)
                
                // Generate random input
                val input = FloatArray(32) { kotlin.random.Random.nextFloat() * 2 - 1 }
                
                val startTime = System.currentTimeMillis()
                val output = network.process(input)
                val processingTime = System.currentTimeMillis() - startTime
                
                val result = buildString {
                    appendLine("Single Inference Results:")
                    appendLine("Processing time: ${processingTime}ms")
                    appendLine("Input (first 8): ${formatArray(input.take(8))}")
                    appendLine("Output (first 8): ${formatArray(output.take(8))}")
                    appendLine("Output magnitude: ${calculateMagnitude(output)}")
                }
                
                resultsText.text = result
                
            } catch (e: Exception) {
                resultsText.text = "Error: ${e.message}"
            } finally {
                setUIProcessing(false)
            }
        }
    }
    
    private fun runBatchInference() {
        lifecycleScope.launch {
            try {
                setUIProcessing(true)
                
                // Generate batch of random inputs
                val batchSize = 20
                val inputs = List(batchSize) {
                    FloatArray(32) { kotlin.random.Random.nextFloat() * 2 - 1 }
                }
                
                val startTime = System.currentTimeMillis()
                val outputs = network.batchProcess(inputs)
                val processingTime = System.currentTimeMillis() - startTime
                
                val avgMagnitude = outputs.map { calculateMagnitude(it) }.average()
                val throughput = batchSize.toDouble() / (processingTime / 1000.0)
                
                val result = buildString {
                    appendLine("Batch Inference Results:")
                    appendLine("Batch size: $batchSize")
                    appendLine("Total processing time: ${processingTime}ms")
                    appendLine("Average per inference: ${processingTime / batchSize}ms")
                    appendLine("Throughput: ${DecimalFormat("#.##").format(throughput)} inferences/sec")
                    appendLine("Average output magnitude: ${DecimalFormat("#.####").format(avgMagnitude)}")
                    appendLine()
                    appendLine("Sample outputs (first 3):")
                    outputs.take(3).forEachIndexed { index, output ->
                        appendLine("Output $index: ${formatArray(output.take(6))}...")
                    }
                }
                
                resultsText.text = result
                
            } catch (e: Exception) {
                resultsText.text = "Error: ${e.message}"
            } finally {
                setUIProcessing(false)
            }
        }
    }
    
    private fun runBenchmark() {
        lifecycleScope.launch {
            try {
                setUIProcessing(true)
                
                // Generate test inputs
                val testInputs = List(50) {
                    FloatArray(32) { kotlin.random.Random.nextFloat() * 2 - 1 }
                }
                
                resultsText.text = "Running benchmark..."
                
                val benchmarkResult = monitor.benchmark(
                    network = network,
                    testInputs = testInputs,
                    warmupRuns = 10,
                    benchmarkRuns = 100
                )
                
                val result = buildString {
                    appendLine("Benchmark Results:")
                    appendLine("Average latency: ${DecimalFormat("#.##").format(benchmarkResult.averageLatencyMs)}ms")
                    appendLine("Throughput: ${DecimalFormat("#.##").format(benchmarkResult.throughputOpsPerSec)} ops/sec")
                    appendLine("Memory usage: ${DecimalFormat("#.##").format(benchmarkResult.memoryUsageMB)}MB")
                    appendLine()
                    appendLine("Device info:")
                    appendLine("Processor: ${android.os.Build.HARDWARE}")
                    appendLine("API Level: ${android.os.Build.VERSION.SDK_INT}")
                    appendLine("Available processors: ${Runtime.getRuntime().availableProcessors()}")
                    
                    val maxMemory = Runtime.getRuntime().maxMemory() / (1024 * 1024)
                    appendLine("Max memory: ${maxMemory}MB")
                }
                
                resultsText.text = result
                
            } catch (e: Exception) {
                resultsText.text = "Benchmark error: ${e.message}"
            } finally {
                setUIProcessing(false)
            }
        }
    }
    
    private fun setUIProcessing(processing: Boolean) {
        progressBar.visibility = if (processing) android.view.View.VISIBLE else android.view.View.GONE
        singleInferenceButton.isEnabled = !processing
        batchInferenceButton.isEnabled = !processing
        benchmarkButton.isEnabled = !processing
    }
    
    private fun formatArray(values: List<Float>): String {
        return values.joinToString(", ") { DecimalFormat("#.###").format(it) }
    }
    
    private fun calculateMagnitude(array: FloatArray): Float {
        return kotlin.math.sqrt(array.map { it * it }.sum())
    }
    
    override fun onDestroy() {
        super.onDestroy()
        network.close()
    }
}

Performance Considerations

Memory Management

Rust Memory Optimization

// src/memory.rs - Optimized memory management
use std::alloc::{GlobalAlloc, Layout, System};
use std::sync::atomic::{AtomicUsize, Ordering};

/// Custom allocator with tracking
pub struct TrackingAllocator {
    inner: System,
    allocated: AtomicUsize,
    peak_allocated: AtomicUsize,
}

unsafe impl GlobalAlloc for TrackingAllocator {
    unsafe fn alloc(&self, layout: Layout) -> *mut u8 {
        let ptr = self.inner.alloc(layout);
        if !ptr.is_null() {
            let size = layout.size();
            let current = self.allocated.fetch_add(size, Ordering::Relaxed) + size;
            
            // Update peak if necessary
            let mut peak = self.peak_allocated.load(Ordering::Relaxed);
            while current > peak {
                match self.peak_allocated.compare_exchange_weak(
                    peak, current, Ordering::Relaxed, Ordering::Relaxed
                ) {
                    Ok(_) => break,
                    Err(x) => peak = x,
                }
            }
        }
        ptr
    }
    
    unsafe fn dealloc(&self, ptr: *mut u8, layout: Layout) {
        self.inner.dealloc(ptr, layout);
        self.allocated.fetch_sub(layout.size(), Ordering::Relaxed);
    }
}

impl TrackingAllocator {
    pub const fn new() -> Self {
        Self {
            inner: System,
            allocated: AtomicUsize::new(0),
            peak_allocated: AtomicUsize::new(0),
        }
    }
    
    pub fn current_allocated(&self) -> usize {
        self.allocated.load(Ordering::Relaxed)
    }
    
    pub fn peak_allocated(&self) -> usize {
        self.peak_allocated.load(Ordering::Relaxed)
    }
    
    pub fn reset_peak(&self) {
        self.peak_allocated.store(self.current_allocated(), Ordering::Relaxed);
    }
}

#[global_allocator]
static GLOBAL_ALLOCATOR: TrackingAllocator = TrackingAllocator::new();

/// Memory-efficient vector pooling
pub struct VectorPool {
    pool: std::sync::Mutex<Vec<Vec<f32>>>,
    max_size: usize,
}

impl VectorPool {
    pub fn new(max_size: usize) -> Self {
        Self {
            pool: std::sync::Mutex::new(Vec::new()),
            max_size,
        }
    }
    
    pub fn get(&self) -> Vec<f32> {
        let mut pool = self.pool.lock().unwrap();
        pool.pop().unwrap_or_else(|| Vec::with_capacity(32))
    }
    
    pub fn return_vector(&self, mut vector: Vec<f32>) {
        vector.clear();
        if vector.capacity() == 32 {
            let mut pool = self.pool.lock().unwrap();
            if pool.len() < self.max_size {
                pool.push(vector);
            }
        }
    }
}

/// Performance monitoring utilities
pub struct PerformanceTracker {
    start_time: std::time::Instant,
    start_memory: usize,
    operation_name: String,
}

impl PerformanceTracker {
    pub fn new(operation_name: impl Into<String>) -> Self {
        Self {
            start_time: std::time::Instant::now(),
            start_memory: GLOBAL_ALLOCATOR.current_allocated(),
            operation_name: operation_name.into(),
        }
    }
    
    pub fn finish(self) -> PerformanceMetrics {
        let duration = self.start_time.elapsed();
        let memory_used = GLOBAL_ALLOCATOR.current_allocated().saturating_sub(self.start_memory);
        let peak_memory = GLOBAL_ALLOCATOR.peak_allocated();
        
        PerformanceMetrics {
            operation: self.operation_name,
            duration,
            memory_used,
            peak_memory,
        }
    }
}

#[derive(Debug, Clone)]
pub struct PerformanceMetrics {
    pub operation: String,
    pub duration: std::time::Duration,
    pub memory_used: usize,
    pub peak_memory: usize,
}

impl PerformanceMetrics {
    pub fn print(&self) {
        println!("Performance Metrics for '{}':", self.operation);
        println!("  Duration: {:.2}ms", self.duration.as_secs_f64() * 1000.0);
        println!("  Memory used: {:.2}KB", self.memory_used as f64 / 1024.0);
        println!("  Peak memory: {:.2}KB", self.peak_memory as f64 / 1024.0);
    }
}

SIMD Optimization Guidelines

// src/simd_optimization.rs
#[cfg(target_arch = "x86_64")]
use std::arch::x86_64::*;

#[cfg(target_arch = "wasm32")]
use std::arch::wasm32::*;

/// SIMD-optimized operations for different architectures
pub trait SimdOps {
    fn simd_dot_product(a: &[f32], b: &[f32]) -> f32;
    fn simd_normalize(data: &mut [f32]);
    fn simd_scale(data: &mut [f32], scale: f32);
}

#[cfg(target_arch = "x86_64")]
pub struct X86SimdOps;

#[cfg(target_arch = "x86_64")]
impl SimdOps for X86SimdOps {
    fn simd_dot_product(a: &[f32], b: &[f32]) -> f32 {
        assert_eq!(a.len(), b.len());
        assert_eq!(a.len() % 8, 0);
        
        unsafe {
            let mut sum = _mm256_setzero_ps();
            
            for i in (0..a.len()).step_by(8) {
                let va = _mm256_loadu_ps(a.as_ptr().add(i));
                let vb = _mm256_loadu_ps(b.as_ptr().add(i));
                let prod = _mm256_mul_ps(va, vb);
                sum = _mm256_add_ps(sum, prod);
            }
            
            // Horizontal sum
            let sum_high = _mm256_extractf128_ps(sum, 1);
            let sum_low = _mm256_castps256_ps128(sum);
            let sum_128 = _mm_add_ps(sum_high, sum_low);
            
            let sum_64 = _mm_add_ps(sum_128, _mm_movehl_ps(sum_128, sum_128));
            let sum_32 = _mm_add_ss(sum_64, _mm_shuffle_ps(sum_64, sum_64, 1));
            
            _mm_cvtss_f32(sum_32)
        }
    }
    
    fn simd_normalize(data: &mut [f32]) {
        let magnitude = Self::simd_dot_product(data, data).sqrt();
        if magnitude > 1e-8 {
            Self::simd_scale(data, 1.0 / magnitude);
        }
    }
    
    fn simd_scale(data: &mut [f32], scale: f32) {
        assert_eq!(data.len() % 8, 0);
        
        unsafe {
            let scale_vec = _mm256_set1_ps(scale);
            
            for i in (0..data.len()).step_by(8) {
                let vec = _mm256_loadu_ps(data.as_ptr().add(i));
                let scaled = _mm256_mul_ps(vec, scale_vec);
                _mm256_storeu_ps(data.as_mut_ptr().add(i), scaled);
            }
        }
    }
}

#[cfg(target_arch = "wasm32")]
pub struct WasmSimdOps;

#[cfg(target_arch = "wasm32")]
impl SimdOps for WasmSimdOps {
    fn simd_dot_product(a: &[f32], b: &[f32]) -> f32 {
        assert_eq!(a.len(), b.len());
        assert_eq!(a.len() % 4, 0);
        
        unsafe {
            let mut sum = f32x4_splat(0.0);
            
            for i in (0..a.len()).step_by(4) {
                let va = v128_load(a.as_ptr().add(i) as *const v128);
                let vb = v128_load(b.as_ptr().add(i) as *const v128);
                let prod = f32x4_mul(va, vb);
                sum = f32x4_add(sum, prod);
            }
            
            // Extract and sum all lanes
            f32x4_extract_lane::<0>(sum) +
            f32x4_extract_lane::<1>(sum) +
            f32x4_extract_lane::<2>(sum) +
            f32x4_extract_lane::<3>(sum)
        }
    }
    
    fn simd_normalize(data: &mut [f32]) {
        let magnitude = Self::simd_dot_product(data, data).sqrt();
        if magnitude > 1e-8 {
            Self::simd_scale(data, 1.0 / magnitude);
        }
    }
    
    fn simd_scale(data: &mut [f32], scale: f32) {
        assert_eq!(data.len() % 4, 0);
        
        unsafe {
            let scale_vec = f32x4_splat(scale);
            
            for i in (0..data.len()).step_by(4) {
                let vec = v128_load(data.as_ptr().add(i) as *const v128);
                let scaled = f32x4_mul(vec, scale_vec);
                v128_store(data.as_mut_ptr().add(i) as *mut v128, scaled);
            }
        }
    }
}

/// Fallback scalar implementation
pub struct ScalarOps;

impl SimdOps for ScalarOps {
    fn simd_dot_product(a: &[f32], b: &[f32]) -> f32 {
        a.iter().zip(b.iter()).map(|(x, y)| x * y).sum()
    }
    
    fn simd_normalize(data: &mut [f32]) {
        let magnitude: f32 = data.iter().map(|x| x * x).sum::<f32>().sqrt();
        if magnitude > 1e-8 {
            for x in data {
                *x /= magnitude;
            }
        }
    }
    
    fn simd_scale(data: &mut [f32], scale: f32) {
        for x in data {
            *x *= scale;
        }
    }
}

/// Dynamic SIMD dispatch
pub fn get_simd_ops() -> Box<dyn SimdOps> {
    #[cfg(target_arch = "x86_64")]
    {
        if is_x86_feature_detected!("avx2") {
            Box::new(X86SimdOps)
        } else {
            Box::new(ScalarOps)
        }
    }
    
    #[cfg(target_arch = "wasm32")]
    {
        Box::new(WasmSimdOps)
    }
    
    #[cfg(not(any(target_arch = "x86_64", target_arch = "wasm32")))]
    {
        Box::new(ScalarOps)
    }
}

Best Practices

Error Handling

// src/error_handling.rs
use std::fmt;

/// Comprehensive error handling for integrations
#[derive(Debug, Clone)]
pub enum IntegrationError {
    InvalidInput { 
        expected: String, 
        received: String 
    },
    ProcessingFailed { 
        operation: String, 
        cause: String 
    },
    MemoryError { 
        requested: usize, 
        available: usize 
    },
    ConfigurationError { 
        parameter: String, 
        value: String, 
        valid_range: String 
    },
    PlatformNotSupported { 
        platform: String, 
        required_features: Vec<String> 
    },
    VersionMismatch { 
        expected: String, 
        found: String 
    },
}

impl fmt::Display for IntegrationError {
    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
        match self {
            IntegrationError::InvalidInput { expected, received } => {
                write!(f, "Invalid input: expected {}, received {}", expected, received)
            }
            IntegrationError::ProcessingFailed { operation, cause } => {
                write!(f, "Processing failed in operation '{}': {}", operation, cause)
            }
            IntegrationError::MemoryError { requested, available } => {
                write!(f, "Memory error: requested {} bytes, only {} available", requested, available)
            }
            IntegrationError::ConfigurationError { parameter, value, valid_range } => {
                write!(f, "Configuration error: parameter '{}' has invalid value '{}', valid range: {}", 
                       parameter, value, valid_range)
            }
            IntegrationError::PlatformNotSupported { platform, required_features } => {
                write!(f, "Platform '{}' not supported, requires features: {:?}", 
                       platform, required_features)
            }
            IntegrationError::VersionMismatch { expected, found } => {
                write!(f, "Version mismatch: expected {}, found {}", expected, found)
            }
        }
    }
}

impl std::error::Error for IntegrationError {}

/// Result type for integration operations
pub type IntegrationResult<T> = Result<T, IntegrationError>;

/// Error handling utilities
pub struct ErrorHandler;

impl ErrorHandler {
    pub fn validate_vector_dimensions(data: &[f32], expected: usize) -> IntegrationResult<()> {
        if data.len() != expected {
            Err(IntegrationError::InvalidInput {
                expected: format!("{} dimensions", expected),
                received: format!("{} dimensions", data.len()),
            })
        } else {
            Ok(())
        }
    }
    
    pub fn check_memory_availability(requested: usize) -> IntegrationResult<()> {
        // Simplified memory check
        let available = 1024 * 1024 * 1024; // 1GB
        if requested > available {
            Err(IntegrationError::MemoryError { requested, available })
        } else {
            Ok(())
        }
    }
    
    pub fn validate_configuration<T: PartialOrd + fmt::Display + Copy>(
        parameter: &str,
        value: T,
        min: T,
        max: T,
    ) -> IntegrationResult<()> {
        if value < min || value > max {
            Err(IntegrationError::ConfigurationError {
                parameter: parameter.to_string(),
                value: value.to_string(),
                valid_range: format!("[{}, {}]", min, max),
            })
        } else {
            Ok(())
        }
    }
    
    pub fn check_platform_support() -> IntegrationResult<()> {
        #[cfg(not(any(
            target_arch = "x86_64",
            target_arch = "aarch64",
            target_arch = "wasm32"
        )))]
        {
            return Err(IntegrationError::PlatformNotSupported {
                platform: std::env::consts::ARCH.to_string(),
                required_features: vec!["x86_64".to_string(), "aarch64".to_string(), "wasm32".to_string()],
            });
        }
        
        Ok(())
    }
}

Testing Framework

// src/integration_tests.rs
#[cfg(test)]
mod tests {
    use super::*;
    use semantic_cartan_matrix::prelude::*;
    
    /// Comprehensive integration test suite
    #[test]
    fn test_python_integration() {
        // Test PyO3 bindings
        let vector = RootVector::zero();
        assert_eq!(vector.data.len(), 32);
        
        let mut test_data = [0.0f32; 32];
        test_data[0] = 1.0;
        
        let mut vector = RootVector::zero();
        vector.data.copy_from_slice(&test_data);
        
        assert_eq!(vector.magnitude(), 1.0);
    }
    
    #[test]
    fn test_javascript_integration() {
        // Test WASM compatibility
        let vector = RootVector::zero();
        let serialized = serde_json::to_string(&vector.data).unwrap();
        let deserialized: [f32; 32] = serde_json::from_str(&serialized).unwrap();
        
        assert_eq!(vector.data, deserialized);
    }
    
    #[test]
    fn test_c_ffi_compatibility() {
        // Test C FFI safety
        let vector = RootVector::zero();
        let ptr = &vector as *const RootVector;
        
        unsafe {
            let magnitude = (*ptr).magnitude();
            assert_eq!(magnitude, 0.0);
        }
    }
    
    #[test]
    fn test_memory_management() {
        use crate::memory::GLOBAL_ALLOCATOR;
        
        GLOBAL_ALLOCATOR.reset_peak();
        let initial_memory = GLOBAL_ALLOCATOR.current_allocated();
        
        {
            let _vectors: Vec<RootVector> = (0..1000)
                .map(|_| RootVector::zero())
                .collect();
        }
        
        let final_memory = GLOBAL_ALLOCATOR.current_allocated();
        assert_eq!(initial_memory, final_memory); // All memory should be freed
    }
    
    #[test]
    fn test_simd_performance() {
        use crate::simd_optimization::*;
        
        let ops = get_simd_ops();
        let a = vec![1.0f32; 32];
        let b = vec![2.0f32; 32];
        
        let result = ops.simd_dot_product(&a, &b);
        assert_eq!(result, 64.0); // 32 * 1.0 * 2.0
    }
    
    #[test]
    fn test_cross_platform_compatibility() {
        // Ensure consistent behavior across platforms
        let mut vector = RootVector::zero();
        vector.data[0] = 3.0;
        vector.data[1] = 4.0;
        
        vector.normalize();
        
        let expected_magnitude = 1.0;
        let actual_magnitude = vector.magnitude();
        
        assert!((actual_magnitude - expected_magnitude).abs() < 1e-6);
    }
    
    #[test]
    fn test_error_handling() {
        use crate::error_handling::*;
        
        // Test invalid dimensions
        let result = ErrorHandler::validate_vector_dimensions(&[1.0, 2.0], 32);
        assert!(result.is_err());
        
        // Test valid dimensions
        let data = vec![0.0f32; 32];
        let result = ErrorHandler::validate_vector_dimensions(&data, 32);
        assert!(result.is_ok());
    }
    
    #[test]
    fn test_performance_tracking() {
        use crate::memory::PerformanceTracker;
        
        let tracker = PerformanceTracker::new("test_operation");
        
        // Simulate work
        std::thread::sleep(std::time::Duration::from_millis(10));
        
        let metrics = tracker.finish();
        assert!(metrics.duration.as_millis() >= 10);
    }
}

/// Benchmark suite for integration performance
#[cfg(test)]
mod benchmarks {
    use super::*;
    use criterion::{black_box, criterion_group, criterion_main, Criterion};
    
    fn benchmark_vector_operations(c: &mut Criterion) {
        let mut group = c.benchmark_group("vector_operations");
        
        let vector_a = RootVector::zero();
        let vector_b = RootVector::zero();
        
        group.bench_function("dot_product", |b| {
            b.iter(|| black_box(vector_a.dot(&vector_b)))
        });
        
        let mut vector = RootVector::zero();
        vector.data[0] = 1.0;
        
        group.bench_function("normalize", |b| {
            b.iter(|| {
                let mut v = vector.clone();
                v.normalize()
            })
        });
        
        group.finish();
    }
    
    fn benchmark_attention_mechanism(c: &mut Criterion) {
        let mut group = c.benchmark_group("attention");
        
        let cartan = CartanMatrix::identity();
        let mut attention = CartanAttention::new(cartan).unwrap();
        
        let vectors = vec![RootVector::zero(); 10];
        
        group.bench_function("apply_attention", |b| {
            b.iter(|| black_box(attention.apply_attention(&vectors).unwrap()))
        });
        
        group.finish();
    }
    
    criterion_group!(benches, benchmark_vector_operations, benchmark_attention_mechanism);
    criterion_main!(benches);
}

Conclusion

This comprehensive integration guide covers all major platforms and languages for the ruv-FANN neural network framework. Each integration approach is designed to leverage the framework's high-performance Rust core while providing idiomatic interfaces for different environments.

Key takeaways:

  1. Python Integration: Use PyO3 for seamless numpy compatibility and scientific computing workflows
  2. JavaScript/WASM: Leverage WebAssembly for high-performance browser-based neural networks
  3. C/C++ FFI: Enable integration with existing native codebases through safe FFI bindings
  4. Cloud Platforms: Deploy scalable neural network services on AWS, GCP, and Azure
  5. Mobile Platforms: Bring neural networks to iOS and Android with native performance
  6. Performance: Utilize SIMD optimizations and memory management for maximum efficiency

All integration approaches maintain the safety guarantees of Rust while providing familiar interfaces for each target environment.

⚠️ **GitHub.com Fallback** ⚠️