feat: initial release
Release / gates (push) Successful in 4m38s
Test / test (push) Successful in 5m16s
Release / release (push) Successful in 35s

Assisted-by: GLM 5.3 Flash
This commit is contained in:
2026-09-03 10:00:00 +02:00
commit af4ee19703
617 changed files with 191195 additions and 0 deletions
+348
View File
@@ -0,0 +1,348 @@
# Changelog
All notable changes to **Tensor** are documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
## [1.0.0] - 2026-09-03
The initial release of Tensor, a scientific computing library in pure
Go: immutable n-dimensional arrays over a wide element-type set,
dense and sparse linear algebra, differential equations, quadrature,
signal transforms, statistics up to mixed models and hidden Markov
models, optimisation from simplex to stochastic global search, a
reverse-mode differentiable core, deterministic SVG plotting and an
experimental SPMD package, with no third-party dependencies and a
deterministic, parallel execution model.
The module is one core package plus one package per domain:
`sourcedock.dev/petrbalvin/tensor` carries the `Array` core with
element-wise math, special functions and the reproducible generator,
re-exporting the whole surface of every domain package; `linalg` the
dense and sparse solvers; `signal` the transforms, filters and
stencils; `integrate` the differential equations and quadrature;
`stats` the distributions and inference; `optim` the fitting and root
finding; `io` the CSV, FITS, HDF5, NetCDF and memory-mapped readers
and writers; `grad` the differentiable core; `plot` the deterministic
figures. Import what you use: the domain packages depend on the core,
never on each other except through five one-directional edges, and
nothing below the root imports the root. The experimental `spmd`
package stands beside them, imported explicitly: a distributed
program names it, the facade does not.
### Added
**Core arrays.**
- Immutable, shape-checked n-dimensional arrays over int64, float32,
float64, complex128, IEEE 754 float16 and the narrow integer types
Int8, Uint8, Int16, Uint16, Int32 and Uint32, with Bool beside
them, under a strict promotion ladder, row-major layout and
multi-rank text formatting. Constructors cover literals
(`FromInts`, `FromFloat32s`, `FromFloats`, `FromComplexes`,
`FromFloat16s`, `FromInt8s` and the family around them), filled and
ranged builders (`Zeros`, `Ones`, `FullI`/`FullF`/`FullC`, `Range`,
`RangeBy`, `Linspace`, `Grid`), byte loading and dtype conversions
(`WithInt`/`WithFloat`/`WithComplex`, and `Astype`, which
range-checks every conversion into a narrow target with an error
naming the value and its index).
- Element-wise arithmetic with scalar variants, transcendentals,
comparisons that answer a bool mask of one byte per element
composing through `And`, `Or`, `Xor` and `Not` (`Where` and
`Select` keep the int mask), and reductions from `Sum`, `Mean`,
`Min`/`Max`, `Prod` and `Dot` through axis variants, `ArgMax`,
`TopK`, `CumSum` and `CumProd` to `SumKahan` compensated summation.
Every float fold cuts its line through a canonical partition fixed
by the length alone and combines the partials through a balanced
tree, so a reduction's answer is a function of the data alone,
never of the machine, and `CumSum` carries a Neumaier compensation
term so a long prefix sheds no small addend.
- Shape operations (`Reshape`, `Flatten`, `Squeeze`, `Transpose`,
`TransposeAxes`, `MoveAxis`, `Pad`, `Tile`, `Repeat`, `Flip`, `Roll`,
`Diag`, triangular extractions), indexing (contiguous `Slice`
selections as read-only payload views, `Gather`, `Scatter`, `Take`,
`Nonzero`, `Argwhere`, `SearchSorted`), and the toolkit pieces
`Einsum`, `Unique`, `OneHot`, `CrossProduct`, `Sort`, `ArgSort`,
and the numeric `Jacobian` of a vector function by central
differences.
- `MatMul2D`, the parallel cache-friendly kernel; sparse matrices as
`SparseCOO`; interpolation (`Interpolate`, the Fritsch-Carlson
`InterpolateMonotone`, `Interpolate2D`, `InterpolateGrid`, natural
cubic splines); and special functions: the gamma and beta families,
error functions, Bessel of integer order and, through
`BesselJRealOrder`, of any real order, Airy and Fresnel families,
exponential integrals, orthogonal polynomials, spherical harmonics,
elliptic integrals and Jacobi functions, and `Cosm1` for
`cos(x) − 1` at the arguments where the direct subtraction has no
correct significant bit.
- Quasirandom sequences for Monte Carlo integration: `HaltonPoints`
and the base-2 digital `SobolPoints` (Joe and Kuo initialisation,
40 dimensions).
- Parallel execution across every core with a fixed reduction order,
`SetNumCPU` to pin the worker count, and pooled scratch buffers
whose borrow path zeroes the window.
- The reproducible `Generator`: xoshiro256++ seeded through
splitmix64, stable across Go releases, with uniform, normal and
truncated-normal draws, shuffles and permutations; `Splitmix64` and
`Substream` are exported for callers who seed their own streams.
The distribution draws of the `stats` package take the same
generator, so a seeded program replays exactly.
**Linear algebra.**
- Dense factorisations and solves: LU (`Solve`, `Inv`, `Det`), QR
beside `RRQR`, the rank-revealing column-pivoted factorisation with
`RRQRRank` and `SolveRRQR`, whose rank-deficient path answers the
minimum-norm solution, Cholesky with rank-one update and downdate,
`LeastSquares`, the tridiagonal and cyclic-tridiagonal solvers,
`Pinverse`, `MatrixRank`, `Cond`.
- Eigenproblems in the symmetric, Hermitian-complex, general and
generalised forms; `SVD` and `SVDComplex` in real and complex
arithmetic; `SchurComplex`; the matrix functions `MatrixExp`,
`MatrixSqrt` and `MatrixLog`.
- Regularised and truncated solves for ill-posed systems:
`SolveTruncated` (rank truncation of the singular spectrum) and
`SolveTikhonov` (Tikhonov damping through the SVD).
- Sparse direct factorisations: `CSCFromCOO` and the `SparseCSC` view
with `ToCSR`/`ToCSC` conversions, `NewSparseCholesky`, the sparse
Cholesky with the elimination tree, the natural, reverse
Cuthill-McKee and minimum-degree orderings and the rank-one
`Update` and `Downdate`, and `NewSparseLU`, the Gilbert-Peierls
left-looking elimination with partial pivoting. One factorisation
solves any number of right-hand sides.
- Sparse iterative methods on the CSR view: `SpSolve` (conjugate
gradient), `SpSolveBiCGSTAB`, `SpLSQR` and `SpLSMR` for
overdetermined systems, the ILU(0) preconditioner, the Lanczos
eigensolver `SpEigen` with its general Arnoldi form, and
`SpExpApply`, the Krylov action of a matrix exponential. The
complex side mirrors it for Hermitian positive-definite and general
non-Hermitian operators, the shape Helmholtz and electromagnetics
problems need.
- Polynomial fitting, roots through the companion matrix, and the
fluent `Pipeline` chain over the element-wise surface.
**Signal and transforms.**
- Fourier transforms of any length: `FFT`/`IFFT`, `FFT2`, `FFT3`,
`FFTN`/`IFFTN`, the real-input `RFFT`/`IRFFT` pair and `FFTFreq`.
- Cosine and sine transforms (orthonormal types I to IV), the
type-1 non-uniform FFT by Gaussian gridding, and the short-time
Fourier transform with window choice.
- Spectral estimation: `WelchPSD`, `Spectrogram`, `LombScargle` for
unevenly sampled data, and the spectral Poisson solves in periodic,
Dirichlet and Neumann boundaries.
- Sample-rate conversion: `Decimate` behind a Kaiser anti-alias
filter, rational `Resample` and exact band-limited
`ResampleFourier`; the Hilbert `AnalyticSignal` and `Envelope`; and
`Chirp`, the linear frequency sweep synthesised from the
closed-form phase at each sample.
- Filter design: Butterworth, Chebyshev, inverse Chebyshev and
elliptic (Cauer) responses in low-pass, high-pass, band-pass and
band-stop forms with explicit ripple and attenuation budgets,
applied through `FilterApply` and, zero phase, through `Filtfilt`.
- Correlation and wavelets: FFT-based `Autocorrelate` and
`CrossCorrelate`, `PartialAutocorrelate`, the Haar `DWT`/`IDWT` and
the Daubechies families db2 to db8, and the analytic `CWT` (Morlet
and Mexican hat).
- Convolutions, pooling and windows: `Conv1D`/`Conv2D`/`Conv3D` with
groups and dilation, `ConvTranspose2D`, the max, average, adaptive
and global pooling families, the `MedianFilter` and `RankFilter`
families in one and two dimensions, the `SavitzkyGolay` smoother,
the `Gradient1D`/`Laplacian` stencils, and the public window
catalogue `WindowHann` through `WindowBox`, each in the symmetric
and the periodic convention.
- Time-series estimation: `KalmanFilter`, `ExtendedKalmanFilter` and
`UnscentedKalmanFilter` with the filtered states, covariance
history, innovations and the summed log likelihood;
`EstimateAR` through Yule-Walker over the Levinson recursion,
`EstimateARMA` through Hannan-Rissanen innovations, `SelectARMA`
over a lag grid by information criterion, and `ARMASpectrum` for
the theoretical one-sided spectrum.
**Differential equations and quadrature.**
- Initial value problems: `IntegrateODE` (adaptive Dormand-Prince
4(5)) with path and step recording, `IntegrateBDF2` and
`IntegrateBDFVar` (variable order 1 to 5, VODE-style step and order
adaptation) for stiff systems, `IntegrateROS4`, the L-stable
Rosenbrock-Wanner solver, `IntegrateBackwardEuler`, `IntegrateRK4`,
event detection with direction filters, `IntegrateDAE` for
semi-explicit index-1 differential-algebraic systems in mass-matrix
form, and the symplectic `IntegrateVerlet` beside `IntegrateYoshida4`
and `IntegrateMidpoint` for separable and general Hamiltonians.
- Boundary values: `IntegrateBoundary` by damped shooting with the
root finder of `optim`, and `SolveBoundaryCollocation` by
three-point Lobatto IIIA collocation on an adaptively refined mesh.
- Quadrature: adaptive Gauss-Legendre `IntegrateFunction`, fixed-node
`GaussLegendreNodes`, `IntegrateND`, globally adaptive cubature
over hyperrectangles, and `IntegrateFilon` for the oscillatory
integrals of a smooth amplitude against a cosine or sine carrier.
- Turnkey PDE evolution: the heat equation by Crank-Nicolson in one
dimension and Peaceman-Rachford ADI in two, the wave equation by
velocity Verlet in one dimension and an explicit central stencil in
two, advection by the monotone upwind and Koren-limited fluxes and
their advection-diffusion combination, CFL enforced everywhere.
- Finite elements: structured and arbitrary triangular meshes in two
dimensions and tetrahedral meshes in three, with
`SolvePoissonFEM2D` and `SolvePoissonFEM3D`, the piecewise-linear
Poisson assemblies through the sparse direct factorisation, with
Dirichlet lifting and natural Neumann boundaries.
**Statistics.**
- Distributions: CDFs, quantiles and matched random draws for the
normal, exponential, gamma, chi-square, Student t, F and their
noncentral forms, Poisson, binomial, negative binomial, Weibull,
lognormal, Pareto and Dirichlet laws, built on the incomplete gamma
and beta functions.
- Descriptives: mean-free moments, `Median`, `Quantile`, histograms
in one and two dimensions, the robust `MedianAbsoluteDeviation` and
`TrimmedMean`, and the rolling windows.
- Inference: `WelchTTest`, `KolmogorovSmirnovTest`, `MannWhitneyU`,
one-way `ANOVAOneWay`, `ChiSquareGoodnessOfFit`, `BootstrapCI`, the
rank correlations `SpearmanRho` and `KendallTau`, the
multiple-testing corrections `Bonferroni`, `Holm` and
`BenjaminiHochberg`, and the contingency table analyses
`FisherExactTest`, `ChiSquareIndependence`, `McNemarTest` and
`CramersV`.
- Models: `LinearRegression` with standard errors, t-tests, p-values,
R² and the model F-test, `WeightedLinearRegression`,
`LogisticRegression` and `PoissonRegression` on the exact
likelihood with Wald inference, `HuberRegression`,
`TheilSenRegression` and `QuantileRegression` for the robust and
distribution-free fits, lasso and elastic net over a documented
regularisation path, `PCA`, `KMeans` with k-means++ seeding,
`GaussianMixture` selected over a component grid by
`GaussianMixtureBIC`, Gaussian-process regression over
squared-exponential, Matern 3/2 and 5/2 and periodic kernels,
multivariate normal densities and draws, Gaussian `KernelDensity`,
`LinearMixedModel`, the Gaussian linear mixed model with grouped
random effects estimated by residual maximum likelihood, the
discrete hidden Markov model with its `Forward`, `Smooth` and
`Viterbi` recursions and its Baum-Welch fit, and
`HierarchicalClustering`, the agglomerative dendrogram with the
single, complete, average, centroid and Ward linkages and the
`Dendrogram` cuts into flat clusters.
**Optimisation.**
- Local: `Minimise` (Nelder-Mead simplex), `MinimiseLBFGS` with box
bounds and a projected-gradient convergence measure, and
`LevenbergMarquardt` with an optional analytic Jacobian. The
`LevenbergMarquardtFit` form reports χ², a named `FitStatus` and,
on request, the parameter covariance and per-residual weights
through `Sigma`, and the least squares and system solvers take
`ParallelJacobian`, an explicit opt-in that spreads the
finite-difference columns across workers with bit-identical
answers.
- Constrained: `MinimiseConstrained`, the augmented Lagrangian over
the box, so equality and inequality rows of `LinearConstraints`
compose with the walls, and `MinimiseNonlinearConstrained` for rows
that are arbitrary functions.
- Global: `MinimiseDifferentialEvolution` for multimodal,
derivative-free landscapes, `MinimiseCMAES` (the rank-one and
rank-mu update set, seeded through the generator) and
`MinimiseSimulatedAnnealing` (geometric cooling), all deterministic
under a seed and all honest about an exhausted budget.
- Programming: `MinimiseLinear` and `MinimiseLinearRows`, the revised
simplex with a two-phase start over standard-form and two-sided row
programs, and `MinimiseQP`, the active-set method for the strictly
convex program with the multipliers returned.
- Root finding: `FindRoot` (Brent), `FindRootBrent` for a scalar
bracketed root, `FindRootNewton` and `FindRootSystem` (damped
Newton with Armijo backtracking and an optional Broyden rank-one
update in place of repeated Jacobian builds). A solver that
exhausts its budget is refused with an error unless the
best-effort exit is requested by name.
**Automatic differentiation.**
- A reverse-mode graph over the arithmetic surface, the matrix
products (single and batched), the reductions, slicing,
concatenation, axis permutation and the Fourier transforms; every
float leaf accumulates through `Backward`.
- Complex tensors differentiate under the Wirtinger convention, the
loss stays real, and mixed real-complex graphs compose exactly
through the 2·Re narrowing.
- Second order: `Hessian` (forward-over-reverse) and
`HessianVectorProduct` in two gradient evaluations.
- On top of the graph: `MinimiseNewtonCG` (truncated-CG Newton with
an Armijo line search), `SampleHMC` (Hamiltonian Monte Carlo on any
differentiable unnormalised density) and `AdjointODE` (adjoint
sensitivities at the cost of one extra solve).
**Plotting.**
- The `plot` package: deterministic SVG line charts of computed
series. Linear axes with five ticks, one legend line per series, a
`Line` constructor straight from two rank-1 arrays through the
promotion ladder, and a byte-identical file on every run, so a
figure in a paper is compared exactly like any other computed
number.
**Distributed execution.**
- The experimental `spmd` package: explicit SPMD worlds, one program
on many ranks, over TCP between machines or in one process over
channels, launched, listened for and joined through `Launch`,
`Listen` and `Join`. The movement collectives `Broadcast`,
`Scatter`, `Gather` and `AllGather` move arrays between ranks; the
sharded reductions cut a global array on the canonical fold
partition's block boundaries and combine the partials through the
same balanced tree the single-array fold uses, so `Sum`, `Min`,
`Max`, `Any`, `All`, `Prod`, the norm and the dot families answer
the single-array reduction's exact bits at any world size, whatever
the order the frames arrive in; `Reduce` and `AllReduce` fold the
ranks' same-shaped arrays elementwise in rank index order.
`ExchangeHalos` and `ExchangeHalosOnGrid` hand each rank's boundary
slabs to the neighbours of a decomposition laid out on a row-major
process grid. Every failure or deadline fails the whole world
loudly, and no collective ever returns a partial numeric result.
**Data I/O.**
- CSV reading and writing, with or without a header row, every stored
numeric dtype written and read.
- FITS images with header cards in both directions, and binary and
ASCII table extensions.
- HDF5 in both directions: `LoadHDF5` reads the default and the
"latest" file formats (contiguous, compact and chunked storage, the
deflate, shuffle and fletcher32 filters, superblocks of versions 2
and 3 with the lookup3 checksum of each verified, group attributes
merged into each dataset), and `SaveHDF5` with `SaveHDF5Text`
writes every stored dtype at its native width, booleans through the
HDF5 enumeration convention, nested groups, attributes and optional
filters, byte-deterministic on every run. Unsupported format
features are refused by name, and cyclic or over-deep group walks
are refused.
- `LoadNetCDF`/`SaveNetCDF` for the NetCDF classic model (CDF-1 and
CDF-2), with named dimensions, text attributes and record
dimensions in both directions, and fixed-point variables landing at
their own width and sign.
- Memory mapping: `MapFloats`, `MapFloat32s` and `MapInts` open
native-endian files as read-only arrays without reading them, and
`SaveNativeFloats` writes the format they read.
**Examples.**
- Thirteen runnable workflows in `examples/`: ODE parameter fitting
by adjoint sensitivities, PSF deconvolution, HMC sampling, spectral
analysis, wavelet denoising, the exact pendulum period through
`EllipticK`, a Helmholtz system on the complex sparse solvers,
quasi-Monte Carlo integration, heat and wave evolution, regression
inference, a FITS star field, a NetCDF climate round trip and an
FFT tour.
**Project.**
- A determinism oracle pinning fixed workloads through the facade by
SHA-256 digest of the output bits, and a resource-leak harness
holding the goroutine count and live heap to baseline under
repeated heavy runs.
- Gitea Actions pipelines for test, race and release, with the
release notes extracted from this file's matching section.
- The document set: this changelog, the README, the API reference,
the architecture, the development guide, the benchmarking method,
the contribution rules and the security policy, under the MIT
licence.