Skip to content

Merge Strategies

How overlapping chunk boundaries are reconciled in Streaming mode.

Streaming LOWESS processes data in fixed-size chunks with a configurable overlap. Points inside the overlap zone are fitted twice — once by the left chunk and once by the right chunk. The merge_strategy decides how those two estimates are combined into a single output value.

Chunk A: [=========|=====]
Chunk B: [=====|=========]
Overlap: [=====]
merge_strategy
applied here
Strategy Method Robustness Speed
"average" Simple mean of both estimates Low Fastest
"take_first" Left-chunk estimate only Low Fastest
"take_last" Right-chunk estimate only Low Fastest
"weighted_average" Distance-weighted mean High Moderate

Merge Strategies


Takes the arithmetic mean of the left-chunk and right-chunk estimates in the overlap region. Fast and sufficient when both chunks have similar smoothing quality.

Use when: Chunks are large and the overlap region has uniform data density.

const { StreamingLowess } = require('fastlowess-wasm');
const n = 100;
const xChunk = Float64Array.from({ length: n }, (_, i) => i * 2 * Math.PI / (n - 1));
const yChunk = Float64Array.from(xChunk, xi => Math.sin(xi) + 0.1);
const processor = new StreamingLowess(
{},
{ merge_strategy: "average", chunk_size: 5000, overlap: 500 }
);
const result = processor.process_chunk(xChunk, yChunk);
const final = processor.finalize();
console.log("y[0]:", final.y[0].toFixed(4));
y[0]: 0.3826

Keeps only the left-chunk estimate in the overlap zone and discards the right-chunk estimate. Produces a definitive, non-revised output as soon as the right boundary of each chunk is reached.

Use when: You need final output values immediately after each chunk (no look-ahead revision); left-chunk data quality is higher.

const { StreamingLowess } = require('fastlowess-wasm');
const stream = new StreamingLowess({}, { merge_strategy: 'take_first' });
console.log("typeof process_chunk:", typeof stream.process_chunk);
typeof process_chunk: function

Keeps only the right-chunk estimate in the overlap zone. The right chunk sees more of the surrounding data, so its fit can be more accurate near the left boundary of the new chunk.

Use when: Right-chunk context improves overlap quality; you are post-processing complete data rather than streaming live.

const { StreamingLowess } = require('fastlowess-wasm');
const stream = new StreamingLowess({}, { merge_strategy: 'take_last' });
console.log("typeof process_chunk:", typeof stream.process_chunk);
typeof process_chunk: function

Assigns each overlap point a weight proportional to its proximity to the centre of its respective chunk: points near the left-chunk centre get higher left weight; points near the right-chunk centre get higher right weight. This produces the smoothest transition across chunk boundaries.

$$\hat{y} = \frac{w_L \hat{y}_L + w_R \hat{y}_R}{w_L + w_R}$$

where $w_L$ and $w_R$ are linear distance weights from the chunk centres.

Use when: Minimising boundary artefacts is more important than speed; moderate overlap (10–20 % of chunk size).

const { StreamingLowess } = require('fastlowess-wasm');
const processor = new StreamingLowess(
{},
{ merge_strategy: "weighted_average", chunk_size: 5000, overlap: 500 }
);
console.log("typeof process_chunk:", typeof processor.process_chunk);
typeof process_chunk: function

Situation Recommended Strategy
General purpose "weighted_average"
Maximum throughput "average"
Immediate finalised output "take_first"
Post-processing, right context better "take_last"
Minimising boundary artefacts "weighted_average"