Geometric Optics API

Operations on multivector coefficient arrays for geometric algebra. These work on plain &[f64] (Rust) or Float64Array (JavaScript).

In geometric algebra, a multivector with n dimensions has 2^n coefficients, one per basis blade, organized by grade (scalar = 0, vectors = 1, bivectors = 2, etc.).

Grade Inspection

bladeGrade(index) / blade_grade(index)

Compute the grade of a basis blade from its index (popcount).

bladeGrade(0);  // 0 (scalar)
bladeGrade(1);  // 1 (e1)
bladeGrade(3);  // 2 (e12)
bladeGrade(7);  // 3 (e123)

bladesAtGradeCount(dimension, grade) / blades_at_grade_count(dimension, grade)

Number of basis blades at a given grade (binomial coefficient).

bladesAtGradeCount(3, 0);  // 1 (scalar)
bladesAtGradeCount(3, 1);  // 3 (vectors: e1, e2, e3)
bladesAtGradeCount(3, 2);  // 3 (bivectors: e12, e13, e23)
bladesAtGradeCount(3, 3);  // 1 (pseudoscalar: e123)

gradeIndices(dimension, grade) / grade_indices(dimension, grade)

Get coefficient array indices for all blades at a given grade.

gradeIndices(3, 1);  // [1, 2, 4] (indices of e1, e2, e3)
gradeIndices(3, 2);  // [3, 5, 6] (indices of e12, e13, e23)

Grade Extraction and Projection

gradeExtract(dimension, grade, mv) / grade_extract(dimension, grade, coefficients)

Extract only the coefficients at a specific grade.

const mv = new Float64Array([1, 2, 3, 4, 5, 6, 7, 8]);
gradeExtract(3, 1, mv);  // [2, 3, 5] (vector components)

gradeProject(dimension, grade, mv) / grade_project(dimension, grade, coefficients)

Project onto a single grade, zeroing all others. Returns a full-size multivector.

const mv = new Float64Array([1, 2, 3, 4, 5, 6, 7, 8]);
gradeProject(3, 1, mv);  // [0, 2, 3, 0, 5, 0, 0, 0]

gradeProjectMax(dimension, maxGrade, mv) / grade_project_max(dimension, max_grade, coefficients)

Project onto all grades up to and including maxGrade.

gradeProjectMax(3, 1, mv);  // [1, 2, 3, 0, 5, 0, 0, 0] (scalar + vector)

Grade Analysis

gradeMask(dimension, mv) / grade_mask(dimension, coefficients)

Bitmask indicating which grades have non-zero components. Bit k is set if grade k is present.

const pure_vector = new Float64Array([0, 1, 0, 0, 0, 0, 0, 0]);
gradeMask(3, pure_vector);  // 0b010 = 2 (only grade 1)

hasGrade(dimension, grade, mv) / has_grade(dimension, grade, coefficients)

Check if a specific grade has non-zero components.

hasGrade(3, 1, mv);  // true
hasGrade(3, 3, mv);  // true (e123 component is 8)

isPureGrade(dimension, mv) / is_pure_grade(dimension, coefficients)

Check if the multivector has components at only one grade.

const pure = new Float64Array([0, 1, 2, 0, 3, 0, 0, 0]);
isPureGrade(3, pure);  // true (only grade 1)

const mixed = new Float64Array([1, 1, 0, 0, 0, 0, 0, 0]);
isPureGrade(3, mixed);  // false (grade 0 + grade 1)

Component Access

componentGet(mv, bladeIndex) / component_get(coefficients, blade_index)

Get a single coefficient by blade index.

componentGet(mv, 1);  // coefficient of e1

componentSet(mv, bladeIndex, value) / component_set(coefficients, blade_index, value)

Set a single coefficient. Returns a new array.

const updated = componentSet(mv, 1, 3.14);  // set e1 to 3.14

Norms

mvNorm(mv) / norm(coefficients)

Euclidean norm (magnitude) of a multivector.

const v = new Float64Array([0, 3, 4, 0, 0, 0, 0, 0]);
mvNorm(v);  // 5

mvNormSquared(mv) / norm_squared(coefficients)

Squared Euclidean norm (avoids square root).

mvNormSquared(v);  // 25

mvNormalize(mv) / normalize(coefficients)

Normalize to unit length.

const unit = mvNormalize(v);  // [0, 0.6, 0.8, 0, 0, 0, 0, 0]
mvNorm(unit);                 // 1.0

Algebraic Transformations

mvReverse(dimension, mv) / reverse(dimension, coefficients)

Reversion: grade-dependent sign reversal. Grade k gets factor (-1)^(k(k-1)/2).

const reversed = mvReverse(3, mv);

gradeInvolution(dimension, mv) / grade_involution(dimension, coefficients)

Grade involution: negate odd-grade components.

const involuted = gradeInvolution(3, mv);

Rust Usage

#![allow(unused)]
fn main() {
use orlando_transducers::geometric_optics::*;

let mv = vec![1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0];

// Grade operations
let vectors = grade_extract(3, 1, &mv);     // [2.0, 3.0, 5.0]
let projected = grade_project(3, 2, &mv);   // bivector projection
let mask = grade_mask(3, &mv);              // bitmask of present grades

// Norms
let n = norm(&mv);
let unit = normalize(&mv);

// Transformations
let rev = reverse(3, &mv);
let inv = grade_involution(3, &mv);
}