Skip to content

Commit 31c8452

Browse files
authored
release/0.14.0 (#100)
* drop affine trait * add subshell_of * extend chemistry test suite * add integral test suite * add curve test suite * add exponential test suite * add projection test suite * add quaternion test suite * assert blades * composed octonion * add detail * revise line ranges * release/0.14.0
1 parent a18140b commit 31c8452

21 files changed

Lines changed: 2548 additions & 903 deletions

.agents/onboard.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -61,11 +61,11 @@ learn how angle impls PartialEq and Eq in src/angle.rs:635~653
6161

6262
learn how angle overloads arithmetic operators in src/angle.rs:655~844
6363

64-
learn how to construct geonum with new, new_with_angle from src/geonum_mod.rs:32~49
64+
learn how to construct geonum with new, new_with_angle from src/geonum_mod.rs:23~49
6565

6666
learn how geonum overloads arithmetic operators in src/geonum_mod.rs:778~1044
6767

68-
learn how geonum can express any number type from the its_a_scalar:8-36, its_a_vector:39-72, its_a_real_number:75-108, its_an_imaginary_number:111-139, its_a_complex_number:142-174, its_a_dual_number:177-295, its_an_octonion:298-341 tests in tests/numbers_test.rs
68+
learn how geonum can express any number type from the its_a_scalar:8-36, its_a_vector:39-72, its_a_real_number:75-108, its_an_imaginary_number:111-139, its_a_complex_number:142-174, its_a_dual_number:177-295, its_an_octonion:298-318 tests in tests/numbers_test.rs
6969

7070
learn how geonum eliminates angle slack created by decomposing angles into scalar coefficients by reading the it_proves_decomposing_angles_with_linearly_combined_basis_vectors_loses_angle_addition:13-84, it_proves_decomposition_distributes_one_angle_across_multiple_scalars:87-160, it_proves_quaternion_tables_add_back_what_decomposition_subtracts:519-660, it_proves_anticommutativity_exists_because_decomposition_subtracts_different_amounts:663-726 tests in tests/linear_algebra_test.rs
7171

CHANGELOG.md

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,18 @@
11
# changelog
22

3+
## 0.14.0 (2026-06-14)
4+
5+
### removed
6+
- `affine` trait and feature — translate was `+`, shear was `rotate`; the layer only re-vocabularied the core
7+
8+
### fixed
9+
- chemistry `electron_affinity` signs by subshell continuity (was a grade proxy), matching NIST except nitrogen
10+
- `it_computes_ijk_product`, `its_an_octonion`: assert the primitive product's commutativity/associativity (`i·j = k`, `ijk = −1`) instead of bailing on the non-commutativity/non-associativity the decomposition table adds back (linear_algebra_test)
11+
12+
### added
13+
- projection_test, curve_test, integral_test, exponential_test: line, area, and the integral as angle-first ops; `wave_sum` interference coverage in geocollection_test
14+
- quaternion_test: the quaternion product factored — commutative rotor (`*`) and anti-symmetric wedge (`a∧b = −b∧a`), `ijk = −1` in blade arithmetic, rotation composition order-dependent by exactly the geometric angle; plus a guard test that `e3∧e1 = 0` is a dropped-blade shadow, not a broken cycle
15+
316
## 0.13.0 (2026-05-24)
417

518
### breaking

Cargo.lock

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "geonum"
3-
version = "0.13.0"
3+
version = "0.14.0"
44
edition = "2021"
55
repository = "https://github.com/mxfactorial/geonum"
66
description = "geometric number library supporting unlimited dimensions with O(1) complexity"
@@ -17,9 +17,8 @@ projection = []
1717
ml = []
1818
em = []
1919
waves = []
20-
affine = []
2120
chemistry = []
22-
all = ["optics", "projection", "ml", "em", "waves", "affine", "chemistry"]
21+
all = ["optics", "projection", "ml", "em", "waves", "chemistry"]
2322

2423
[dependencies]
2524

README.md

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -151,14 +151,18 @@ cga_test.rs
151151
chem_constants_test.rs
152152
chemistry_test.rs
153153
computer_vision_test.rs
154+
curve_test.rs
154155
dimension_test.rs
155156
economics_test.rs
156157
einstein_test.rs
157158
em_field_theory_test.rs
159+
exponential_test.rs
158160
fem_test.rs
159161
finance_test.rs
162+
geocollection_test.rs
160163
grade_test.rs
161164
gravitational_wave_test.rs
165+
integral_test.rs
162166
linear_algebra_test.rs
163167
machine_learning_test.rs
164168
mechanics_test.rs
@@ -171,8 +175,10 @@ numbers_test.rs
171175
optics_test.rs
172176
optimization_test.rs
173177
pga_test.rs
178+
projection_test.rs
174179
pseudoscalar_test.rs
175180
qm_test.rs
181+
quaternion_test.rs
176182
rendering_test.rs
177183
robotics_test.rs
178184
schwarzschild_test.rs
@@ -396,11 +402,11 @@ geometric numbers build dimensions by rotating—not stacking
396402
- its_an_imaginary_number:111-139
397403
- its_a_complex_number:142-174
398404
- its_a_dual_number:177-295
399-
- its_an_octonion:298-341
400-
- its_a_matrix:344-398
401-
- its_a_tensor:401-595
402-
- it_dualizes_log2_geometric_algebra_components:647-680
403-
- its_a_clifford_number:940-1020
405+
- its_an_octonion:298-318
406+
- its_a_matrix:321-375
407+
- its_a_tensor:378-572
408+
- it_dualizes_log2_geometric_algebra_components:624-657
409+
- its_a_clifford_number:917-997
404410
405411
- tests/pseudoscalar_test.rs
406412
- it_solves_the_exponential_complexity_explosion:18-79

src/traits/affine.rs

Lines changed: 0 additions & 108 deletions
This file was deleted.

src/traits/chemistry.rs

Lines changed: 24 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,21 @@ fn last_filled(z: usize) -> usize {
7575
n
7676
}
7777

78+
/// which (n, l) subshell the z-th electron lands in, by the madelung walk.
79+
/// the affinity sign turns on whether the added electron continues a subshell
80+
/// or opens a new one — `subshell_of(z + 1) == subshell_of(z)`
81+
fn subshell_of(z: usize) -> (usize, usize) {
82+
let mut placed = 0;
83+
for (n, l) in Geonum::madelung_order(6) {
84+
let cap = 2 * (2 * l + 1);
85+
if placed + cap >= z {
86+
return (n, l);
87+
}
88+
placed += cap;
89+
}
90+
(0, 0)
91+
}
92+
7893
/// the unsigned binding of the (z+1)th electron stepping on — a screened (+1)
7994
/// nucleus, projected over the anion's valence shell. shared by `electron_affinity`
8095
/// (signed) and `electronegativity`
@@ -118,8 +133,8 @@ pub trait Chemistry: Sized {
118133
fn ionization_energy(z: usize, electrons: usize, lattice: Lattice) -> f64;
119134

120135
/// signed electron affinity in eV: the next electron stepping on. bound
121-
/// (positive) for open shells, repulsive (negative) where it would open a new
122-
/// shell — a closed-shell marginal lands at grade 2 and the sign flips
136+
/// (positive) when it extends the open subshell, repulsive (negative) when it
137+
/// opens a fresh closure — the sign is `subshell_of(z + 1) == subshell_of(z)`
123138
fn electron_affinity(z: usize, lattice: Lattice) -> f64;
124139

125140
/// Mulliken electronegativity, (IE1 + EA binding)/2
@@ -226,12 +241,15 @@ impl Chemistry for Geonum {
226241
}
227242

228243
fn electron_affinity(z: usize, lattice: Lattice) -> f64 {
229-
let marginal = Geonum::electron_wave(z + 1, lattice) - Geonum::electron_wave(z, lattice);
230244
let bind = affinity_binding(z, lattice);
231-
if marginal.angle.grade() == 2 {
232-
-bind // a closed shell refuses the electron — repulsive
233-
} else {
245+
// bound iff the added (z+1)th electron extends the open subshell; unbound
246+
// iff it is the first occupant of a fresh closure that repels it. grade
247+
// cannot sign this — the alkali spin-pair (bound) and the noble shell
248+
// jump (unbound) both land grade 2 — but subshell continuity can
249+
if subshell_of(z + 1) == subshell_of(z) {
234250
bind
251+
} else {
252+
-bind
235253
}
236254
}
237255

src/traits/mod.rs

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -29,11 +29,6 @@ pub mod waves;
2929
#[cfg(feature = "waves")]
3030
pub use waves::Waves;
3131

32-
#[cfg(feature = "affine")]
33-
pub mod affine;
34-
#[cfg(feature = "affine")]
35-
pub use affine::Affine;
36-
3732
#[cfg(feature = "chemistry")]
3833
pub mod chemistry;
3934
#[cfg(feature = "chemistry")]

0 commit comments

Comments
 (0)