Changelog¶
All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
2.0.0¶
Added¶
lowess and fastLowess:
- Added
iterations_used: Option<usize>field toOnlineOutput<T>, reporting the number of robustness iterations performed whenUpdateMode::Fullis active. ReturnsSome(0)for the degenerate two-point linear fit andNonewhenUpdateMode::Incrementalis used. - Added
ParseErrors(Vec<LowessError>)variant toLowessError, which collects all string-parse failures that accumulate in the builder and reports them together whenbuild()is called. - Added
"take_first"and"take_last"as accepted string aliases forMergeStrategy::TakeFirstandMergeStrategy::TakeLast. - Added
"resmooth"as an accepted string alias forUpdateMode::Fulland"single"as an alias forUpdateMode::Incremental, aligning string-parse behaviour with theloess-rscrate. - Added
custom_weights(Vec<T>)builder method onLowessBuilder(Batch adapter only). Accepts a vector of non-negative per-observation weights that are multiplied into the distance and robustness weights before each local regression, allowing known-bad points to be suppressed (0.0) or high-quality measurements to be emphasised. - Centralized all
impl FromStrblocks for the seven option enums (WeightFunction,BoundaryPolicy,ScalingMethod,RobustnessMethod,ZeroWeightFallback,MergeStrategy,UpdateMode) directly inapi.rs, consolidating previously scattered implementations into a single source of truth. Parse and canonical-name helpers are exposed vialowess::internals::alias(requiresdevfeature), allowingfastLowess::binding_supportto delegate all string-to-enum parsing through that path. - Added module-level
defaults.rsfiles within each sub-module (math/,algorithms/,adapters/) to centralize default values close to the types they govern, propagating them from a single source of truth to ensure consistency across bindings and crates.
Python:
- Added
OnlineOutputclass to the Python binding.OnlineLowess.add_point()now returnsOnlineOutput | Noneinstead offloat | None, exposingsmoothed,std_error,residual,robustness_weight, anditerations_used. - Added
custom_weightsparameter to theLowess.fit(x, y, custom_weights=None)method. Accepts alist[float]of non-negative per-observation weights. Batch only. - Removed
smooth(),smooth_streaming(), andsmooth_online()convenience function stubs from_core.pyi.
R:
- Added
custom_weightsparameter toLowess$fit(). Accepts a numeric vector of non-negative per-observation weights. Batch only.
Julia:
- Added
custom_weightskeyword argument tofit(model, x, y; custom_weights). Accepts aVector{Float64}of non-negative per-observation weights. Batch only.
Node.js:
- Added
OnlineOutputobject to the Node.js binding.OnlineLowess.add_point()now returnsOnlineOutput | nullinstead ofnumber | null, exposingsmoothed,std_error,residual,robustness_weight, anditerations_used. - Added
return_seandcv_seedfields toSmoothOptions. - Added
customWeightsas an optional per-call argument tofit(x, y, customWeights?)andfit_async(x, y, customWeights?). Accepts aFloat64Arrayof non-negative per-observation weights. Includes pre-flight length-mismatch and non-negative validation. Batch only. - Added JavaScript-layer option key validation: unknown keys in
SmoothOptions,StreamingOptions, orOnlineOptionsnow throw aTypeErrorlisting all valid keys, via wrapper classes around the native NAPI exports.
WebAssembly:
- Added
custom_weightsfield toLowessOptions(passed in the options object tosmooth()). Accepts aFloat64Arrayof non-negative per-observation weights. Batch only.
C++:
- Added
custom_weightsfield toLowessOptionsand a second overload ofLowess::fit()that accepts aconst std::vector<double>& custom_weightsargument. Values must be non-negative and length must match the input data. Batch only.
Changed¶
Monorepo:
- Renamed all public API method and option names from camelCase to snake_case across every binding and all documentation. This is a breaking change for all consumers of the C++, Node.js, and WASM APIs.
- Converted all documentation tables to compact single-space format.
- Updated
.clang-tidyto configurelower_caseas the required naming convention for functions and member functions, matching the new snake_case public API. - Moved
BENCHMARKS.md,CHANGELOG.md, andCONTRIBUTING.mdfrom the repository root intodocs/and added them to the documentation site navigation. - Added a
[patch.crates-io]section to the rootCargo.tomlso all workspace bindings resolvefastLowessandlowessto the local workspace crates during development, replacing the previously-used registry (crates.io) versions. - Eliminated all local
parse_*functions that each binding previously duplicated independently. Option parsing and builder application now delegates tofastLowess::binding_support, ensuring consistent aliases, validation messages, and behaviour across every language frontend. - Replaced direct use of
KFold/LOOCVconstructor types in the cross-validation path withbinding_support::apply_cross_validation. - Split the Julia release CI workflow into two separate workflows:
release-julia-jll.yml(triggered on release, opens the Yggdrasil PR) andrelease-julia-register.yml(manual dispatch, triggers JuliaRegistrator once the JLL PR is merged). - Major documentation improvements.
lowess and fastLowess:
- Added
Lowess<T>,StreamingLowess<T>, andOnlineLowess<T>type aliases as the primary user-facing constructors (e.g.StreamingLowess::new().chunk_size(50).build()). Mode-specific builder methods (chunk_size,overlap,window_capacity,min_points,update_mode) are now called directly on the type alias rather than after.adapter(). - Made
BatchLowessBuilder,StreamingLowessBuilder, andOnlineLowessBuilderinternal-only: all public setter methods have been removed from these types. All smoothing configuration now flows throughLowessBuilder<T, Mode>(exposed via the type aliases above). This is a breaking change for any code that called setter methods on an adapter builder directly. - Changed all enum-typed builder methods to accept strings instead:
weight_function,robustness_method,scaling_method,boundary_policy,zero_weight_fallback,merge_strategy, andupdate_modenow takeimpl IntoEnum<T>(accepting both enum variants and strings such as.weight_function("tricube")) rather than requiring enum variants to be imported. This is a breaking change for any code passing enum variants directly. - Inlined the
IntoEnum<E>trait and its macro-generated impls for all enum-typed builder parameters directly intoapi.rs(lowess) andbinding_support.rs(fastLowess), eliminating a previously separateparsemodule. This allows builder methods to accept either a typed enum value (e.g..weight_function(WeightFunction::Tricube)) or a string (e.g..weight_function("tricube")) interchangeably. - Replaced the
cross_validate(CVConfig)builder method (which required importingKFoldorLOOCVtypes) with a string-based cross-validation API:.cv_method("kfold")/.cv_method("loocv"),.cv_k(n),.cv_fractions(vec![...]), and.cv_seed(n).KFoldandLOOCVare no longer exported from the prelude. This is a breaking change for any code using the oldcross_validateAPI. - Added a
binding_supportmodule providing shared helpers for all language binding frontends: string-to-enum parse functions (parse_weight_function,parse_robustness_method,parse_scaling_method,parse_boundary_policy,parse_zero_weight_fallback,parse_merge_strategy,parse_update_mode), matching canonical-string display functions,BuilderOptionSet/TypedBuilderOptionSetstructs, andapply_builder_options/apply_typed_builder_options/apply_cross_validationhelpers. This consolidates previously duplicated logic that was scattered across every binding into a single source of truth. - Renamed the internal
auto_convergencestruct field toauto_convergeonBatchLowessBuilder,OnlineLowessBuilder,StreamingLowessBuilder, and the executor config types, making the field name consistent with the existingauto_converge()setter method. This is a breaking change for any code that accessed these fields directly. - Changed
build()to wrap all accumulated string-parse errors in aLowessError::ParseErrors(Vec<LowessError>)value instead of surfacing only the first error. This is a breaking change for code that matched onLowessError::InvalidOptionas the error returned frombuild(). - Made the
IntoEnum<E>traitpub(crate)in bothlowessandfastLowess, restricting it to crate-internal use. Callers do not need to name this trait; builder methods continue to accept both enum variants and string literals unchanged. - Updated
widedependency to v1.5,wgputo v30.0, andpollsterto v1.0.
fastLowess:
Lowess,StreamingLowess, andOnlineLowessare now dedicated wrapper structs aroundLowessBuilder<f64>with string-accepting forwarding methods, rather than type aliases re-exported from the baselowesscrate. Each wrapper'sbuild()delegates to the corresponding parallel adapter and defaults to parallel execution. This is a breaking change: replace.adapter(Batch).build()with.build(),Lowess::new().adapter(Streaming)withStreamingLowess::new(), andLowess::new().adapter(Online)withOnlineLowess::new().- The
fastLowessprelude now exports only{Lowess, LowessError, LowessResult, OnlineLowess, StreamingLowess}, removingLowessBuilder,Adapter::{Batch, Online, Streaming}, andBackend::{CPU, GPU}. This is a breaking change for code that relied on those names being in scope viause fastLowess::prelude::*.
C++:
- Renamed all public member functions to snake_case:
make_error(),has_value(),r_squared(),effective_df(),residual_sd(),x_value(),y_value(),x_vector(),y_vector(),standard_errors(),confidence_lower(),confidence_upper(),prediction_lower(),prediction_upper(),robustness_weights(),fraction_used(),iterations_used(),process_chunk(),add_points(). - Replaced
Expected<LowessResult> OnlineLowess::add_points(const std::vector<double>&, const std::vector<double>&)withExpected<std::optional<double>> OnlineLowess::add_point(double x, double y). The method now processes a single point and returns only that point's smoothed value, orstd::nulloptif not enough points have been accumulated yet. The underlying C FFI symbol is renamed fromcpp_online_add_pointstocpp_online_add_point. This is a breaking change.
Node.js:
- Renamed all
Diagnostics,SmoothOptions,StreamingOptions, andOnlineOptionsinterface fields to snake_case (r_squared,effective_df,residual_sd,chunk_size,merge_strategy,window_capacity,min_points,update_mode, and all smoothing option fields). - Renamed binding methods to snake_case:
fit_async,process_chunk,add_points. - Renamed
LowessResultObjgetters to snake_case:standard_errors,confidence_lower,confidence_upper,prediction_lower,prediction_upper,robustness_weights,cv_scores,fraction_used,iterations_used. - Updated
index.d.tsto reflect all renamed fields and methods. - Replaced
add_points(x: Float64Array, y: Float64Array): LowessResultObjonOnlineLowesswithadd_point(x: number, y: number): OnlineOutput | null. The method now processes a single point and returns anOnlineOutputobject, ornullif not enough points have been accumulated yet. This is a breaking change. - Changed default
OnlineOptions.window_capacityfrom 100 to 1000 andOnlineOptions.min_pointsfrom 2 to 3, matching the defaults used by the loess binding. OnlineLowessnow forwards allSmoothOptionsfields to the underlying builder (previously onlyfraction,iterations, andparallelwere forwarded; all other fields were hardcoded toNone/false).- Updated
napi-rs/clidependency to v3.7 andoxlintto v1.73.
WASM:
- Renamed all JS-facing option keys to snake_case by removing
#[serde(rename = "camelCase")]attributes fromSmoothOptions,StreamingOptions, andOnlineOptions. JSON passed from JavaScript must now use snake_case keys. - Updated
Diagnosticsgetter names to snake_case:r_squared,effective_df,residual_sd. - Renamed the
update(x: number, y: number)method onOnlineLowesstoadd_point(x: number, y: number). This is a breaking change. - Updated
oxlintdependency to v1.73.
Python:
- Renamed the
update(x, y)method onOnlineLowesstoadd_point(x, y)and removed the separate array-basedadd_points(x, y)method.add_pointprocesses a single point and returns the smoothed value asfloat | None. This is a breaking change. - Updated
pyo3andnumpydependencies to v0.29.
R:
- Replaced
$add_points(x, y)(vector inputs returning a list result) onOnlineLowesswith$add_point(x, y)(scalar inputs returningnumericorNULL). The method now processes one point at a time and returnsNULLuntil enough points have been accumulated. This is a breaking change.
Julia:
- Replaced
add_points(online, x::Vector{Float64}, y::Vector{Float64}) :: LowessResultwithadd_point(online, x::Float64, y::Float64) :: Union{Float64, Nothing}. The function now processes a single point and returns the smoothed value, ornothingif not enough points have been accumulated yet. The underlying C FFI symbol is renamed fromjl_online_lowess_add_pointstojl_online_lowess_add_point. This is a breaking change.
Fixed¶
C++:
- Fixed remaining
yVector()call intestBasicSmoothSerialthat was missed during the snake_case rename (nowy_vector()).
1.3.0¶
Added¶
Monorepo:
- Added prerequisites for different bindings and platforms to
CONTRIBUTING.md - Updated
docs/assets/diagrams/lowess_smoothing_concept.svgto correctly illustrate LOWESS concepts (robustness iterations, bisquare re-weighting, outlier downweighting) instead of the generic LOESS algorithm it previously depicted. - Modified
docs/requirements.txtto update the versions of the documentation dependencies. - Improved CI tests and coverage.
- Modified Makefile to be truely cross-platform.
- Added sanitizer check for all bindings and crates.
lowess:
- Upgraded
wideto version 1.4.
fastLowess:
- Upgraded
rayonto version 1.12. - Upgraded
wgputo version 29.0.
C++:
- Added dedicated CMake packaging documentation in
bindings/cpp/CMAKE.mdfor Windows installation,find_package(fastlowess CONFIG REQUIRED), and build-tree package discovery.
R:
- Upgraded
rextendrscaffold to 0.5.0: bumpedConfig/rextendr/versioninDESCRIPTIONand updatedentrypoint.cto register the extendr panic hook (register_extendr_panic_hook()), so Rust panics now surface as R errors instead of crashing the session. - Added
dev/fix_rd_style.Rpost-processing script to automatically normalize Rd file indentation (to 4 spaces) and wrap long lines (> 80 characters), ensuring compliance with CRAN/pkgcheck stylistic notes. - Added
bindings/r/_pkgdown.ymlconfiguration and updated theMakefileto usepkgdown::build_site(), satisfying thepkgcheckrequirement for a dedicated documentation website. - Added automatic copying of shared tests from the project root into the R package within
dev/prepare_cran.sh, ensuringR CMD buildis self-contained. - Added direct
extendrwrapper coverage tests plus extra validation-path tests in the R package, liftingcovr::package_coverage()to 100% and clearing the package-levelpkgcheck/goodpracticecoverage complaints.
WASM:
- Upgraded
oxlintto 1.63.
Node.js:
- Upgraded
oxlintto 1.63. - Upgraded
napi-rs/clito 3.6.
Changed¶
lowess:
- Updated MSRV to 1.89 to access the significant improvements made in
widesince version 0.7.
fastLowess:
- Updated MSRV to 1.89 to access the significant improvements made in
widesince version 0.7.
R:
- Refactored the R binding validation helpers to reuse
validate_common_args()andcoerce_nullable()in production code, splitvalidate_params()into smaller helper validators, and consolidated duplicated constructor parameter documentation with@inheritParamsbefore regenerating the Rd files. - Updated MSRV to 1.89 to access the significant improvements made in
widesince version 0.7. - Abides by new rOpenSci standards.
Python:
- Updated MSRV to 1.89 to access the significant improvements made in
widesince version 0.7.
Node.js:
- Updated MSRV to 1.89 to access the significant improvements made in
widesince version 0.7.
Julia:
- Updated MSRV to 1.89 to access the significant improvements made in
widesince version 0.7.
WASM:
- Updated MSRV to 1.89 to access the significant improvements made in
widesince version 0.7.
C++:
- Removed the legacy snake_case compatibility layer; the public C++ method API now uses camelBack, while variables and constants follow lower_case.
- Updated MSRV to 1.89 to access the significant improvements made in
widesince version 0.7.
Fixed¶
Monorepo:
- Fixed R ASAN tests failing to compile vignettes by passing
--no-build-vignettestorcmdcheck. - Upgraded ASAN test environment to use modern
rocker/r-devel-san:latestimage andRDscriptto resolve outdatedreadelfwarnings. - Fixed
Makefileidempotency checks on Linux by providing a default/tmpfallback for theTEMPdirectory variable. - Fixed accidental root
Cargo.tomlworkspace isolation leaks by adding checked-inpre-commitandpre-pushgit hook guards that restoreCargo.toml.bakwhen present and fail loudly if required workspace members are still commented out. - Added a repo-local
.cargo/config.tomlthat setsCC=clang-clforx86_64-pc-windows-msvc, fixing Criterion 0.8 benchmark builds on Windows whencc-rswould otherwise pickclang.exeand fail to linkalloca.
R:
- Added strict pre-flight check for Pandoc in
make rwith a clear error message, as it is strictly required for building R Markdown vignettes on all platforms. - Fixed
make rfailure on Windows when the nativetar.exe(bsdtar) doesn't support GNU-specific reproducible build flags by adding an automatic fallback. - Fixed
FIND: Parameter format not correcterror on Windows by replacingfindcommands with cross-platformrm -fwildcard expansions to prevent clashing with Windows' nativefind.exe. - Fixed local compilation error by automatically installing required Python TOML dependencies (
tomli,tomli_w) in the Makefile's R build target. - Fixed
make rvignette build crash by adding the missingBiocStyleR dependency to the Makefile's automated installation step. - Replaced the deprecated
devtools::build_vignettes()command withpkgdown::build_articles()for local vignette previewing, and addedpkgdownto the development dependencies. - Fixed
cargo testandcargo buildfailing on Windows due to the default MSVC linker trying to link againstR.libby enforcing--target x86_64-pc-windows-gnufor all R-bound Cargo commands. - Fixed
R CMD checkWARNINGon Windows caused by R's ownBoolean.husing a C23 enum underlying type feature: the previous pragma-based suppression triggered a CRANNOTE. Fixed by pre-defining a standard CRbooleanenum and setting theR_EXT_BOOLEAN_H_header guard inentrypoint.cto prevent R's problematic version from loading. - Fixed
R CMD checkERRORin the testing phase:test_check()always resolves tests fromtests/testthat/inside the package and ignores custom path arguments. Fixed by updatingdev/prepare_cran.shto copy shared tests fromtests/r/testthat/intobindings/r/tests/testthat/beforeR CMD build, and simplifyingtestthat.Rto a standardtest_check("rfastlowess")call. - Fixed missing R packages (
devtools,remotes) in the Makefile's dependency installation step. - Fixed
%1 is not a valid Win32 applicationandsection below image baseDLL linkage errors on Windows by adding-Wl,--strip-alltoMakevars.winPKG_LIBS. - Fixed rOpenSci
pkgcheckwarning by adding documentation website URL toDESCRIPTION. - Fixed CRAN note regarding non-API call
R_NamespaceRegistryby upgradingextendr-apidependency to0.9.0. - Fixed compilation error by providing the
Resultalias that was removed fromextendr_api::preludein0.9.0. - Fixed the remaining SRR/pkgcheck findings in the R package by removing dead internal helper paths, reducing
validate_params()cyclomatic complexity, eliminating duplicated roxygen parameter blocks, and covering the generatedextendr-wrappers.Rdispatch paths.
Python:
- Fixed
make pythonfailing whenruffis not installed globally by bootstrappingruffinside the Python virtual environment before formatting and linting. - Fixed
make pythonon Windows by selecting the correct virtual environment activation script (.venv/Scripts/activateinstead of the Unix-only.venv/bin/activate). - Fixed the Python public API to actually accept documented array-like inputs by coercing
Lowess.fit(),StreamingLowess.process_chunk(), andOnlineLowess.add_points()arguments vianp.asarray(..., dtype=np.float64)before calling the native extension. - Fixed Python wrapper analyzer issues by switching native extension lookups to runtime imports, avoiding wrapper class name shadowing in
TYPE_CHECKING, and adding explicit wrapper docstrings. - Fixed false-positive Pylint warnings in
bindings/python/python/fastlowess/_core.pyiby marking stub-only ellipsis bodies and signature arguments as intentional.
C++:
- Fixed
cbindgenidempotency check failure by adding automatic installation of thecbindgenCLI tool if missing. - Fixed explicit pointer checks, braces, named constants, and value-semantic result ownerships with compatibility wrappers.
- Fixed all clang-tidy findings.
- Fixed regenerated
fastlowess.hclang-tidy regressions by normalizing the auto-generated header during the C++ bindings build, so FFI parameter naming and unused generated includes no longer come back after regeneration. - Fixed
make cppon Windows by making C++ symbol-export verification, CMake test execution, DLL runtime resolution, and Unix-specific test steps platform-aware. - Fixed MSVC
size_ttounsigned longnarrowing warnings in the C++ wrapper at the FFI boundary with explicit conversions. - Fixed C++ CMake package integration by generating and installing
fastlowessConfig.cmakeand related package export files for downstreamfind_packageuse.
fastLowess:
- Fixed GPU execution under
wgpu29 by updating instance and pipeline layout setup, separating shader-written indirect dispatch data from the actual indirect dispatch buffer, stabilizing GPU buffer downloads, and correcting batched cross-validation dispatch offsets so the GPU integration test suite passes again.
Julia:
- Fixed Windows local Julia runs by exporting an absolute
FASTLOWESS_LIBpath from theMakefileand moving DLL discovery inFastLOWESS.jlto runtime (__init__()plus runtimeccall), preventing stale precompiled library paths from being reused. - Linted the source code.
WASM:
- Fixed deprecated JavaScript license-audit warnings by replacing the transient
npx license-checkerusage in theMakefilewith a repo-local Node.js license summary script that still fails on GPL-family licenses. - Linted the source code.
Node.js:
- Fixed
make nodejson Windows when/bin/bashcould not launchnpmfromC:/Program Files/nodejsby usingnpm.cmd/npx.cmdin theMakefile. - Fixed deprecated JavaScript license-audit warnings by replacing the transient
npx license-checkerusage in theMakefilewith a repo-local Node.js license summary script that still fails on GPL-family licenses. - Fixed
.build()errors incorrectly usingStatus::GenericFailure; they now returnStatus::InvalidArgsince build failures originate from invalid configuration (accumulated parse errors), not from runtime execution. - Linted the source code.
1.2.0¶
Added¶
R:
- Added new tests.
- Added a reference to the
CONTRIBUTING.mdfile. - Added new examples for the
printandplotmethods. - Added test coverage evaluation.
- Added missing srr tags.
Node.js:
- Added advanced License Compliance check.
- Added advanced dependency check.
- Added advanced outdated dependency check.
- Added advanced lock file check.
- Added advanced TypeScript check.
WASM:
- Added advanced License Compliance check.
- Added advanced dependency check.
- Added advanced outdated dependency check.
- Added advanced lock file check.
- Added WASM size check.
Changed¶
fastLowess:
- Updated
wgputo v27.0 from v26.0.
Python:
- Updated
pyo3to v0.28 from v0.27. - Updated
numpyto v0.28 from v0.27.
R:
- Removed the
coerce_paramsdead code. - Spread srr tags to different files and removed extra tags from
srr-stats-standards.R.
Node.js:
- Switched from
eslinttooxlintto remove vulnerabilities.
WASM:
- Switched from
eslinttooxlintto remove vulnerabilities.
Fixed¶
Monorepo:
- Fixed project logo.
lowess:
- Fixed documentation.
- Fixed SRR tags.
Julia:
- Linted examples.
Node.js:
- Fixed vulnerabilities.
WASM:
- Fixed vulnerabilities.
- Fixed license.
C++:
- Fixed memory leak in
OnlineLowess.
1.1.2¶
Added¶
fastLowess:
- Added srr tags
1.1.1¶
Added¶
lowess:
- Added srr tags
Fixed¶
fastLowess:
- Fixed memory layout mismatch in the
GpuConfigstruct - Refactored the
GpuExecutorinitialization in both the engine (gpu.rs) and tests (gpu_tests.rs) to handle missing hardware/drivers gracefully. - Improved the global executor lock handling to automatically recover from "poisoned" states. This prevents a single test crash from disabling the entire GPU backend for the remainder of the session.
1.1.0¶
Added¶
lowess:
- Added
Meanscaling method (Mean Absolute Deviation) - Added hooks for custom fitting backends
- Added hooks for delegating boundary handling to the executor
fastLowess:
- Added
Meanscaling method (Mean Absolute Deviation) - Added support for different kernels to the GPU backend
- Added support for different robustness methods to the GPU backend
- Added support for different scaling methods to the GPU backend
- Added support for different zero weight fallbacks to the GPU backend
- Added support for different boundary policies to the GPU backend
- Added support for auto convergence to the GPU backend
- Added support for predictiona and confidence interval calculation to the GPU backend
- Added support for cross-validation to the GPU backend
Fixed¶
lowess:
FitPassFnnow returnsResultto allow error propagation from custom fitting backends (e.g. GPU).- Adapters (Batch, Streaming, Online) now propagate errors from the executor instead of assuming success.
- Fixed a bug where the
Extendboundary policy was never applied. - Implemented Coordinate Centering to preserve precision during accumulation.
fastLowess:
- Fixed potential integer overflow in GPU engine when dataset size exceeds
u32::MAX. - Fixed panic in GPU initialization by propagating errors to the caller.
- Fixed inefficient memory allocation in
fit_all_points_tiledby reusing scratch buffers across tiles. - Fixed resource exhaustion in GPU backend by using a global
Mutexfor the executor instead of thread-local storage.
1.0.0¶
Added¶
Julia:
- Added
meanscaling method (Mean Absolute Deviation)
C++:
- Added
meanscaling method (Mean Absolute Deviation)
R:
- Added
meanscaling method (Mean Absolute Deviation) - Implemented
printandplotmethods forLowessResultobjects - Added srr tags
Python:
- Added
meanscaling method (Mean Absolute Deviation)
Node.js:
- Added
meanscaling method (Mean Absolute Deviation) - Added JSDoc documentation to
lib.rsfor napi-rs generation - Added asynchronous support for batch processing
WASM:
- Added
meanscaling method (Mean Absolute Deviation) - Added an
init_panic_hookfunction insrc/lib.rsto be called by JS users during startup. - Added JSDoc documentation to
lib.rs - Refactored the verbose
Reflect::getboilerplate usingserdeandserde-wasm-bindgen. This allows us to define a Rust structSmoothOptionsand havewasm-bindgenautomatically unpack the JS object into it.
Changed¶
lowess:
- Refactored the constants to make the library robust safely against custom numeric types.
- Minor improvements to the documentation.
C++:
- Replaced exception-based error handling with a type-safe
Expected<T>result type for all core methods (fit,process_chunk,finalize,add_points). - Refactored the internal FFI layer to use the idiomatic Rust
Fromtrait for converting result types. - Updated all C++ examples and tests to use the new
Expectedpattern, aligning the library with modern C++ practices.
Julia:
- Wrapped all FFI functions in std::panic::catch_unwind. This ensures that if the Rust library panics (e.g., due to an internal assertion), it will be caught and reported as an error to Julia.
WASM:
- Updated
eslint/js,eslint,globals, andeslint-plugin-htmlpackages to their latest versions.
Node.js:
- Updated
eslint/js,eslint, andglobalspackages to their latest versions.
Python:
- Wrapped the heavy computation logic in
py.allow_threadsto allow Python to release the GIL during computation.
R:
- Return results as
LowessResultS3 objects instead of raw vectors
0.99.9¶
Changed¶
Monorepo:
- Bump rust version to 1.88 for better stability
- Change function-based builder pattern in the bindings to class-based builder pattern, allowing true streaming and online processing
- Improve API docs
Julia:
- Package is now registered on JuliaRegistries
C++:
- Library is now available on conda-forge (libfastlowess)
R:
- Package is now available on conda-forge (r-rfastlowess)
Node.js:
- Package is now available on npm (fastlowess)
WASM:
- Package is now available on npm (fastlowess-wasm)
0.99.8¶
Added¶
Julia:
- Initial implementation
Node.js:
- Initial implementation
WASM:
- Initial implementation
C++:
- Initial implementation
0.99.7¶
Changed¶
Python:
- Switch to Stable ABI for CPython
Fixed¶
Monorepo:
- Fix README file links
- Fix Makefile bug with R versioning
0.99.6¶
Fixed¶
Monorepo:
- Fix README file formats and links
0.99.5¶
Changed¶
Monorepo:
- Reduced package size significantly by removing unnecessary dev files and docs from the final package.
- Implemented comprehensive Cargo workspace inheritance pattern
- Unified MSRV to 1.85.0
- Centralized all metadata (version, authors, edition, license, etc.) in root
Cargo.toml - All crates now use
workspace = truefor shared configuration - Created unified
README.mdfor all crates/packages - Created unified
CHANGELOG.mdfor all crates/packages - Created unified
LICENSEfor all crates/packages - Created unified
.gitignorefor all crates/packages - Added comprehensive badges from all packages
Fixed¶
lowess:
- Fixed
StreamingAdapterindexing bug that caused merged overlap points to be skipped in output - Simplified
StreamingAdapterAPI: user now provides contiguous, non-overlapping chunks while the adapter handles internal buffering and merging - Standardized
OnlineLowessdefaultmin_pointsto 2 (enabling smoothing after just one point) - Sanitized residual output to avoid "negative zero" (
-0.0000) display for near-zero values
0.99.2¶
Changed¶
R:
- Prepared package for rOpenSci Software Peer Review
- Renamed main functions to avoid conflicts with base R:
smooth()→fastlowess()smooth_online()→fastlowess_online()smooth_streaming()→fastlowess_streaming()- Updated documentation to reflect new API and rOpenSci guidelines
Added¶
R:
- Documentation website using
pkgdownwith automated deployment - Comprehensive function documentation with examples and cross-references
- URL validation using
urlcheckerin CI workflow - Rigorous parameter validation for all exported functions
- Expanded test suite achieving >96% coverage
- Codecov CI workflow and badge
Fixed¶
R:
- Documentation URLs
- Package startup messages
pkgcheckworkflow to run on host runner
0.99.1¶
Changed¶
R:
- Modified package for Bioconductor submission
0.99.0¶
Added¶
R:
- Support for new features in
fastLowessv0.4.0, includingNoBoundaryboundary policy andMAD/MARscaling methods
Changed¶
R:
- Changed license from AGPL-3.0-or-later to dual MIT OR Apache-2.0
- Updated documentation
0.7.0¶
Added¶
lowess:
NoBoundaryvariant toBoundaryPolicyenum (original Cleveland behavior)ScalingMethodenum withMARandMADvariants for configurable robust scale estimation- SIMD-optimized weighted least squares accumulation for
f64andf32 WLSSolvertrait for type-specific SIMD dispatchCVBufferstruct for pre-allocated cross-validation scratch buffersVecExttrait for efficient vector reuse- Persistent scratch buffers to
OnlineBufferandStreamingBuffer
Changed¶
lowess:
- Changed license from AGPL-3.0-or-later to dual MIT OR Apache-2.0
- Refactored partition-related types
- Replaced
RangeInclusiveiterations withwhileloops for improved performance - Optimized
compute_window_weightsandmedian_inplace - Added boundary thresholds for numerical stability
- Unified scale estimation logic under
ScalingMethod - Refactored
LowessExecutorto accept optional external buffers - Optimized K-Fold Cross-Validation performance
0.6.0¶
Added¶
lowess:
cv_seedfield toCVConfigfor reproducible K-Fold cross-validationBackendenum (CPU,GPU) as placeholder for GPU acceleration- Development-only fields:
custom_fit_pass,custom_cv_pass,custom_interval_pass,backend,parallel from_configandto_configmethods toLowessExecutor
Changed¶
lowess:
- Refactored
cross_validateAPI to useCVConfigstruct - Refactored
Window::recenterto be bidirectional - Updated
preludeto export enum variants directly - Reorganized
src/engine/executor.rsinto unified logical flow - Hidden internal-only fields from public documentation
Fixed¶
lowess:
- Various broken documentation links
WeightParamsstruct to remove unused field- Bug in
BatchandStreamingadapter conversion logic
Removed¶
lowess:
- Unused
GLSModel::local_wlsmethod CVMethodandCrossValidationStrategyenums- Type exports from
preludethat caused ambiguity .cargo/config.toml
0.5.3¶
Changed¶
lowess:
- Consolidated validation logic into
src/engine/validator.rs - Optimized sorting, window operations, MAD computation, and regression
- Refactored robustness to use scratch buffers (allocation-free)
- Optimized interpolation and cross-validation
- Optimized delta interpolation with binary search
0.4.0¶
Added¶
fastLowess:
- Zero-allocation parallel fitting via
fit_all_points_parallel - Parallel CV memory reuse via
cv_pass_parallel - Refined delta optimization for tied x-values
- Parallel anchor precomputation for large datasets
- Cache-oblivious tile-based processing
Python:
- Support for new features in
fastLowessv0.4.0
R:
- Support for new features in
fastLowessv0.4.0
Changed¶
lowess:
- Transformed into core LOWESS implementation
- Removed
rayonandndarraydependencies - Improved performance from 4-16× to 4-29× faster than statsmodels
- Changed license from MIT to dual AGPL-3.0 and Commercial License
- Reduced LOC from 3863 to 3263
fastLowess:
- Changed license from AGPL-3.0-or-later to dual MIT OR Apache-2.0
- Updated
lowessdependency to v0.7.0 - Implemented thread-local
GpuExecutorpersistence - Added intelligent buffer capacity management for GPU
- Refactored GPU compute kernel with shared memory tiling
Python:
- Changed license from AGPL-3.0-or-later to dual MIT OR Apache-2.0
- Updated documentation
R:
- Changed license from AGPL-3.0-or-later to dual MIT OR Apache-2.0
- Updated documentation
Removed¶
lowess:
- Validation and comparison code
- Benchmarking code
- Convenience re-exports
0.3.0¶
Added¶
fastLowess:
cpu(default) andgpuCargo features- GPU execution engine in
src/engine/gpu.rs fit_pass_gpufunction for GPU-accelerated processingbackend()setter method to all builders- Tests for GPU engine and parallel execution consistency
R:
- Option to install from R-universe without Rust
Changed¶
lowess:
- Updated Rust version to 1.86.0
- Modified features: default std mode includes ndarray/std and rayon
- Improved documentation
fastLowess:
- Renamed builders:
Extended*LowessBuilder→Parallel*LowessBuilder - Migrated
parallelfield to corelowesscrate - Updated
lowessdependency to v0.6.0 - Made
ndarrayandrayonoptional dependencies
Python:
- Updated
fastLowessdependency to v0.3.0 - Refactored internal API usage
- Updated cross-validation parameter handling
R:
- Updated to
fastLowessv0.3.0 andlowessv0.6.0 - Updated cross-validation API
Fixed¶
lowess:
- no-std build now compiles successfully
Python:
- Documentation build errors
- Bug where
parallelargument was not exposed
R:
- Automated vendor checksum fixing for CI builds
Removed¶
fastLowess:
.cargo/config.toml- Type exports from
preludethat shadowed std types - Sequential, parallel, and ndarray adaptors
0.2.0¶
Added¶
Python:
- Support for new features in
fastLowessv0.2.0
R:
- Support for new features in
fastLowessv0.2.0
Changed¶
lowess:
- Restructured project to reduce intra-module dependencies
- Renamed "quartic" kernel to "biweight"
- Cross-validation now uses true k-fold validation
- Online LOWESS performs O(span) incremental updates
- Numerous performance optimizations and numerical stability improvements
fastLowess:
- Replaced linear scan with binary search in
compute_anchor_points - Eliminated per-iteration division in
interpolate_gap - Aligned with
lowesscrate v0.5.3 optimizations
Python:
- Updated documentation
- Changed module name from
fastLowesstofastlowess
R:
- Improved documentation
0.1.0¶
Added¶
lowess:
- Initial LOWESS implementation based on Cleveland (1979)
- Type-safe builder pattern API
- Support for
f32andf64types - Seven kernel weight functions
- Statistical features (standard errors, confidence/prediction intervals)
- Comprehensive diagnostics
- Cross-validation with multiple strategies
- Delta-based interpolation
- Streaming and online processing variants
- Optional
parallelandndarrayfeatures - Comprehensive error handling
- Extensive documentation
fastLowess:
- Initial release with parallel execution support
Python:
- Python binding for
fastLowess - Support for Python 3.14
R:
- R binding for
fastLowess