All notable changes to PyChebyshev will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
ChebyshevTT.sobol_indices()— first-order and total-order Sobol sensitivity indices computed natively by contracting through the TT coefficient cores. O(d · n · r²) per dim, no dense materialization. Mirrors v0.20ChebyshevApproximation.sobol_indicesAPI; keys are user-frame dim indices regardless of internal_dim_order.
ChebyshevTT.roots()/minimize()/maximize()previously validatedfixedvalues against the storage-frame domain instead of the user-frame physical domain. Underwith_auto_order()orreorder()with non-uniform per-dim domains, this could raise misleading errors or accept invalid inputs. Now validates against user-frame domain.ChebyshevTT.inner_product()previously returned a meaningless Frobenius product whenself._dim_order != other._dim_order, with no error. Now raisesValueErrorwith areorder()alignment hint, matching v0.20.1 binary algebra behavior.ChebyshevTT.get_evaluation_points()previously returned columns in storage order, breakingeval(get_evaluation_points()[i])for any TT with non-identity_dim_order. Now returns columns in user-frame order.ChebyshevTT.eval_multi()previously mutatedself._dim_ordervia try/finally, racing under concurrent calls (issue #19). Now uses a private_eval_storage_framehelper with no mutation.ChebyshevTT.integrate()error messages on out-of-domain bounds previously referenced the storage-frame dim index instead of the user-frame index passed by the caller (issue #20). Now references the user-frame index._algebra._check_compatiblepreviously raised "Domain mismatch" when comparing two interpolants with mixedtuplevslistdomain syntax even when bounds were numerically identical (issue #22). Now usesnp.allclosefor comparison.
vectorized_eval_batchnow hoists the differentiation matrix matmul outside the per-point loop. Significant speedup for derivative batch evaluations on large point sets._calculus._optimize_1d(used by all four classes'minimize/maximize) now uses a single vectorized barycentric evaluation over critical points + endpoints instead of a Python list comprehension.
- Closes the v0.20+v0.20.1
_dim_ordercluster onChebyshevTT. All TT methods that readself.domain[d]orself.n_nodes[d]now consistently translate user-frame indices to storage-frame internally. - No breaking API changes: all "Fixed" items change wrong behavior to
correct behavior. The
inner_productstrict-mode raises on mismatched_dim_order(previously silently returned wrong numbers), which is a behavior change in the failure path only.
ChebyshevSlider.roots(dim, fixed)— find all roots alongdimwith other dims fixedChebyshevSlider.minimize(dim, fixed)— find global minimum alongdimChebyshevSlider.maximize(dim, fixed)— find global maximum alongdimChebyshevTT.roots(dim, fixed)— same, for ChebyshevTT (user-framedim, transparent under_dim_order)ChebyshevTT.minimize(dim, fixed)— same, for ChebyshevTTChebyshevTT.maximize(dim, fixed)— same, for ChebyshevTT
- Closes the calculus parity gap promised since v0.17. All four public
classes (
ChebyshevApproximation,ChebyshevSpline,ChebyshevSlider,ChebyshevTT) now support the full calculus surface:integrate,roots,minimize,maximize. - Implementation reuses the existing 1-D primitives in
_calculus.py(_roots_1d,_optimize_1d) — no new math. - Mirrors v0.9
ChebyshevApproximation/ChebyshevSplinesemantics: multi-D requiresfixed={d: v, ...}for all dims except target. - Under
ChebyshevTT.with_auto_order()/reorder()(v0.20+), the user-framedimandfixedkeys translate to storage frame transparently viaslice()andto_dense().
ChebyshevTT.eval_multi(),slice(),extrude(),to_dense(), partialintegrate(dims=...), and unary algebra (__neg__, scalar__mul__,__rmul__,__truediv__,__imul__,__itruediv__) now correctly thread_dim_orderthrough their implementations. The v0.20NotImplementedErrorguards on these methods are removed; users with TTs built viawith_auto_ordercan now use the full surface transparently.- Binary algebra (
__add__,__sub__,__iadd__,__isub__) now succeeds when both operands share the same_dim_order, with the result inheriting that order. Mismatched_dim_orderraisesValueError(instead of v0.20'sNotImplementedError) with a hint pointing atreorder().
ChebyshevTT.reorder(new_order, *, max_rank=None, tolerance=None)— realign storage to a target permutation via TT-swap (adjacent-axis SVDs in coefficient space). Functional API; returns a new TT. Acceptsmax_rank=andtolerance=overrides for swap-time SVD truncation. Used as the explicit alignment escape hatch for binary algebra between TTs of differentdim_order.- New private helper
_tt_swap_adjacent()in_algebra.py. compare_v0201_dim_threading.py— repo-root script demonstrating the full TT surface working under non-identitydim_order.
- New
tests/test_v0201_dim_threading.py(~40 tests). tests/test_v020_adaptive_refinement.py::TestDimOrderGuardsupdated: guard tests flipped from "raises NotImplementedError" to "now works".
ChebyshevSpline.auto_knots(f, num_dim, domain, ...)classmethod — auto-place knots at function kinks via curvature-spike scan. Heuristic; tunable viathreshold_factor,max_knots_per_dim,n_scan_points.sobol_indices()instance method onChebyshevApproximationandChebyshevSpline— returns first-order and total-order Sobol sensitivity indices computed directly from spectral coefficients (no Monte Carlo, no extra function evals).ChebyshevTT.with_auto_order(f, ...)classmethod — heuristic dimension reordering (greedy-swap or random) to minimize TT rank. Newdim_orderproperty; eval/save/load handle permutation transparently.__setstate__backfill for pre-v0.20 pickles.- Reference
.pcbreaders in Rust and Julia —readers/rust/(Cargo cratepcb_reader) andreaders/julia/(Pkg packagePCBReader). Both ship as standalone projects within this repo. They parse the v0.14.pcbformat spec and return interpolant data; evaluation is left to the consumer. - New private helper
_sensitivity.pywith_compute_sobol_from_coeffs(). - New
tests/fixtures/*.pcbfiles (generated byscripts/generate_test_fixtures.py) shared across Python/Rust/Julia test suites.
Beyond MoCaX: auto-knot detection, Sobol indices, and TT dim reordering are PyChebyshev-unique adaptive features. The cross-language readers deliver on the v0.14 portability promise.
ChebyshevTT.with_auto_order()produces a TT whose permuted_dim_orderis only threaded througheval()and fullintegrate(). Other methods —eval_multi(),slice(),extrude(),to_dense(), partialintegrate(),__add__/__sub__(when the two TTs have mismatched_dim_order) — raiseNotImplementedError(orValueErrorfor algebra mismatch) when called on awith_auto_orderresult with non-identity dim permutation. This avoids silent wrong-results bugs. Full threading planned for v0.20.1.ChebyshevApproximation._build_fixed_grid()now raisesValueErrorif the user-supplied function returns NaN or Inf at any grid point, preventing subsequent calls from silently using corrupttensor_values._compute_sobol_from_coeffs()now raisesValueErrorif the input coefficient tensor contains NaN or Inf.
n_workers=keyword-only constructor kwarg onChebyshevApproximationandChebyshevSplinefor parallel function evaluation at build time viaconcurrent.futures.ProcessPoolExecutor.None(default) = sequential,-1=os.cpu_count(), positive int = pool size. Function andadditional_datamust be picklable.verbose=2opt-in tqdm progress bars onChebyshevSpline.build(),ChebyshevSlider.build(), andChebyshevTT.build()(TT-Cross sweeps). Existingverbose=True/Falsebehavior unchanged.ChebyshevApproximation.plot_convergence(target_error=None, max_n=64, ax=None)— builds at increasing N, plots error decay on log-y axis with optional target line.plot_1d(ax=None, n_points=200, fixed=None),plot_2d_surface(...),plot_2d_contour(...)instance methods on all four classes. Usefixed=to constrain dimensions when the source has more dims than the plot needs.- New optional dependency group
pychebyshev[viz](matplotlib + tqdm). Plot methods raiseImportErrorwith install hint when used without the group; tqdm fallback emits a warning. - New private helpers:
_progress.py,_parallel.py,_viz.py.
Beyond MoCaX: MoCaX has neither parallel build nor visualization helpers.
ChebyshevTT.nodes(num_dim, domain, n_nodes)static — Chebyshev grid generation matchingChebyshevApproximation.nodes().ChebyshevTT.from_values(tensor_values, num_dim, domain, n_nodes, max_rank=None, tolerance=1e-6, ...)classmethod — build TT directly from a precomputed full tensor via TT-SVD compression, skipping TT-Cross.ChebyshevTT.extrude(params)— add a dimension where the function is constant. Inserts a rank-preserving constant core at the specified position.ChebyshevTT.slice(params)— fix a dimension at a value via barycentric contraction (with fast path when value coincides with a node). Same absorption pattern as v0.17 TT integrate.- TT algebra:
__add__,__sub__,__neg__,__mul__(scalar),__rmul__,__truediv__(scalar), plus__iadd__,__isub__,__imul__,__itruediv__. TT addition uses block-diagonal core stacking + TT-SVD rounding tomax(self.max_rank, other.max_rank)to prevent rank explosion. ChebyshevTT.to_dense()— materialize the TT chain into a full N-D tensor via einsum chain (after coefficient → value conversion).- New private helpers:
_extrude_tt_core,_slice_tt_corein_extrude_slice.py;_tt_add_cores,_tt_round_coresin_algebra.py;_tt_svd_from_tensorintensor_train.py.
After v0.18, ChebyshevTT has full surface parity with ChebyshevApproximation for non-calculus features. All additions are strictly additive — no breaking changes.
ChebyshevSlider.integrate(dims=None, bounds=None)— full and partial integration via the sliding-decomposition closed form. Returns a scalar on full integration; aChebyshevSliderover surviving dims on partial.ChebyshevTT.integrate(dims=None, bounds=None)— full and partial integration via Fejér-1 quadrature contraction into each integrated core's node axis. Returns a scalar on full integration; aChebyshevTTover surviving dims on partial. Works on TT objects built via Cross, SVD, and ALS methods.- New private helpers in
_calculus.py:_slider_partition_intersect(),_integrate_tt_along_dim(). - Extended user-guide page
docs/user-guide/calculus.mdwith v0.17 Slider/TT integration sections.
After v0.17, all four PyChebyshev classes support integration. Roots/min/max on Slider/TT remain deferred to v0.21.
Beyond MoCaX: MoCaX 4.3.1 has no integrate() API on any class.
clone()deep copy method on all four classes (ChebyshevApproximation,ChebyshevSpline,ChebyshevSlider,ChebyshevTT). Like save/load, the sourcefunctioncallable is not duplicated; clone hasfunction = None.- Instance getters:
get_max_derivative_order()(all four),get_error_threshold()(Approximation/Spline),get_special_points()(Approximation/Spline; Approximation now storesspecial_pointswith__setstate__backfill),get_evaluation_points()andget_num_evaluation_points()(all four; eval grid size semantics, matchinglen(get_evaluation_points()) == get_num_evaluation_points()). peek_format_version(filename)static onChebyshevApproximation— read.pcbmajor version without deserializing.is_dimensionality_allowed(num_dim)static on all four classes (returns True for any positive int; hook for future per-class capability caps).defer_build=Truekeyword-only ctor flag +set_original_function_values(values)instance mutator onChebyshevApproximationandChebyshevSpline— in-place deferred construction. Bit-identical to thefrom_values()factory. Spline path threadsadditional_datato pieces; atomic per-piece validation.- Optional typed helpers
Domain,Ns,SpecialPoints(frozen dataclasses) exported from the package; constructors of all four classes accept raw lists or these dataclasses. ChebyshevTTctor now acceptsmax_derivative_order: int = 2keyword-only kwarg;__setstate__backfill for backward-compat pickles.
All additions are strictly additive — no breaking changes.
additional_data=constructor kwarg onChebyshevApproximation,ChebyshevSpline,ChebyshevSlider, andChebyshevTT. Threads user-supplied context through everyf(point, data)call during build.set_descriptor(str)/get_descriptor()on all four classes for free-form text labels.get_derivative_id(orders)registry +eval(point, derivative_id=...)onChebyshevApproximation,ChebyshevSpline, andChebyshevSliderfor stable session-local integer IDs over derivative-orders tuples.is_construction_finished(),get_constructor_type(),get_used_ns()on all four classes for introspection.
ChebyshevApproximation.get_derivative_idwas previously a no-op stub returning the input list. It now returns a stable session-localintper registered orders tuple. Breaking for code relying on the prior identity behavior.
- Binary
.pcbsave raisesNotImplementedErrorifadditional_data is not None. Useformat='pickle'for full persistence. - Binary
.pcbdoes not storedescriptoror thederivative_idregistry; pickle does.
- Portable
.pcbbinary serialization format forChebyshevApproximationandChebyshevSpline. Closes the MoCaX cross-language serialization gap in PyChebyshev's specific way.- New
format=kwarg onsave()(default'pickle', opt in to'binary'). load()auto-detects via 4-byte magic headerb"PCB\x00". No behaviour change for existing pickle files.- C reference reader at
examples/binary_reader/(not in CI). - Format spec at
docs/user-guide/binary-format.md. - Stdlib
struct+ NumPy only — no new runtime dependencies.
- New
format='binary'requires flatn_nodesforChebyshevSpline. Splines built with nested per-piecen_nodesraiseNotImplementedErrorand fall back to pickle.ChebyshevSliderandChebyshevTTremain pickle-only in v0.14.
- Bump transitive dev dependency
requests2.32.5 → 2.33.0 (docs tooling only; no runtime impact on installed wheels).
ChebyshevTTnow supportsmethod='als'— rank-adaptive Alternating Least Squares build, alongside the existing'cross'and'svd'methods. Starts at rank 1 and increments by 1 per outer iteration until the relative grid-Frobenius residual‖T_als − T_grid‖_F / ‖T_grid‖_F < toleranceormax_rankis reached.ChebyshevTT.run_completion(tolerance, max_iter)— refines an already- built TT (from any method) at fixed rank via ALS sweeps. Sharpens a fast Cross build without rebuilding.ChebyshevTT.inner_product(other)— exact TT inner product via core-by-core contraction. Strict grid-compat validation.ChebyshevTT.orth_left(position)/orth_right(position)— in-place QR/LQ canonicalization sweeps. The represented tensor is unchanged.
Closes: MOCAX_CONSTRUCTOR_TT_ALS, MocaxTT.runCompletion,
MocaxTT.innerProduct, MocaxTT.orthLeft/orthRight.
special_pointskwarg onChebyshevApproximation.__init__— declare domain kinks directly at construction. Constructor dispatches transparently toChebyshevSplinewhen any dim is non-empty (precedent:pathlib.Path).- Per-sub-interval
n_nodesinChebyshevSpline— accept nestedList[List[int | None]]form wheren_nodes[d][i]is the node count for pieceialong dimensiond. compare_special_points.py— MoCaXMocaxSpecialPointsvalue-match benchmark at the repo root (local-only, not in CI). Values agree with MoCaX to ~6.7e-16 (machine epsilon) across 1D and 2D cases.- User guide:
docs/user-guide/special-points.md— motivation, API, worked examples (abs(x), barrier option payoff).
ChebyshevApproximation(f, d, dom, n_nodes, ..., special_points=[[...]])returns aChebyshevSplineinstance whenspecial_pointsdeclares any kink. This matches MoCaX parity and what was actually built.- Nested-form
n_nodesvalidation inChebyshevSplineis strict: all dims must be nested when any is; inner length must equallen(knots[d]) + 1.
Closes: core special_points kwarg; per-sub-interval Ns.
- Error-driven construction for
ChebyshevApproximationandChebyshevSpline. Constructors now accepterror_thresholdandmax_nkwargs, andn_nodesentries may beNone(signalling auto-N mode). The build-time doubling loop doubles the worst-contributing auto dim each iteration until the sup-norm error estimate falls below the target ormax_nis hit. ChebyshevApproximation.get_optimal_n1()classmethod — 1-D capacity estimator returning the smallest N that satisfieserror_thresholdover a 1-D domain.ChebyshevApproximation.get_error_threshold()— accessor returning the target threshold passed to__init__(orNoneif unset).ChebyshevSpline.error_threshold/max_nkwargs, applied per piece — pieces near kinks refine more than smooth pieces.ChebyshevSpline.knotsparameter is now optional; defaults to[[] for _ in range(num_dimensions)](single piece per dim).- Internal
_error_estimate_per_dim()helper onChebyshevApproximation— per-dim last-coefficient magnitudes used by the doubling loop. - Internal
_original_n_nodesattribute — preserves the user's originaln_nodes(includingNonesentinels) sobuild()can be called a second time with a tightened threshold to re-run the doubling loop. - Backward-compat
__setstate__shim populates_original_n_nodesfromn_nodeswhen loading pre-v0.11 pickles. - 30 new tests across
tests/test_error_threshold.py(27) andtests/test_barycentric.py(3,TestErrorEstimatePerDim). All run in CI. - New user-guide page: Error-Driven Construction with motivation, algorithm, Black-Scholes 5D example, and references.
compare_error_threshold.py— local MoCaX value-match benchmark (not in CI; imports gitignoredmocax_lib/).
ChebyshevApproximation.__init__signature:n_nodesis nowlist of (int or None), optional(was mandatorylist of int). Eithern_nodesorerror_thresholdmust be supplied.Noneentries inn_nodesrequireerror_thresholdto be set.ChebyshevSpline.__init__signature: same as above;knotsis now optional.ChebyshevApproximation.build()refactored into a public wrapper that dispatches to_build_fixed_grid(original behavior) or_build_with_threshold(new doubling loop). No behavior change for explicit-N builds.- In auto-N mode,
n_evaluationsandbuild_timenow accumulate across doubling iterations (not just the final iteration). ChebyshevSpline.total_build_evalshandles heterogeneous-N auto-N builds by summing per-piecen_evaluations.
- Corrected Good (1961) citation: journal is The Quarterly Journal of
Mathematics 12(1):61-68, not Quarterly Journal of Mechanics and Applied
Mathematics 14:195-196. Fixed in
_calculus.py,barycentric.py, andcalculus.md. - Fixed Trefethen book year from "SIAM 2019" to "SIAM 2013" in
concepts.mdandgreeks.md(2019 is the extended edition; all citations reference the 2013 first edition). - Fixed TT-Cross attribution in
tensor-train.md: now correctly cites both Oseledets & Tyrtyshnikov (2010) and Savostyanov & Oseledets (2011). - Added 30+ missing inline citations across 11 documentation pages, verified against original sources. Key additions: Runge (1901) for Runge's phenomenon, Berrut & Trefethen (2004) for barycentric formula and differentiation matrices, Trefethen (2013) chapter references for Lebesgue constant, Bernstein ellipse, spectral convergence of derivatives, and Chebyshev node generation.
- Added formal References sections to
concepts.md,spline.md,sliding.md, andtensor-train.md.
ChebyshevApproximation.nodes()static method to generate Chebyshev grid points without evaluating any function. Returns per-dimension node arrays, the full Cartesian product grid, and the expected tensor shape.ChebyshevApproximation.from_values()class method to construct a fully functional interpolant from pre-computed function values. Supports all operations: evaluation, derivatives, integration, rootfinding, optimization, algebra, extrusion/slicing, and serialization.ChebyshevSpline.nodes()static method returning per-piece node information for piecewise Chebyshev interpolation with knots.ChebyshevSpline.from_values()class method to construct a spline from per-piece pre-computed values.- Guard in
build()for both classes: raisesRuntimeErrorwith a clear message whenfunction=None(e.g., afterfrom_values(),load(), or algebra operations). - Input validation in
from_values(): shape mismatch, NaN/Inf detection, dimension consistency, and domain ordering. - 65 new tests covering core equivalence (bit-identical to
build()), edge cases (NaN/Inf, shape mismatch, domain validation, duplicate knots, boundary evaluation, 4D, algebra chains), and cross-compatibility. - Documentation page: "Pre-computed Values" with workflow, indexing convention, mathematical justification, API reference, and MoCaX Extend comparison.
- Sub-interval integration via
boundsparameter onintegrate()for bothChebyshevApproximationandChebyshevSpline. Uses generalized Fejér-1 quadrature with sub-interval Chebyshev moments computed from closed-form antiderivatives (Trefethen 2013, Ch. 19). - Spline sub-interval integration with automatic piece overlap clipping: pieces with no overlap are skipped, partial overlaps receive sub-interval bounds, fully contained pieces use standard Fejér-1 weights.
- 22 new tests for sub-interval integration (14 for ChebyshevApproximation, 8 for ChebyshevSpline), including polynomial exactness, scipy cross-validation, additivity, and error handling.
integrate()method onChebyshevApproximationandChebyshevSplinefor definite integration via Fejér-1 quadrature (Waldvogel 2006), with O(n log n) weight computation via DCT-III and O(n^d) multi-D contraction via BLAS.roots()method onChebyshevApproximationandChebyshevSplinefor finding all real roots along a dimension via companion matrix eigenvalues (numpy.polynomial.chebyshev.chebroots).minimize()/maximize()methods onChebyshevApproximationandChebyshevSplinefor global optimization via derivative rootfinding and endpoint evaluation.- Partial integration returns a lower-dimensional
ChebyshevApproximation(analogous toslice()). - Internal
_calculus.pymodule with shared helpers for Fejér-1 weights, 1-D rootfinding, and 1-D optimization. - New documentation page: Chebyshev Calculus (integration, roots, optimization).
- 52 new tests for calculus operations (test_calculus.py).
extrude()andslice()methods onChebyshevApproximation,ChebyshevSpline, andChebyshevSlider.- Extrusion adds new dimensions where the function is constant, enabling portfolio combination across different risk-factor sets.
- Slicing fixes a dimension at a value, reducing dimensionality via barycentric interpolation (with fast path at exact nodes).
- Extrude-then-slice round-trip preserves the original interpolant exactly.
- Internal
_extrude_slice.pymodule with shared validation and tensor manipulation helpers. - New documentation page: Extrusion & Slicing (mathematical proofs, API reference, portfolio use case).
compare_extrude_slice.py-- MoCaX comparison script (local only, not in CI).- 63 new tests for extrusion and slicing across all three classes.
- Arithmetic operators (
+,-,*,/, unary-,+=,-=,*=,/=) forChebyshevApproximation,ChebyshevSpline, andChebyshevSlider. - Portfolio-level combination of Chebyshev interpolants via weighted sums -- no re-evaluation needed.
- Derivatives and error estimates propagate correctly through algebraic operations.
- Internal
_algebra.pymodule with shared compatibility validation. _from_grid()factory onChebyshevApproximation,_from_pieces()onChebyshevSpline,_from_slides()onChebyshevSlider.
ChebyshevSplineclass for piecewise Chebyshev interpolation with user-specified knots (Section 3.8, Ruiz & Zeron 2021)- Knot-based domain partitioning: place knots at kinks or discontinuities to restore spectral convergence on each piece
eval(),eval_multi(),eval_batch()with automatic piece routing vianp.searchsorted- Analytical derivatives within each piece via spectral differentiation matrices (inherited from
ChebyshevApproximation) ValueErrorraised when requesting derivatives at knot boundaries (left/right derivatives differ)error_estimate()returning the maximum error across all disjoint piecessave()/load()serialization following the same pattern as other PyChebyshev classesnum_pieces,total_build_evals,build_timeproperties- New documentation page: Chebyshev Splines (mathematical justification, usage guide)
compare_spline.py— MoCaX spine comparison script (local only, not in CI)- ~34 new tests for spline construction, accuracy, derivatives, batch eval, serialization
ChebyshevTTclass for Chebyshev interpolation in Tensor Train format (Chapter 6, Ruiz & Zeron 2021)- TT-Cross approximation (
method='cross') for building from O(d * n * r^2) function evaluations instead of O(n^d) - TT-SVD build option (
method='svd') for validation and moderate-dimension problems eval()for single-point evaluation via TT inner product with Chebyshev polynomial contractioneval_batch()for vectorized batch evaluation of multiple points simultaneously via numpy einsumeval_multi()for finite-difference derivatives (1st and 2nd order, including cross-derivatives)error_estimate()for approximate error estimation from Chebyshev coefficient coressave()/load()serialization with version compatibility checks (same pattern as other classes)tt_ranksandcompression_ratioproperties for inspecting the TT decomposition_maxvol()module-level function implementing the maximum-volume row selection algorithm_tt_cross()module-level function implementing TT-Cross with alternating left-right sweeps and maxvol pivot selection
error_estimate()method onChebyshevApproximation— estimates supremum-norm interpolation error from Chebyshev expansion coefficients via DCT-II, without needing the true function (Ruiz & Zeron 2021, Section 3.4)error_estimate()method onChebyshevSlider— returns sum of per-slide error estimates_chebyshev_coefficients_1d()static method for computing Chebyshev expansion coefficients from values at Type I nodes- Error estimate shown in
__str__()output for both classes when built - New documentation page: Error Estimation (mathematical background, usage examples)
- 12 new tests for error estimation (8 for barycentric, 4 for slider)
compare_error_estimation.py— local benchmarking script comparing PyChebyshev vs MoCaX error estimates
fast_eval()— usevectorized_eval()instead, which is ~150x faster via BLAS GEMV[jit]optional dependency (Numba) — no longer needed since BLAS path outperforms JIT_jit.pymodule — will be removed in a future version
- README, docs, and CLAUDE.md updated to reflect BLAS GEMV as the primary fast path
- Removed Numba JIT installation instructions from all documentation
- Removed
numbafrom dev dependencies
save()andload()methods onChebyshevApproximationandChebyshevSliderfor persisting built interpolants to disk (pickle-based)__repr__and__str__methods on both classes for human-readable printing- Version compatibility check on load with warning for mismatched versions
- New documentation page: Saving & Loading Interpolants
- 21 new tests for serialization and printing
ChebyshevSliderclass for high-dimensional approximation via the Sliding Technique (Ch. 7, Ruiz & Zeron 2021)- Additive decomposition into low-dimensional slides around a pivot point
- Analytical derivatives per slide with correct cross-group mixed partial handling (returns 0)
- Documentation page for the Sliding Technique with usage examples and limitations
- 24 new tests for slider (additive, coupled, 5D, cross-group derivatives, validation)
- README updated: repositioned as a library (was standalone educational script)
- Getting Started section now uses
pip install pychebyshevwith code examples - Fixed repo URL in docs (
maxjingwezhang→0xC000005)
- README images now load on PyPI (use absolute GitHub URLs instead of relative paths)
ChebyshevApproximationclass for multi-dimensional Chebyshev tensor interpolation- Barycentric interpolation with full weight pre-computation
- Analytical derivatives via spectral differentiation matrices (1st and 2nd order)
vectorized_eval()using BLAS matrix-vector products (~0.065 ms/query)vectorized_eval_multi()with shared barycentric weights (~0.29 ms for price + 5 Greeks)fast_eval()with Numba JIT compilation (optional)- Node coincidence handling for all evaluation methods
- MkDocs + Material documentation with KaTeX math rendering
- pytest test suite (22 tests covering 3D/5D accuracy and method consistency)
- GitHub Actions CI/CD for testing and PyPI publishing