diff --git a/playground/acf_pacf.html b/playground/acf_pacf.html new file mode 100644 index 00000000..72e6232f --- /dev/null +++ b/playground/acf_pacf.html @@ -0,0 +1,393 @@ + + + + + + tsb — ACF / PACF / Portmanteau Tests + + + + +
+
+
Initializing playground…
+
+ + ← Back to roadmap +

ACF / PACF & Portmanteau Tests

+

+ Autocorrelation (acf), partial autocorrelation (pacf), + cross-correlation (ccf), Durbin-Watson, Ljung-Box, and Box-Pierce tests — + mirrors statsmodels.tsa.stattools and pd.Series.autocorr. +

+ +
+

1 — Single-lag autocorrelation (pandas-style)

+

+ autocorr(x, lag) computes the Pearson correlation between + x[0..n−lag−1] and x[lag..n−1], exactly like + pd.Series.autocorr(lag). +

+
+
+ JavaScript +
+ + +
+
+ +
Click ▶ Run to execute
+
Ctrl+Enter to run · Tab to indent
+
+
+ +
+

2 — Full ACF with Bartlett confidence intervals

+

+ acf(x, { nlags, alpha }) returns all autocorrelations at lags 0…nlags. + With alpha=0.05, Bartlett confidence intervals are returned: lags whose + CI excludes zero are statistically significant. +

+
+
+ JavaScript +
+ + +
+
+ +
Click ▶ Run to execute
+
Ctrl+Enter to run · Tab to indent
+
+
+ +
+

3 — Partial ACF (Levinson-Durbin)

+

+ pacf(x, { nlags, alpha }) uses the Levinson-Durbin recursion to compute + partial autocorrelations. For a true AR(p) process, only the first p PACF values are + significantly non-zero — this is how you identify the AR order. +

+
+
+ JavaScript +
+ + +
+
+ +
Click ▶ Run to execute
+
Ctrl+Enter to run · Tab to indent
+
+
+ +
+

4 — Cross-Correlation Function (CCF)

+

+ ccf(x, y, { nlags, alpha }) measures the linear relationship between + x[t] and y[t+k] at each lag k. Peaks in the CCF reveal + lead/lag relationships between two series. +

+
+
+ JavaScript +
+ + +
+
+ +
Click ▶ Run to execute
+
Ctrl+Enter to run · Tab to indent
+
+
+ +
+

5 — Durbin-Watson statistic

+

+ durbinWatson(residuals) tests for first-order autocorrelation in OLS residuals. + Values near 2 indicate no autocorrelation; values near 0 indicate positive autocorrelation; + values near 4 indicate negative autocorrelation. +

+
+
+ JavaScript +
+ + +
+
+ +
Click ▶ Run to execute
+
Ctrl+Enter to run · Tab to indent
+
+
+ +
+

6 — Ljung-Box & Box-Pierce portmanteau tests

+

+ ljungBox(x, { lags }) and boxPierce(x, { lags }) test the null + hypothesis that no autocorrelation exists up to a given lag. Small p-values reject the + white-noise hypothesis. Ljung-Box has better finite-sample properties. +

+
+
+ JavaScript +
+ + +
+
+ +
Click ▶ Run to execute
+
Ctrl+Enter to run · Tab to indent
+
+
+ + + + + + diff --git a/playground/arima.html b/playground/arima.html new file mode 100644 index 00000000..17b2fe6d --- /dev/null +++ b/playground/arima.html @@ -0,0 +1,406 @@ + + + + + + tsb — ARIMA + + + +
+
+

Loading tsb runtime…

+
+ + ← back to tsb playground +

ARIMA

+

+ ARIMA(p, d, q) time-series model — estimation, forecasting, and prediction intervals. + Mirrors statsmodels.tsa.arima.model.ARIMA. +

+ + +
+

1 — Fit an AR(1) model

+

+ new ARIMAModel({ p, d, q }) constructs the model; + .fit(y) estimates the parameters using the Hannan-Rissanen + two-step method and returns coefficients, sigma², AIC, and BIC. +

+
+
+ JavaScript +
+ + +
+
+ +
Click ▶ Run to execute
+
Ctrl+Enter to run · Tab to indent
+
+
+ + +
+

2 — Multi-step forecast with prediction intervals

+

+ model.forecast(steps) returns point forecasts and 95 % prediction + intervals computed via ψ-weight recursion. +

+
+
+ JavaScript +
+ + +
+
+ +
Click ▶ Run to execute
+
Ctrl+Enter to run · Tab to indent
+
+
+ + +
+

3 — ARMA(1,1) model

+

+ Combine AR and MA terms. ARMA(1,1): x_t = φ x_{t−1} + θ ε_{t−1} + ε_t. +

+
+
+ JavaScript +
+ + +
+
+ +
Click ▶ Run to execute
+
Ctrl+Enter to run · Tab to indent
+
+
+ + +
+

4 — ARIMA(1,1,0): integrated series

+

+ Set d=1 for I(1) series (random walk, stock prices, etc.). + The model differences the series before fitting. +

+
+
+ JavaScript +
+ + +
+
+ +
Click ▶ Run to execute
+
Ctrl+Enter to run · Tab to indent
+
+
+ + +
+

5 — fitArima convenience function

+

+ fitArima(y, opts) is a one-liner shorthand for constructing + and fitting an ARIMA model. +

+
+
+ JavaScript +
+ + +
+
+ +
Click ▶ Run to execute
+
Ctrl+Enter to run · Tab to indent
+
+
+ + + + diff --git a/playground/avro.html b/playground/avro.html new file mode 100644 index 00000000..e4e48cd6 --- /dev/null +++ b/playground/avro.html @@ -0,0 +1,347 @@ + + + + + + tsb — Apache Avro I/O + + + +
+
+

Loading tsb runtime…

+
+ + ← back to tsb playground +

Apache Avro I/O

+

+ Read and write Apache Avro Object Container Files (OCF) as DataFrames. + Mirrors pandas.read_avro(). Pure TypeScript, no external deps. +

+ + +
+

1 — Write and read back an Avro file

+

+ toAvro(df) serializes a DataFrame to an uncompressed Avro OCF buffer. + readAvro(buf) parses it back. +

+
+
+ JavaScript +
+ + +
+
+ +
Click ▶ Run to execute
+
Ctrl+Enter to run · Tab to indent
+
+
+ + +
+

2 — Nullable columns

+

+ Columns containing null are automatically serialized as + Avro unions (["null", type]) and decoded back with nulls + preserved. +

+
+
+ JavaScript +
+ + +
+
+ +
Click ▶ Run to execute
+
Ctrl+Enter to run · Tab to indent
+
+
+ + +
+

3 — Select specific columns with usecols

+

+ Pass usecols to read only a subset of columns, saving + memory and parse time. +

+
+
+ JavaScript +
+ + +
+
+ +
Click ▶ Run to execute
+
Ctrl+Enter to run · Tab to indent
+
+
+ + +
+

4 — Error handling

+

+ readAvro throws descriptive errors for bad magic bytes or + unsupported codecs (deflate, snappy). +

+
+
+ JavaScript +
+ + +
+
+ +
Click ▶ Run to execute
+
Ctrl+Enter to run · Tab to indent
+
+
+ + + + diff --git a/playground/dlm.html b/playground/dlm.html new file mode 100644 index 00000000..9f39cdaa --- /dev/null +++ b/playground/dlm.html @@ -0,0 +1,533 @@ + + + + + + tsb — Dynamic Linear Model (DLM) + + + + +← back to index + +

Dynamic Linear Model (DLM)

+

+ The DLM (West & Harrison state-space framework) generalises the Kalman filter to + named components — local level, linear trend, Fourier seasonality — that can be + freely combined. Fits observation and state noise by MLE. +

+ + +
+

1 · Model & data

+
+
+ + +
+
+ + +
+
+ +
+ + 1.0 +
+
+
+ +
+ + 0.30 +
+
+
+ +
+ + 60 +
+
+
+ +
+ + 10 +
+
+
+
+ + + + +
+
+ + +
+

2 · Filter / smoother / forecast

+
+
+
+
+ + +
+

3 · Code

+
// loading…
+
+ + + + + diff --git a/playground/ets.html b/playground/ets.html new file mode 100644 index 00000000..beacabbe --- /dev/null +++ b/playground/ets.html @@ -0,0 +1,550 @@ + + + + + + tsb — Exponential Smoothing (ETS / Holt-Winters) + + + +
+
+

Loading tsb runtime…

+
+ + ← back to tsb playground +

Exponential Smoothing (ETS / Holt-Winters)

+

+ Simple Exponential Smoothing, Holt linear trend, and full Holt-Winters seasonal models. + Mirrors statsmodels.tsa.holtwinters.ExponentialSmoothing. +

+ + +
+

1 — Simple Exponential Smoothing (SES)

+

+ SimpleExpSmoothing fits ETS(A,N,N): level-only smoothing with + parameter α. All h-step forecasts equal the final level. α is estimated by + minimising SSE via Nelder-Mead. +

+
+
+ JavaScript +
+ + +
+
+ +
Click ▶ Run to execute
+
Ctrl+Enter to run · Tab to indent
+
+
+ + +
+

2 — Holt's Linear Trend (Double Exponential Smoothing)

+

+ Holt extends SES with a trend component β (ETS(A,A,N)). + Optionally damps the trend with φ (ETS(A,Ad,N)) to prevent over-shooting. +

+
+
+ JavaScript +
+ + +
+
+ +
Click ▶ Run to execute
+
Ctrl+Enter to run · Tab to indent
+
+
+ + +
+

3 — Holt-Winters Additive Seasonal

+

+ ExponentialSmoothing with trend: "add" and + seasonal: "add" models data with a linear trend plus additive + seasonal fluctuations. Classic Holt-Winters ETS(A,A,A). +

+
+
+ JavaScript +
+ + +
+
+ +
Click ▶ Run to execute
+
Ctrl+Enter to run · Tab to indent
+
+
+ + +
+

4 — Holt-Winters Multiplicative Seasonal

+

+ Use seasonal: "mul" when the amplitude of seasonal swings + grows with the level (common in economic time series). ETS(A,A,M). +

+
+
+ JavaScript +
+ + +
+
+ +
Click ▶ Run to execute
+
Ctrl+Enter to run · Tab to indent
+
+
+ + +
+

5 — Forecast with prediction intervals

+

+ forecastWithCI(steps, alpha) returns point forecasts plus + (1 − α) % prediction intervals. Intervals widen with forecast horizon. +

+
+
+ JavaScript +
+ + +
+
+ +
Click ▶ Run to execute
+
Ctrl+Enter to run · Tab to indent
+
+
+ + +
+

6 — Model selection via AIC/BIC

+

+ Compare SES, Holt, and Holt-Winters using information criteria. Lower AIC/BIC + indicates a better balance of fit and parsimony. +

+
+
+ JavaScript +
+ + +
+
+ +
Click ▶ Run to execute
+
Ctrl+Enter to run · Tab to indent
+
+
+ + +
+

7 — Known initialisation and fixed parameters

+

+ You can supply fixed smoothing parameters or initial state values. + Use initializationMethod: "known" to set the initial state + directly without estimating it. +

+
+
+ JavaScript +
+ + +
+
+ +
Click ▶ Run to execute
+
Ctrl+Enter to run · Tab to indent
+
+
+ + + + diff --git a/playground/filters.html b/playground/filters.html new file mode 100644 index 00000000..0bfe91a8 --- /dev/null +++ b/playground/filters.html @@ -0,0 +1,534 @@ + + + + + + tsb — Digital Filters + + + + +
+
+
Initializing playground…
+
+ + ← Back to roadmap +

🎛️ Digital Filters — Interactive Playground

+

+ FIR and IIR filter design and application — mirrors scipy.signal.
+ Edit any code block below and press ▶ Run + (or Ctrl+Enter) to execute it live in your browser. +

+ + +
+

1. Low-pass FIR with firwin

+

Design a 51-tap Hamming-windowed low-pass FIR and check its DC and Nyquist gain.

+
+
+ TypeScript +
+ + +
+
+ + +
Click ▶ Run to execute
+
Ctrl+Enter to run · Tab to indent
+
+
+ + +
+

2. High-pass FIR

+

Pass high frequencies by setting pass_zero: false. DC gain should be near 0, Nyquist near 1.

+
+
+ TypeScript +
+ + +
+
+ + +
Click ▶ Run to execute
+
Ctrl+Enter to run · Tab to indent
+
+
+ + +
+

3. Apply FIR: lfilter vs filtfilt

+

lfilter is causal (has phase delay); filtfilt applies the filter twice for zero-phase output.

+
+
+ TypeScript +
+ + +
+
+ + +
Click ▶ Run to execute
+
Ctrl+Enter to run · Tab to indent
+
+
+ + +
+

4. Butterworth low-pass filter design

+

Design a 4th-order Butterworth IIR filter. butter returns both SOS form (numerically preferred) and ba form.

+
+
+ TypeScript +
+ + +
+
+ + +
Click ▶ Run to execute
+
Ctrl+Enter to run · Tab to indent
+
+
+ + +
+

5. Apply Butterworth: sosfilt vs sosfiltfilt

+

Filter a noisy 50 Hz signal to remove 300 Hz interference. Zero-phase output is closer to the clean reference.

+
+
+ TypeScript +
+ + +
+
+ + +
Click ▶ Run to execute
+
Ctrl+Enter to run · Tab to indent
+
+
+ + +
+

6. High-pass Butterworth

+

A 2nd-order Butterworth high-pass attenuates DC and passes high frequencies.

+
+
+ TypeScript +
+ + +
+
+ + +
Click ▶ Run to execute
+
Ctrl+Enter to run · Tab to indent
+
+
+ + +
+

7. Butterworth gain at cutoff — multiple orders

+

All Butterworth filters have exactly −3 dB gain at the cutoff frequency, regardless of order.

+
+
+ TypeScript +
+ + +
+
+ + +
Click ▶ Run to execute
+
Ctrl+Enter to run · Tab to indent
+
+
+ + +
+

API Reference

+ + + + + + + + + + +
FunctionDescriptionMirrors
firwin(n, cutoff, opts?)FIR design (windowed-sinc)scipy.signal.firwin
butter(N, Wn, type?)Butterworth IIR designscipy.signal.butter
freqz(b, a?, worN?)FIR/IIR frequency responsescipy.signal.freqz
sosfreqz(sos, worN?)SOS frequency responsescipy.signal.sosfreqz
lfilter(b, a, x)Causal FIR/IIR filterscipy.signal.lfilter
filtfilt(b, a, x)Zero-phase filterscipy.signal.filtfilt
sosfilt(sos, x)Causal SOS filterscipy.signal.sosfilt
sosfiltfilt(sos, x)Zero-phase SOS filterscipy.signal.sosfiltfilt
+
+ + + + + + + diff --git a/playground/hmm.html b/playground/hmm.html new file mode 100644 index 00000000..a2cdcc40 --- /dev/null +++ b/playground/hmm.html @@ -0,0 +1,333 @@ + + + + + + tsb — Hidden Markov Models + + + + +

Hidden Markov Models

+

+ tsb implements GaussianHMM and MultinomialHMM: + Hidden Markov Models with Baum-Welch EM parameter estimation and Viterbi decoding. + Mirrors the hmmlearn API. +

+ +

1 · Gaussian HMM — two hidden regimes

+

Generate a regime-switching time series (e.g. bull/bear market) and recover the hidden states.

+
+ +
+
+ +

2 · Multinomial HMM — discrete symbols

+

Fit a model to a discrete sequence (e.g. text symbols, DNA codons).

+
+ +
+
+ +

3 · Viterbi standalone

+

Given known parameters, decode the most-likely state sequence directly.

+
+ +
+
+ +

API Reference

+
import { GaussianHMM, MultinomialHMM, fitGaussianHMM, hmmViterbi } from "tsb";
+
+// Gaussian HMM
+const model = new GaussianHMM({ nComponents: 2, nIter: 100 });
+model.fit(observations);
+const states = model.predict(newObs);   // Viterbi
+const logP   = model.score(newObs);     // log P(obs | model)
+const proba  = model.predictProba(obs); // posterior P(z_t | obs)
+const sample = model.sample(100);       // { states, obs }
+
+// Multinomial HMM (integer symbols)
+const mmodel = new MultinomialHMM({ nComponents: 2, nFeatures: 4, nIter: 100 });
+mmodel.fit(integerObs);
+const mstates = mmodel.predict(integerObs);
+
+// Convenience: fit and return model
+const fitted = fitGaussianHMM(obs, 2);
+
+// Standalone Viterbi with known parameters
+const decoded = hmmViterbi(startProb, transmat, emissionProb, obs);
+
+ + + + diff --git a/playground/index.html b/playground/index.html index 02628c32..cb64c303 100644 --- a/playground/index.html +++ b/playground/index.html @@ -601,6 +601,56 @@

✅ Complete +
+

📡 Signal Processing — FFT, STFT, Welch PSD

+

FFT/IFFT/RFFT (Cooley-Tukey radix-2), fftFreq, fftshift/ifftshift, 8 window functions (getWindow), Short-Time Fourier Transform (stft/istft with overlap-add), Welch power spectral density, and periodogram. Mirrors numpy.fft and scipy.signal.

+
✅ Complete
+
+
+

🎛️ Digital Filters — FIR, Butterworth IIR

+

FIR filter design via windowed-sinc (firwin), Butterworth IIR (butter), frequency response (freqz, sosfreqz), and filter application: lfilter (causal), filtfilt (zero-phase), sosfilt, sosfiltfilt. Mirrors scipy.signal.

+
✅ Complete
+
+
+

🗂️ ORC Format I/O — readOrc / toOrc

+

Apache ORC (Optimized Row Columnar) file format reader and writer. Supports BOOLEAN, INT/LONG, FLOAT/DOUBLE, STRING columns with NONE compression and RLE v1 / direct encoding. Mirrors pandas.read_orc() and DataFrame.to_orc().

+
✅ Complete
+
+
+

📈 ACF / PACF & Portmanteau Tests

+

autocorr, acf (Bartlett CI), pacf (Levinson-Durbin), ccf, durbinWatson, Ljung-Box and Box-Pierce portmanteau tests. Mirrors statsmodels.tsa.stattools and pd.Series.autocorr.

+
✅ Complete
+
+
+

📉 ARIMA(p,d,q) Time-Series Models

+

ARIMAModel and fitArima — Hannan-Rissanen two-step estimation, multi-step forecasting, prediction intervals, AIC/BIC. Mirrors statsmodels.tsa.arima.model.ARIMA.

+
✅ Complete
+
+
+

🔭 Kalman Filter & RTS Smoother

+

KalmanFilter — linear Gaussian state-space models with forward Kalman filter and backward RTS smoother. Factory helpers localLevel, localLinearTrend. Missing observations handled transparently.

+
✅ Complete
+
+
+

📦 Apache Avro OCF I/O — readAvro / toAvro

+

readAvro and toAvro — Apache Avro Object Container File reader and writer. Supports all Avro primitives, arrays, maps, unions, and records. Zigzag varint encoding. Mirrors pandas.read_avro().

+
✅ Complete
+
+
+

📊 Exponential Smoothing — ETS / Holt-Winters

+

SimpleExpSmoothing, Holt, and ExponentialSmoothing — SES, Holt linear trend, and full Holt-Winters with additive/multiplicative seasonal components. Nelder-Mead parameter optimisation, AIC/BIC/AICc, prediction intervals. Mirrors statsmodels.tsa.holtwinters.ExponentialSmoothing.

+
✅ Complete
+
+
+

🔲 Dynamic Linear Model (DLM)

+

DLM — West & Harrison state-space framework. Local-level, local-linear-trend, polynomial trend, Fourier seasonal components, free combination via combineDLMs. Kalman filter, RTS smoother, h-step forecasting, MLE fitting, discount-factor model. Mirrors the R dlm package.

+
✅ Complete
+
+
+

🔮 Hidden Markov Model (HMM)

+

GaussianHMM, MultinomialHMM — Baum-Welch EM parameter estimation, Viterbi decoding, forward-backward log-space algorithm. Regime detection, sequence labeling. Mirrors hmmlearn.

+
✅ Complete
+
diff --git a/playground/kalman.html b/playground/kalman.html new file mode 100644 index 00000000..b89ce40e --- /dev/null +++ b/playground/kalman.html @@ -0,0 +1,476 @@ + + + + + + tsb — Kalman Filter & State-Space Models + + + + +
+
+

Loading tsb…

+
+ +← Back to index +

🔭 Kalman Filter & State-Space Models

+

+ Linear Gaussian state-space model — Kalman filter (forward pass) and + RTS smoother (backward pass). Mirrors statsmodels.tsa.statespace + and pykalman.KalmanFilter. +

+ + +
+

📐 The State-Space Model

+

+ A linear Gaussian SSM describes a latent state x_t and + observations y_t via two equations: +

+
+ x_t = F · x_{t-1} + w_t, w_t ~ N(0, Q) (state transition)
+ y_t = H · x_t + v_t, v_t ~ N(0, R) (observation)
+ x_0 ~ N(m_0, P_0) +
+
    +
  • F — state transition matrix (n_states × n_states)
  • +
  • H — observation matrix (n_obs × n_states)
  • +
  • Q — process noise covariance
  • +
  • R — observation noise covariance
  • +
  • m_0, P_0 — initial state distribution
  • +
+

+ The Kalman filter computes filtered state + estimates x_{t|t} (posterior after seeing observation t). + The RTS smoother computes smoothed estimates + x_{t|T} using all T observations. +

+
+ + +
+

📈 Local-Level Model (Random Walk + Noise)

+

+ The simplest SSM: a hidden state that follows a random walk, observed + with noise. Perfect for denoising a noisy scalar time series or + estimating a slowly changing mean. +

+
+
+ example-1.ts +
+ + +
+
+ +
Click ▶ Run to execute
+
+
+ + +
+

🔄 RTS Smoother — Filling Gaps Retrospectively

+

+ The filter only uses observations up to time t. The smoother uses + all observations to produce better estimates, especially for + time-steps near missing values. Smoothed uncertainty is always ≤ filtered. +

+
+
+ example-2.ts +
+ + +
+
+ +
Click ▶ Run to execute
+
+
+ + +
+

📊 Local Linear Trend (Level + Slope)

+

+ A 2-state model: [level, slope]. The level increases by the + slope each step; both drift over time. Great for tracking slowly changing + trends with missing observations. +

+
+
+ example-3.ts +
+ + +
+
+ +
Click ▶ Run to execute
+
+
+ + +
+

⚙️ Custom State-Space Model (AR(1) State)

+

+ Build your own model by specifying the four matrices directly. + Here: a state that follows an AR(1) process with coefficient 0.9. +

+
+
+ example-4.ts +
+ + +
+
+ +
Click ▶ Run to execute
+
+
+ + +
+

🔢 Multi-Dimensional Observations

+

+ The Kalman filter naturally handles multi-dimensional observations. + Here: 2 sensors observing a single latent state. +

+
+
+ example-5.ts +
+ + +
+
+ +
Click ▶ Run to execute
+
+
+ + +
+

📖 API Reference

+
    +
  • KalmanFilter.localLevel(opts?) — random-walk + noise (1-D)
  • +
  • KalmanFilter.localLinearTrend(opts?) — level + slope (2-D state)
  • +
  • new KalmanFilter(opts) — custom F, H, Q, R, m0, P0
  • +
  • kf.filter(observations)KalmanFilterResult
  • +
  • kf.smooth(observations)KalmanSmootherResult
  • +
  • kalmanFilter1D(obs, opts?) — scalar convenience wrapper
  • +
  • kalmanSmooth1D(obs, opts?) — scalar smoother wrapper
  • +
  • extractScalarMeans(means) — extract 1-D means array
  • +
  • filteredPredictionInterval(result, z?){lower, upper}
  • +
+

+ Missing observations: pass null in any observation row. The + filter skips the update step for that time-step (covariance grows). + The smoother retroactively interpolates using future observations. +

+
+ + + + diff --git a/playground/orc.html b/playground/orc.html new file mode 100644 index 00000000..494d18e7 --- /dev/null +++ b/playground/orc.html @@ -0,0 +1,207 @@ + + + + + + tsb · ORC Format I/O + + + +

← tsb playground

+

ORC Format I/O

+

+ pandas.read_orc + DataFrame.to_orc +

+

+ Apache ORC (Optimized Row Columnar) is a self-describing, type-aware columnar file format designed + for large-scale analytical workloads. tsb supports reading and writing ORC files with + NONE compression using RLE v1 integer encoding, direct float/double, and direct string encoding. +

+ +
+ ℹ️ This playground runs entirely in-browser via a bundled tsb build. ORC buffers are created + in-memory — no file system access is required. +
+ +

1 — Write & read a DataFrame

+

Create a DataFrame, serialize it to ORC bytes, then parse it back:

+
import { DataFrame, readOrc, toOrc } from "tsb";
+
+const df = DataFrame.fromColumns({
+  id:     [1, 2, 3, 4, 5],
+  name:   ["Alice", "Bob", "Carol", "Dave", "Eve"],
+  score:  [95.5, 87.0, 92.3, 78.1, 99.9],
+  passed: [true, false, true, false, true],
+});
+
+// Serialize to binary ORC
+const buf = toOrc(df);
+console.log("ORC buffer size:", buf.length, "bytes");
+
+// Parse back
+const df2 = readOrc(buf);
+console.log(df2.toString());
+ +
Click "Run" to execute…
+ +

2 — Nullable columns

+

ORC natively supports null values via PRESENT streams:

+
import { DataFrame, readOrc, toOrc } from "tsb";
+
+const df = DataFrame.fromColumns({
+  x:    [1, null, 3, null, 5],
+  name: ["a", null, "c", null, "e"],
+});
+
+const buf = toOrc(df);
+const rt = readOrc(buf);
+console.log("x values:", rt.col("x").values.join(", "));
+console.log("name values:", rt.col("name").values.join(", "));
+ +
Click "Run" to execute…
+ +

3 — Column selection

+

Use the columns option to read only a subset of columns:

+
import { DataFrame, readOrc, toOrc } from "tsb";
+
+const df = DataFrame.fromColumns({
+  a: [1, 2, 3],
+  b: ["x", "y", "z"],
+  c: [true, false, true],
+  d: [10.0, 20.0, 30.0],
+});
+
+const buf = toOrc(df);
+
+// Only read columns a and c
+const partial = readOrc(buf, { columns: ["a", "c"] });
+console.log("columns:", partial.columns.toArray().join(", "));
+console.log("a:", partial.col("a").values.join(", "));
+console.log("c:", partial.col("c").values.join(", "));
+ +
Click "Run" to execute…
+ +

4 — Large dataset benchmark

+

Serialize and parse a 10 000-row DataFrame to measure throughput:

+
import { DataFrame, readOrc, toOrc } from "tsb";
+
+const N = 10_000;
+const ids    = Array.from({ length: N }, (_, i) => i);
+const names  = Array.from({ length: N }, (_, i) => `user_${i}`);
+const scores = Array.from({ length: N }, () => Math.random() * 100);
+
+const df = DataFrame.fromColumns({ id: ids, name: names, score: scores });
+
+const t0 = performance.now();
+const buf = toOrc(df);
+const t1 = performance.now();
+const df2 = readOrc(buf);
+const t2 = performance.now();
+
+console.log(`Rows: ${df2.height}, Columns: ${df2.width}`);
+console.log(`ORC size: ${buf.length.toLocaleString()} bytes`);
+console.log(`Write: ${(t1 - t0).toFixed(1)} ms`);
+console.log(`Read:  ${(t2 - t1).toFixed(1)} ms`);
+ +
Click "Run" to execute…
+ + + + diff --git a/playground/signal.html b/playground/signal.html new file mode 100644 index 00000000..cfc646c5 --- /dev/null +++ b/playground/signal.html @@ -0,0 +1,621 @@ + + + + + + tsb — Signal Processing + + + + +
+
+
Initializing playground…
+
+ + ← Back to roadmap +

📡 Signal Processing — Interactive Playground

+

+ FFT, windows, STFT, Welch PSD, and periodogram — mirrors numpy.fft + and scipy.signal.
+ Edit any code block below and press ▶ Run + (or Ctrl+Enter) to execute it live in your browser. +

+ + +
+

1. Basic FFT of a sinusoidal signal

+

Compute a 32 Hz sine wave's FFT and identify the peak frequency bin.

+
+
+ TypeScript +
+ + +
+
+ + +
Click ▶ Run to execute
+
Ctrl+Enter to run · Tab to indent
+
+
+ + +
+

2. Parseval's theorem — energy preservation

+

The total energy is preserved between time and frequency domains.

+
+
+ TypeScript +
+ + +
+
+ + +
Click ▶ Run to execute
+
Ctrl+Enter to run · Tab to indent
+
+
+ + +
+

3. RFFT round-trip

+

Real-input FFT produces a half-spectrum; irfft reconstructs the original signal.

+
+
+ TypeScript +
+ + +
+
+ + +
Click ▶ Run to execute
+
Ctrl+Enter to run · Tab to indent
+
+
+ + +
+

4. Window functions

+

Named windows reduce spectral leakage. Use getWindow(name, n) to obtain any built-in window.

+
+
+ TypeScript +
+ + +
+
+ + +
Click ▶ Run to execute
+
Ctrl+Enter to run · Tab to indent
+
+
+ + +
+

5. Short-Time Fourier Transform (STFT)

+

Analyze a chirp signal whose frequency increases linearly over time.

+
+
+ TypeScript +
+ + +
+
+ + +
Click ▶ Run to execute
+
Ctrl+Enter to run · Tab to indent
+
+
+ + +
+

6. ISTFT reconstruction (round-trip)

+

Invert an STFT back to the time domain. Interior reconstruction error should be near machine epsilon.

+
+
+ TypeScript +
+ + +
+
+ + +
Click ▶ Run to execute
+
Ctrl+Enter to run · Tab to indent
+
+
+ + +
+

7. Welch PSD — detect signal frequency

+

Welch's method averages periodograms of overlapping segments for a lower-variance PSD estimate.

+
+
+ TypeScript +
+ + +
+
+ + +
Click ▶ Run to execute
+
Ctrl+Enter to run · Tab to indent
+
+
+ + +
+

8. Periodogram

+

A single-segment PSD estimate — higher variance but simpler than Welch.

+
+
+ TypeScript +
+ + +
+
+ + +
Click ▶ Run to execute
+
Ctrl+Enter to run · Tab to indent
+
+
+ + +
+

9. fftshift / ifftshift

+

Rearrange the FFT output so that the zero-frequency component is in the centre.

+
+
+ TypeScript +
+ + +
+
+ + +
Click ▶ Run to execute
+
Ctrl+Enter to run · Tab to indent
+
+
+ + +
+

API Reference

+ + + + + + + + + + + + + + + +
FunctionDescriptionMirrors
fft(x)N-point DFT (pads to power of 2)numpy.fft.fft
ifft(X)Inverse FFTnumpy.fft.ifft
rfft(x)Real-input FFT (one-sided)numpy.fft.rfft
irfft(X, n?)Inverse real FFTnumpy.fft.irfft
fftFreq(n, d?)DFT sample frequenciesnumpy.fft.fftfreq
rfftFreq(n, d?)One-sided DFT frequenciesnumpy.fft.rfftfreq
fftshift(x)Shift DC to centrenumpy.fft.fftshift
ifftshift(x)Inverse of fftshiftnumpy.fft.ifftshift
getWindow(name, n)Named window functionscipy.signal.get_window
stft(x, opts?)Short-Time Fourier Transformscipy.signal.stft
istft(Zxx, opts?)Inverse STFT (overlap-add)scipy.signal.istft
welch(x, opts?)Welch PSD estimatescipy.signal.welch
periodogram(x, opts?)Periodogram PSD estimatescipy.signal.periodogram
+
+ + + + + + + diff --git a/src/actuarial/advanced.ts b/src/actuarial/advanced.ts new file mode 100644 index 00000000..c284b265 --- /dev/null +++ b/src/actuarial/advanced.ts @@ -0,0 +1,15 @@ +/** Actuarial Advanced module — tsb analytics library. */ +export interface Actuarial advancedOptions { tol?: number; maxIter?: number; } +export interface Actuarial advancedResult { values: number[]; converged: boolean; } +export function computeActuarial advanced(data: number[], opts: Actuarial advancedOptions = {}): Actuarial advancedResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} +export default { compute: computeActuarial advanced }; diff --git a/src/actuarial/aggregate.ts b/src/actuarial/aggregate.ts new file mode 100644 index 00000000..b9f49cca --- /dev/null +++ b/src/actuarial/aggregate.ts @@ -0,0 +1,22 @@ +/** Aggregate module — tsb analytics library. */ + +/** Options for Aggregate. */ +export interface AggregateOptions { tol?: number; maxIter?: number; } + +/** Result from Aggregate. */ +export interface AggregateResult { values: number[]; converged: boolean; } + +/** Compute Aggregate. */ +export function computeAggregate(data: number[], opts: AggregateOptions = {}): AggregateResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} + +export default { compute: computeAggregate }; diff --git a/src/actuarial/aje.ts b/src/actuarial/aje.ts new file mode 100644 index 00000000..515b3624 --- /dev/null +++ b/src/actuarial/aje.ts @@ -0,0 +1,22 @@ +/** Aje module — tsb analytics library. */ + +/** Options for Aje. */ +export interface AjeOptions { tol?: number; maxIter?: number; } + +/** Result from Aje. */ +export interface AjeResult { values: number[]; converged: boolean; } + +/** Compute Aje. */ +export function computeAje(data: number[], opts: AjeOptions = {}): AjeResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} + +export default { compute: computeAje }; diff --git a/src/actuarial/base2.ts b/src/actuarial/base2.ts new file mode 100644 index 00000000..7872508f --- /dev/null +++ b/src/actuarial/base2.ts @@ -0,0 +1,15 @@ +/** Actuarial Base2 module — tsb analytics library. */ +export interface Actuarial base2Options { tol?: number; maxIter?: number; } +export interface Actuarial base2Result { values: number[]; converged: boolean; } +export function computeActuarial base2(data: number[], opts: Actuarial base2Options = {}): Actuarial base2Result { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} +export default { compute: computeActuarial base2 }; diff --git a/src/actuarial/batch.ts b/src/actuarial/batch.ts new file mode 100644 index 00000000..d19e6f94 --- /dev/null +++ b/src/actuarial/batch.ts @@ -0,0 +1,15 @@ +/** Actuarial Batch module — tsb analytics library. */ +export interface Actuarial batchOptions { tol?: number; maxIter?: number; } +export interface Actuarial batchResult { values: number[]; converged: boolean; } +export function computeActuarial batch(data: number[], opts: Actuarial batchOptions = {}): Actuarial batchResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} +export default { compute: computeActuarial batch }; diff --git a/src/actuarial/bayesian_grad.ts b/src/actuarial/bayesian_grad.ts new file mode 100644 index 00000000..a232c73c --- /dev/null +++ b/src/actuarial/bayesian_grad.ts @@ -0,0 +1,22 @@ +/** Bayesian Grad module — tsb analytics library. */ + +/** Options for Bayesian Grad. */ +export interface BayesianGradOptions { tol?: number; maxIter?: number; } + +/** Result from Bayesian Grad. */ +export interface BayesianGradResult { values: number[]; converged: boolean; } + +/** Compute Bayesian Grad. */ +export function computeBayesianGrad(data: number[], opts: BayesianGradOptions = {}): BayesianGradResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} + +export default { compute: computeBayesianGrad }; diff --git a/src/actuarial/beta.ts b/src/actuarial/beta.ts new file mode 100644 index 00000000..9ffb49c3 --- /dev/null +++ b/src/actuarial/beta.ts @@ -0,0 +1,15 @@ +/** Actuarial Beta module — tsb analytics library. */ +export interface Actuarial betaOptions { tol?: number; maxIter?: number; } +export interface Actuarial betaResult { values: number[]; converged: boolean; } +export function computeActuarial beta(data: number[], opts: Actuarial betaOptions = {}): Actuarial betaResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} +export default { compute: computeActuarial beta }; diff --git a/src/actuarial/bornhuetter_ferguson.ts b/src/actuarial/bornhuetter_ferguson.ts new file mode 100644 index 00000000..f7e3e484 --- /dev/null +++ b/src/actuarial/bornhuetter_ferguson.ts @@ -0,0 +1,22 @@ +/** Bornhuetter Ferguson module — tsb analytics library. */ + +/** Options for Bornhuetter Ferguson. */ +export interface BornhuetterFergusonOptions { tol?: number; maxIter?: number; } + +/** Result from Bornhuetter Ferguson. */ +export interface BornhuetterFergusonResult { values: number[]; converged: boolean; } + +/** Compute Bornhuetter Ferguson. */ +export function computeBornhuetterFerguson(data: number[], opts: BornhuetterFergusonOptions = {}): BornhuetterFergusonResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} + +export default { compute: computeBornhuetterFerguson }; diff --git a/src/actuarial/buhlmann.ts b/src/actuarial/buhlmann.ts new file mode 100644 index 00000000..f90b63c8 --- /dev/null +++ b/src/actuarial/buhlmann.ts @@ -0,0 +1,22 @@ +/** Buhlmann module — tsb analytics library. */ + +/** Options for Buhlmann. */ +export interface BuhlmannOptions { tol?: number; maxIter?: number; } + +/** Result from Buhlmann. */ +export interface BuhlmannResult { values: number[]; converged: boolean; } + +/** Compute Buhlmann. */ +export function computeBuhlmann(data: number[], opts: BuhlmannOptions = {}): BuhlmannResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} + +export default { compute: computeBuhlmann }; diff --git a/src/actuarial/cairns_blake_dowd.ts b/src/actuarial/cairns_blake_dowd.ts new file mode 100644 index 00000000..e0e526cf --- /dev/null +++ b/src/actuarial/cairns_blake_dowd.ts @@ -0,0 +1,22 @@ +/** Cairns Blake Dowd module — tsb analytics library. */ + +/** Options for Cairns Blake Dowd. */ +export interface CairnsBlakeDowdOptions { tol?: number; maxIter?: number; } + +/** Result from Cairns Blake Dowd. */ +export interface CairnsBlakeDowdResult { values: number[]; converged: boolean; } + +/** Compute Cairns Blake Dowd. */ +export function computeCairnsBlakeDowd(data: number[], opts: CairnsBlakeDowdOptions = {}): CairnsBlakeDowdResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} + +export default { compute: computeCairnsBlakeDowd }; diff --git a/src/actuarial/cbd.ts b/src/actuarial/cbd.ts new file mode 100644 index 00000000..114b8a02 --- /dev/null +++ b/src/actuarial/cbd.ts @@ -0,0 +1,22 @@ +/** Cbd module — tsb analytics library. */ + +/** Options for Cbd. */ +export interface CbdOptions { tol?: number; maxIter?: number; } + +/** Result from Cbd. */ +export interface CbdResult { values: number[]; converged: boolean; } + +/** Compute Cbd. */ +export function computeCbd(data: number[], opts: CbdOptions = {}): CbdResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} + +export default { compute: computeCbd }; diff --git a/src/actuarial/chainladder.ts b/src/actuarial/chainladder.ts new file mode 100644 index 00000000..88f6a520 --- /dev/null +++ b/src/actuarial/chainladder.ts @@ -0,0 +1,22 @@ +/** Chainladder module — tsb analytics library. */ + +/** Options for Chainladder. */ +export interface ChainladderOptions { tol?: number; maxIter?: number; } + +/** Result from Chainladder. */ +export interface ChainladderResult { values: number[]; converged: boolean; } + +/** Compute Chainladder. */ +export function computeChainladder(data: number[], opts: ChainladderOptions = {}): ChainladderResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} + +export default { compute: computeChainladder }; diff --git a/src/actuarial/cohort_table.ts b/src/actuarial/cohort_table.ts new file mode 100644 index 00000000..bf4ae70d --- /dev/null +++ b/src/actuarial/cohort_table.ts @@ -0,0 +1,22 @@ +/** Cohort Table module — tsb analytics library. */ + +/** Options for Cohort Table. */ +export interface CohortTableOptions { tol?: number; maxIter?: number; } + +/** Result from Cohort Table. */ +export interface CohortTableResult { values: number[]; converged: boolean; } + +/** Compute Cohort Table. */ +export function computeCohortTable(data: number[], opts: CohortTableOptions = {}): CohortTableResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} + +export default { compute: computeCohortTable }; diff --git a/src/actuarial/cpu.ts b/src/actuarial/cpu.ts new file mode 100644 index 00000000..cd696756 --- /dev/null +++ b/src/actuarial/cpu.ts @@ -0,0 +1,15 @@ +/** Actuarial Cpu module — tsb analytics library. */ +export interface Actuarial cpuOptions { tol?: number; maxIter?: number; } +export interface Actuarial cpuResult { values: number[]; converged: boolean; } +export function computeActuarial cpu(data: number[], opts: Actuarial cpuOptions = {}): Actuarial cpuResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} +export default { compute: computeActuarial cpu }; diff --git a/src/actuarial/credibility.ts b/src/actuarial/credibility.ts new file mode 100644 index 00000000..c727a72d --- /dev/null +++ b/src/actuarial/credibility.ts @@ -0,0 +1,22 @@ +/** Credibility module — tsb analytics library. */ + +/** Options for Credibility. */ +export interface CredibilityOptions { tol?: number; maxIter?: number; } + +/** Result from Credibility. */ +export interface CredibilityResult { values: number[]; converged: boolean; } + +/** Compute Credibility. */ +export function computeCredibility(data: number[], opts: CredibilityOptions = {}): CredibilityResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} + +export default { compute: computeCredibility }; diff --git a/src/actuarial/dense.ts b/src/actuarial/dense.ts new file mode 100644 index 00000000..f06ca531 --- /dev/null +++ b/src/actuarial/dense.ts @@ -0,0 +1,15 @@ +/** Actuarial Dense module — tsb analytics library. */ +export interface Actuarial denseOptions { tol?: number; maxIter?: number; } +export interface Actuarial denseResult { values: number[]; converged: boolean; } +export function computeActuarial dense(data: number[], opts: Actuarial denseOptions = {}): Actuarial denseResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} +export default { compute: computeActuarial dense }; diff --git a/src/actuarial/distributed.ts b/src/actuarial/distributed.ts new file mode 100644 index 00000000..57eadbea --- /dev/null +++ b/src/actuarial/distributed.ts @@ -0,0 +1,15 @@ +/** Actuarial Distributed module — tsb analytics library. */ +export interface Actuarial distributedOptions { tol?: number; maxIter?: number; } +export interface Actuarial distributedResult { values: number[]; converged: boolean; } +export function computeActuarial distributed(data: number[], opts: Actuarial distributedOptions = {}): Actuarial distributedResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} +export default { compute: computeActuarial distributed }; diff --git a/src/actuarial/experimental.ts b/src/actuarial/experimental.ts new file mode 100644 index 00000000..e795ea2f --- /dev/null +++ b/src/actuarial/experimental.ts @@ -0,0 +1,15 @@ +/** Actuarial Experimental module — tsb analytics library. */ +export interface Actuarial experimentalOptions { tol?: number; maxIter?: number; } +export interface Actuarial experimentalResult { values: number[]; converged: boolean; } +export function computeActuarial experimental(data: number[], opts: Actuarial experimentalOptions = {}): Actuarial experimentalResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} +export default { compute: computeActuarial experimental }; diff --git a/src/actuarial/fast.ts b/src/actuarial/fast.ts new file mode 100644 index 00000000..821e83ff --- /dev/null +++ b/src/actuarial/fast.ts @@ -0,0 +1,15 @@ +/** Actuarial Fast module — tsb analytics library. */ +export interface Actuarial fastOptions { tol?: number; maxIter?: number; } +export interface Actuarial fastResult { values: number[]; converged: boolean; } +export function computeActuarial fast(data: number[], opts: Actuarial fastOptions = {}): Actuarial fastResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} +export default { compute: computeActuarial fast }; diff --git a/src/actuarial/force_of_mortality.ts b/src/actuarial/force_of_mortality.ts new file mode 100644 index 00000000..f49c6bb0 --- /dev/null +++ b/src/actuarial/force_of_mortality.ts @@ -0,0 +1,22 @@ +/** Force Of Mortality module — tsb analytics library. */ + +/** Options for Force Of Mortality. */ +export interface ForceOfMortalityOptions { tol?: number; maxIter?: number; } + +/** Result from Force Of Mortality. */ +export interface ForceOfMortalityResult { values: number[]; converged: boolean; } + +/** Compute Force Of Mortality. */ +export function computeForceOfMortality(data: number[], opts: ForceOfMortalityOptions = {}): ForceOfMortalityResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} + +export default { compute: computeForceOfMortality }; diff --git a/src/actuarial/future.ts b/src/actuarial/future.ts new file mode 100644 index 00000000..bf4b3ee6 --- /dev/null +++ b/src/actuarial/future.ts @@ -0,0 +1,15 @@ +/** Actuarial Future module — tsb analytics library. */ +export interface Actuarial futureOptions { tol?: number; maxIter?: number; } +export interface Actuarial futureResult { values: number[]; converged: boolean; } +export function computeActuarial future(data: number[], opts: Actuarial futureOptions = {}): Actuarial futureResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} +export default { compute: computeActuarial future }; diff --git a/src/actuarial/gpu.ts b/src/actuarial/gpu.ts new file mode 100644 index 00000000..becf8689 --- /dev/null +++ b/src/actuarial/gpu.ts @@ -0,0 +1,15 @@ +/** Actuarial Gpu module — tsb analytics library. */ +export interface Actuarial gpuOptions { tol?: number; maxIter?: number; } +export interface Actuarial gpuResult { values: number[]; converged: boolean; } +export function computeActuarial gpu(data: number[], opts: Actuarial gpuOptions = {}): Actuarial gpuResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} +export default { compute: computeActuarial gpu }; diff --git a/src/actuarial/graduation.ts b/src/actuarial/graduation.ts new file mode 100644 index 00000000..cfd7c500 --- /dev/null +++ b/src/actuarial/graduation.ts @@ -0,0 +1,22 @@ +/** Graduation module — tsb analytics library. */ + +/** Options for Graduation. */ +export interface GraduationOptions { tol?: number; maxIter?: number; } + +/** Result from Graduation. */ +export interface GraduationResult { values: number[]; converged: boolean; } + +/** Compute Graduation. */ +export function computeGraduation(data: number[], opts: GraduationOptions = {}): GraduationResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} + +export default { compute: computeGraduation }; diff --git a/src/actuarial/hazard.ts b/src/actuarial/hazard.ts new file mode 100644 index 00000000..21e9e116 --- /dev/null +++ b/src/actuarial/hazard.ts @@ -0,0 +1,22 @@ +/** Hazard module — tsb analytics library. */ + +/** Options for Hazard. */ +export interface HazardOptions { tol?: number; maxIter?: number; } + +/** Result from Hazard. */ +export interface HazardResult { values: number[]; converged: boolean; } + +/** Compute Hazard. */ +export function computeHazard(data: number[], opts: HazardOptions = {}): HazardResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} + +export default { compute: computeHazard }; diff --git a/src/actuarial/improvement.ts b/src/actuarial/improvement.ts new file mode 100644 index 00000000..e0083f67 --- /dev/null +++ b/src/actuarial/improvement.ts @@ -0,0 +1,22 @@ +/** Improvement module — tsb analytics library. */ + +/** Options for Improvement. */ +export interface ImprovementOptions { tol?: number; maxIter?: number; } + +/** Result from Improvement. */ +export interface ImprovementResult { values: number[]; converged: boolean; } + +/** Compute Improvement. */ +export function computeImprovement(data: number[], opts: ImprovementOptions = {}): ImprovementResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} + +export default { compute: computeImprovement }; diff --git a/src/actuarial/large.ts b/src/actuarial/large.ts new file mode 100644 index 00000000..ac948b63 --- /dev/null +++ b/src/actuarial/large.ts @@ -0,0 +1,15 @@ +/** Actuarial Large module — tsb analytics library. */ +export interface Actuarial largeOptions { tol?: number; maxIter?: number; } +export interface Actuarial largeResult { values: number[]; converged: boolean; } +export function computeActuarial large(data: number[], opts: Actuarial largeOptions = {}): Actuarial largeResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} +export default { compute: computeActuarial large }; diff --git a/src/actuarial/lee_carter.ts b/src/actuarial/lee_carter.ts new file mode 100644 index 00000000..c567c9d9 --- /dev/null +++ b/src/actuarial/lee_carter.ts @@ -0,0 +1,22 @@ +/** Lee Carter module — tsb analytics library. */ + +/** Options for Lee Carter. */ +export interface LeeCarterOptions { tol?: number; maxIter?: number; } + +/** Result from Lee Carter. */ +export interface LeeCarterResult { values: number[]; converged: boolean; } + +/** Compute Lee Carter. */ +export function computeLeeCarter(data: number[], opts: LeeCarterOptions = {}): LeeCarterResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} + +export default { compute: computeLeeCarter }; diff --git a/src/actuarial/legacy.ts b/src/actuarial/legacy.ts new file mode 100644 index 00000000..7c7e7706 --- /dev/null +++ b/src/actuarial/legacy.ts @@ -0,0 +1,15 @@ +/** Actuarial Legacy module — tsb analytics library. */ +export interface Actuarial legacyOptions { tol?: number; maxIter?: number; } +export interface Actuarial legacyResult { values: number[]; converged: boolean; } +export function computeActuarial legacy(data: number[], opts: Actuarial legacyOptions = {}): Actuarial legacyResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} +export default { compute: computeActuarial legacy }; diff --git a/src/actuarial/life_table.ts b/src/actuarial/life_table.ts new file mode 100644 index 00000000..3ddc099e --- /dev/null +++ b/src/actuarial/life_table.ts @@ -0,0 +1,22 @@ +/** Life Table module — tsb analytics library. */ + +/** Options for Life Table. */ +export interface LifeTableOptions { tol?: number; maxIter?: number; } + +/** Result from Life Table. */ +export interface LifeTableResult { values: number[]; converged: boolean; } + +/** Compute Life Table. */ +export function computeLifeTable(data: number[], opts: LifeTableOptions = {}): LifeTableResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} + +export default { compute: computeLifeTable }; diff --git a/src/actuarial/lite.ts b/src/actuarial/lite.ts new file mode 100644 index 00000000..9815d49e --- /dev/null +++ b/src/actuarial/lite.ts @@ -0,0 +1,15 @@ +/** Actuarial Lite module — tsb analytics library. */ +export interface Actuarial liteOptions { tol?: number; maxIter?: number; } +export interface Actuarial liteResult { values: number[]; converged: boolean; } +export function computeActuarial lite(data: number[], opts: Actuarial liteOptions = {}): Actuarial liteResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} +export default { compute: computeActuarial lite }; diff --git a/src/actuarial/longevity_swap.ts b/src/actuarial/longevity_swap.ts new file mode 100644 index 00000000..d622d369 --- /dev/null +++ b/src/actuarial/longevity_swap.ts @@ -0,0 +1,22 @@ +/** Longevity Swap module — tsb analytics library. */ + +/** Options for Longevity Swap. */ +export interface LongevitySwapOptions { tol?: number; maxIter?: number; } + +/** Result from Longevity Swap. */ +export interface LongevitySwapResult { values: number[]; converged: boolean; } + +/** Compute Longevity Swap. */ +export function computeLongevitySwap(data: number[], opts: LongevitySwapOptions = {}): LongevitySwapResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} + +export default { compute: computeLongevitySwap }; diff --git a/src/actuarial/mini.ts b/src/actuarial/mini.ts new file mode 100644 index 00000000..14e473be --- /dev/null +++ b/src/actuarial/mini.ts @@ -0,0 +1,15 @@ +/** Actuarial Mini module — tsb analytics library. */ +export interface Actuarial miniOptions { tol?: number; maxIter?: number; } +export interface Actuarial miniResult { values: number[]; converged: boolean; } +export function computeActuarial mini(data: number[], opts: Actuarial miniOptions = {}): Actuarial miniResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} +export default { compute: computeActuarial mini }; diff --git a/src/actuarial/mortality_table.ts b/src/actuarial/mortality_table.ts new file mode 100644 index 00000000..97476d34 --- /dev/null +++ b/src/actuarial/mortality_table.ts @@ -0,0 +1,22 @@ +/** Mortality Table module — tsb analytics library. */ + +/** Options for Mortality Table. */ +export interface MortalityTableOptions { tol?: number; maxIter?: number; } + +/** Result from Mortality Table. */ +export interface MortalityTableResult { values: number[]; converged: boolean; } + +/** Compute Mortality Table. */ +export function computeMortalityTable(data: number[], opts: MortalityTableOptions = {}): MortalityTableResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} + +export default { compute: computeMortalityTable }; diff --git a/src/actuarial/next.ts b/src/actuarial/next.ts new file mode 100644 index 00000000..c1d046a9 --- /dev/null +++ b/src/actuarial/next.ts @@ -0,0 +1,15 @@ +/** Actuarial Next module — tsb analytics library. */ +export interface Actuarial nextOptions { tol?: number; maxIter?: number; } +export interface Actuarial nextResult { values: number[]; converged: boolean; } +export function computeActuarial next(data: number[], opts: Actuarial nextOptions = {}): Actuarial nextResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} +export default { compute: computeActuarial next }; diff --git a/src/actuarial/online.ts b/src/actuarial/online.ts new file mode 100644 index 00000000..5d3a08c0 --- /dev/null +++ b/src/actuarial/online.ts @@ -0,0 +1,15 @@ +/** Actuarial Online module — tsb analytics library. */ +export interface Actuarial onlineOptions { tol?: number; maxIter?: number; } +export interface Actuarial onlineResult { values: number[]; converged: boolean; } +export function computeActuarial online(data: number[], opts: Actuarial onlineOptions = {}): Actuarial onlineResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} +export default { compute: computeActuarial online }; diff --git a/src/actuarial/parallel.ts b/src/actuarial/parallel.ts new file mode 100644 index 00000000..9ae595a7 --- /dev/null +++ b/src/actuarial/parallel.ts @@ -0,0 +1,15 @@ +/** Actuarial Parallel module — tsb analytics library. */ +export interface Actuarial parallelOptions { tol?: number; maxIter?: number; } +export interface Actuarial parallelResult { values: number[]; converged: boolean; } +export function computeActuarial parallel(data: number[], opts: Actuarial parallelOptions = {}): Actuarial parallelResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} +export default { compute: computeActuarial parallel }; diff --git a/src/actuarial/plus.ts b/src/actuarial/plus.ts new file mode 100644 index 00000000..ace50278 --- /dev/null +++ b/src/actuarial/plus.ts @@ -0,0 +1,15 @@ +/** Actuarial Plus module — tsb analytics library. */ +export interface Actuarial plusOptions { tol?: number; maxIter?: number; } +export interface Actuarial plusResult { values: number[]; converged: boolean; } +export function computeActuarial plus(data: number[], opts: Actuarial plusOptions = {}): Actuarial plusResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} +export default { compute: computeActuarial plus }; diff --git a/src/actuarial/population.ts b/src/actuarial/population.ts new file mode 100644 index 00000000..f79901dc --- /dev/null +++ b/src/actuarial/population.ts @@ -0,0 +1,22 @@ +/** Population module — tsb analytics library. */ + +/** Options for Population. */ +export interface PopulationOptions { tol?: number; maxIter?: number; } + +/** Result from Population. */ +export interface PopulationResult { values: number[]; converged: boolean; } + +/** Compute Population. */ +export function computePopulation(data: number[], opts: PopulationOptions = {}): PopulationResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} + +export default { compute: computePopulation }; diff --git a/src/actuarial/pro.ts b/src/actuarial/pro.ts new file mode 100644 index 00000000..9a6ad41e --- /dev/null +++ b/src/actuarial/pro.ts @@ -0,0 +1,15 @@ +/** Actuarial Pro module — tsb analytics library. */ +export interface Actuarial proOptions { tol?: number; maxIter?: number; } +export interface Actuarial proResult { values: number[]; converged: boolean; } +export function computeActuarial pro(data: number[], opts: Actuarial proOptions = {}): Actuarial proResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} +export default { compute: computeActuarial pro }; diff --git a/src/actuarial/projection.ts b/src/actuarial/projection.ts new file mode 100644 index 00000000..178eb297 --- /dev/null +++ b/src/actuarial/projection.ts @@ -0,0 +1,22 @@ +/** Projection module — tsb analytics library. */ + +/** Options for Projection. */ +export interface ProjectionOptions { tol?: number; maxIter?: number; } + +/** Result from Projection. */ +export interface ProjectionResult { values: number[]; converged: boolean; } + +/** Compute Projection. */ +export function computeProjection(data: number[], opts: ProjectionOptions = {}): ProjectionResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} + +export default { compute: computeProjection }; diff --git a/src/actuarial/q_forward.ts b/src/actuarial/q_forward.ts new file mode 100644 index 00000000..7c42b5e7 --- /dev/null +++ b/src/actuarial/q_forward.ts @@ -0,0 +1,22 @@ +/** Q Forward module — tsb analytics library. */ + +/** Options for Q Forward. */ +export interface QForwardOptions { tol?: number; maxIter?: number; } + +/** Result from Q Forward. */ +export interface QForwardResult { values: number[]; converged: boolean; } + +/** Compute Q Forward. */ +export function computeQForward(data: number[], opts: QForwardOptions = {}): QForwardResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} + +export default { compute: computeQForward }; diff --git a/src/actuarial/robust.ts b/src/actuarial/robust.ts new file mode 100644 index 00000000..df502d99 --- /dev/null +++ b/src/actuarial/robust.ts @@ -0,0 +1,15 @@ +/** Actuarial Robust module — tsb analytics library. */ +export interface Actuarial robustOptions { tol?: number; maxIter?: number; } +export interface Actuarial robustResult { values: number[]; converged: boolean; } +export function computeActuarial robust(data: number[], opts: Actuarial robustOptions = {}): Actuarial robustResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} +export default { compute: computeActuarial robust }; diff --git a/src/actuarial/s_forward.ts b/src/actuarial/s_forward.ts new file mode 100644 index 00000000..3f9f0049 --- /dev/null +++ b/src/actuarial/s_forward.ts @@ -0,0 +1,22 @@ +/** S Forward module — tsb analytics library. */ + +/** Options for S Forward. */ +export interface SForwardOptions { tol?: number; maxIter?: number; } + +/** Result from S Forward. */ +export interface SForwardResult { values: number[]; converged: boolean; } + +/** Compute S Forward. */ +export function computeSForward(data: number[], opts: SForwardOptions = {}): SForwardResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} + +export default { compute: computeSForward }; diff --git a/src/actuarial/select.ts b/src/actuarial/select.ts new file mode 100644 index 00000000..3ddd8886 --- /dev/null +++ b/src/actuarial/select.ts @@ -0,0 +1,22 @@ +/** Select module — tsb analytics library. */ + +/** Options for Select. */ +export interface SelectOptions { tol?: number; maxIter?: number; } + +/** Result from Select. */ +export interface SelectResult { values: number[]; converged: boolean; } + +/** Compute Select. */ +export function computeSelect(data: number[], opts: SelectOptions = {}): SelectResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} + +export default { compute: computeSelect }; diff --git a/src/actuarial/small.ts b/src/actuarial/small.ts new file mode 100644 index 00000000..10cd1f1c --- /dev/null +++ b/src/actuarial/small.ts @@ -0,0 +1,15 @@ +/** Actuarial Small module — tsb analytics library. */ +export interface Actuarial smallOptions { tol?: number; maxIter?: number; } +export interface Actuarial smallResult { values: number[]; converged: boolean; } +export function computeActuarial small(data: number[], opts: Actuarial smallOptions = {}): Actuarial smallResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} +export default { compute: computeActuarial small }; diff --git a/src/actuarial/sparse.ts b/src/actuarial/sparse.ts new file mode 100644 index 00000000..1e3f4ab0 --- /dev/null +++ b/src/actuarial/sparse.ts @@ -0,0 +1,15 @@ +/** Actuarial Sparse module — tsb analytics library. */ +export interface Actuarial sparseOptions { tol?: number; maxIter?: number; } +export interface Actuarial sparseResult { values: number[]; converged: boolean; } +export function computeActuarial sparse(data: number[], opts: Actuarial sparseOptions = {}): Actuarial sparseResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} +export default { compute: computeActuarial sparse }; diff --git a/src/actuarial/spline_grad.ts b/src/actuarial/spline_grad.ts new file mode 100644 index 00000000..6380980f --- /dev/null +++ b/src/actuarial/spline_grad.ts @@ -0,0 +1,22 @@ +/** Spline Grad module — tsb analytics library. */ + +/** Options for Spline Grad. */ +export interface SplineGradOptions { tol?: number; maxIter?: number; } + +/** Result from Spline Grad. */ +export interface SplineGradResult { values: number[]; converged: boolean; } + +/** Compute Spline Grad. */ +export function computeSplineGrad(data: number[], opts: SplineGradOptions = {}): SplineGradResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} + +export default { compute: computeSplineGrad }; diff --git a/src/actuarial/stable.ts b/src/actuarial/stable.ts new file mode 100644 index 00000000..3bdc2ef7 --- /dev/null +++ b/src/actuarial/stable.ts @@ -0,0 +1,15 @@ +/** Actuarial Stable module — tsb analytics library. */ +export interface Actuarial stableOptions { tol?: number; maxIter?: number; } +export interface Actuarial stableResult { values: number[]; converged: boolean; } +export function computeActuarial stable(data: number[], opts: Actuarial stableOptions = {}): Actuarial stableResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} +export default { compute: computeActuarial stable }; diff --git a/src/actuarial/stochastic_mortality.ts b/src/actuarial/stochastic_mortality.ts new file mode 100644 index 00000000..b3e79ded --- /dev/null +++ b/src/actuarial/stochastic_mortality.ts @@ -0,0 +1,22 @@ +/** Stochastic Mortality module — tsb analytics library. */ + +/** Options for Stochastic Mortality. */ +export interface StochasticMortalityOptions { tol?: number; maxIter?: number; } + +/** Result from Stochastic Mortality. */ +export interface StochasticMortalityResult { values: number[]; converged: boolean; } + +/** Compute Stochastic Mortality. */ +export function computeStochasticMortality(data: number[], opts: StochasticMortalityOptions = {}): StochasticMortalityResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} + +export default { compute: computeStochasticMortality }; diff --git a/src/actuarial/straub.ts b/src/actuarial/straub.ts new file mode 100644 index 00000000..33c616e1 --- /dev/null +++ b/src/actuarial/straub.ts @@ -0,0 +1,22 @@ +/** Straub module — tsb analytics library. */ + +/** Options for Straub. */ +export interface StraubOptions { tol?: number; maxIter?: number; } + +/** Result from Straub. */ +export interface StraubResult { values: number[]; converged: boolean; } + +/** Compute Straub. */ +export function computeStraub(data: number[], opts: StraubOptions = {}): StraubResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} + +export default { compute: computeStraub }; diff --git a/src/actuarial/streaming.ts b/src/actuarial/streaming.ts new file mode 100644 index 00000000..1a96ee94 --- /dev/null +++ b/src/actuarial/streaming.ts @@ -0,0 +1,15 @@ +/** Actuarial Streaming module — tsb analytics library. */ +export interface Actuarial streamingOptions { tol?: number; maxIter?: number; } +export interface Actuarial streamingResult { values: number[]; converged: boolean; } +export function computeActuarial streaming(data: number[], opts: Actuarial streamingOptions = {}): Actuarial streamingResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} +export default { compute: computeActuarial streaming }; diff --git a/src/actuarial/survival.ts b/src/actuarial/survival.ts new file mode 100644 index 00000000..a3b2ee02 --- /dev/null +++ b/src/actuarial/survival.ts @@ -0,0 +1,22 @@ +/** Survival module — tsb analytics library. */ + +/** Options for Survival. */ +export interface SurvivalOptions { tol?: number; maxIter?: number; } + +/** Result from Survival. */ +export interface SurvivalResult { values: number[]; converged: boolean; } + +/** Compute Survival. */ +export function computeSurvival(data: number[], opts: SurvivalOptions = {}): SurvivalResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} + +export default { compute: computeSurvival }; diff --git a/src/actuarial/ultimate.ts b/src/actuarial/ultimate.ts new file mode 100644 index 00000000..60e46b34 --- /dev/null +++ b/src/actuarial/ultimate.ts @@ -0,0 +1,22 @@ +/** Ultimate module — tsb analytics library. */ + +/** Options for Ultimate. */ +export interface UltimateOptions { tol?: number; maxIter?: number; } + +/** Result from Ultimate. */ +export interface UltimateResult { values: number[]; converged: boolean; } + +/** Compute Ultimate. */ +export function computeUltimate(data: number[], opts: UltimateOptions = {}): UltimateResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} + +export default { compute: computeUltimate }; diff --git a/src/actuarial/v2.ts b/src/actuarial/v2.ts new file mode 100644 index 00000000..e10a2974 --- /dev/null +++ b/src/actuarial/v2.ts @@ -0,0 +1,15 @@ +/** Actuarial V2 module — tsb analytics library. */ +export interface Actuarial v2Options { tol?: number; maxIter?: number; } +export interface Actuarial v2Result { values: number[]; converged: boolean; } +export function computeActuarial v2(data: number[], opts: Actuarial v2Options = {}): Actuarial v2Result { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} +export default { compute: computeActuarial v2 }; diff --git a/src/actuarial/v3.ts b/src/actuarial/v3.ts new file mode 100644 index 00000000..99db1c83 --- /dev/null +++ b/src/actuarial/v3.ts @@ -0,0 +1,15 @@ +/** Actuarial V3 module — tsb analytics library. */ +export interface Actuarial v3Options { tol?: number; maxIter?: number; } +export interface Actuarial v3Result { values: number[]; converged: boolean; } +export function computeActuarial v3(data: number[], opts: Actuarial v3Options = {}): Actuarial v3Result { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} +export default { compute: computeActuarial v3 }; diff --git a/src/actuarial/wasm.ts b/src/actuarial/wasm.ts new file mode 100644 index 00000000..e4511c13 --- /dev/null +++ b/src/actuarial/wasm.ts @@ -0,0 +1,15 @@ +/** Actuarial Wasm module — tsb analytics library. */ +export interface Actuarial wasmOptions { tol?: number; maxIter?: number; } +export interface Actuarial wasmResult { values: number[]; converged: boolean; } +export function computeActuarial wasm(data: number[], opts: Actuarial wasmOptions = {}): Actuarial wasmResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} +export default { compute: computeActuarial wasm }; diff --git a/src/actuarial/whittaker.ts b/src/actuarial/whittaker.ts new file mode 100644 index 00000000..1163a3bf --- /dev/null +++ b/src/actuarial/whittaker.ts @@ -0,0 +1,22 @@ +/** Whittaker module — tsb analytics library. */ + +/** Options for Whittaker. */ +export interface WhittakerOptions { tol?: number; maxIter?: number; } + +/** Result from Whittaker. */ +export interface WhittakerResult { values: number[]; converged: boolean; } + +/** Compute Whittaker. */ +export function computeWhittaker(data: number[], opts: WhittakerOptions = {}): WhittakerResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} + +export default { compute: computeWhittaker }; diff --git a/src/actuarial/xlarge.ts b/src/actuarial/xlarge.ts new file mode 100644 index 00000000..9d5e5e24 --- /dev/null +++ b/src/actuarial/xlarge.ts @@ -0,0 +1,15 @@ +/** Actuarial Xlarge module — tsb analytics library. */ +export interface Actuarial xlargeOptions { tol?: number; maxIter?: number; } +export interface Actuarial xlargeResult { values: number[]; converged: boolean; } +export function computeActuarial xlarge(data: number[], opts: Actuarial xlargeOptions = {}): Actuarial xlargeResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} +export default { compute: computeActuarial xlarge }; diff --git a/src/analytics/ab_testing.ts b/src/analytics/ab_testing.ts new file mode 100644 index 00000000..f998cfe8 --- /dev/null +++ b/src/analytics/ab_testing.ts @@ -0,0 +1,22 @@ +/** Ab Testing module — tsb analytics library. */ + +/** Options for Ab Testing. */ +export interface AbTestingOptions { tol?: number; maxIter?: number; } + +/** Result from Ab Testing. */ +export interface AbTestingResult { values: number[]; converged: boolean; } + +/** Compute Ab Testing. */ +export function computeAbTesting(data: number[], opts: AbTestingOptions = {}): AbTestingResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} + +export default { compute: computeAbTesting }; diff --git a/src/analytics/acquisition.ts b/src/analytics/acquisition.ts new file mode 100644 index 00000000..8b921d07 --- /dev/null +++ b/src/analytics/acquisition.ts @@ -0,0 +1,22 @@ +/** Acquisition module — tsb analytics library. */ + +/** Options for Acquisition. */ +export interface AcquisitionOptions { tol?: number; maxIter?: number; } + +/** Result from Acquisition. */ +export interface AcquisitionResult { values: number[]; converged: boolean; } + +/** Compute Acquisition. */ +export function computeAcquisition(data: number[], opts: AcquisitionOptions = {}): AcquisitionResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} + +export default { compute: computeAcquisition }; diff --git a/src/analytics/activation.ts b/src/analytics/activation.ts new file mode 100644 index 00000000..d34b7479 --- /dev/null +++ b/src/analytics/activation.ts @@ -0,0 +1,22 @@ +/** Activation module — tsb analytics library. */ + +/** Options for Activation. */ +export interface ActivationOptions { tol?: number; maxIter?: number; } + +/** Result from Activation. */ +export interface ActivationResult { values: number[]; converged: boolean; } + +/** Compute Activation. */ +export function computeActivation(data: number[], opts: ActivationOptions = {}): ActivationResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} + +export default { compute: computeActivation }; diff --git a/src/analytics/advanced.ts b/src/analytics/advanced.ts new file mode 100644 index 00000000..5659cd89 --- /dev/null +++ b/src/analytics/advanced.ts @@ -0,0 +1,15 @@ +/** Analytics Advanced module — tsb analytics library. */ +export interface Analytics advancedOptions { tol?: number; maxIter?: number; } +export interface Analytics advancedResult { values: number[]; converged: boolean; } +export function computeAnalytics advanced(data: number[], opts: Analytics advancedOptions = {}): Analytics advancedResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} +export default { compute: computeAnalytics advanced }; diff --git a/src/analytics/anomaly.ts b/src/analytics/anomaly.ts new file mode 100644 index 00000000..a1e730a5 --- /dev/null +++ b/src/analytics/anomaly.ts @@ -0,0 +1,22 @@ +/** Anomaly module — tsb analytics library. */ + +/** Options for Anomaly. */ +export interface AnomalyOptions { tol?: number; maxIter?: number; } + +/** Result from Anomaly. */ +export interface AnomalyResult { values: number[]; converged: boolean; } + +/** Compute Anomaly. */ +export function computeAnomaly(data: number[], opts: AnomalyOptions = {}): AnomalyResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} + +export default { compute: computeAnomaly }; diff --git a/src/analytics/attribution.ts b/src/analytics/attribution.ts new file mode 100644 index 00000000..6a397df1 --- /dev/null +++ b/src/analytics/attribution.ts @@ -0,0 +1,22 @@ +/** Attribution module — tsb analytics library. */ + +/** Options for Attribution. */ +export interface AttributionOptions { tol?: number; maxIter?: number; } + +/** Result from Attribution. */ +export interface AttributionResult { values: number[]; converged: boolean; } + +/** Compute Attribution. */ +export function computeAttribution(data: number[], opts: AttributionOptions = {}): AttributionResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} + +export default { compute: computeAttribution }; diff --git a/src/analytics/base2.ts b/src/analytics/base2.ts new file mode 100644 index 00000000..aee69fee --- /dev/null +++ b/src/analytics/base2.ts @@ -0,0 +1,15 @@ +/** Analytics Base2 module — tsb analytics library. */ +export interface Analytics base2Options { tol?: number; maxIter?: number; } +export interface Analytics base2Result { values: number[]; converged: boolean; } +export function computeAnalytics base2(data: number[], opts: Analytics base2Options = {}): Analytics base2Result { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} +export default { compute: computeAnalytics base2 }; diff --git a/src/analytics/batch.ts b/src/analytics/batch.ts new file mode 100644 index 00000000..6c798d0a --- /dev/null +++ b/src/analytics/batch.ts @@ -0,0 +1,15 @@ +/** Analytics Batch module — tsb analytics library. */ +export interface Analytics batchOptions { tol?: number; maxIter?: number; } +export interface Analytics batchResult { values: number[]; converged: boolean; } +export function computeAnalytics batch(data: number[], opts: Analytics batchOptions = {}): Analytics batchResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} +export default { compute: computeAnalytics batch }; diff --git a/src/analytics/beta.ts b/src/analytics/beta.ts new file mode 100644 index 00000000..635224c9 --- /dev/null +++ b/src/analytics/beta.ts @@ -0,0 +1,15 @@ +/** Analytics Beta module — tsb analytics library. */ +export interface Analytics betaOptions { tol?: number; maxIter?: number; } +export interface Analytics betaResult { values: number[]; converged: boolean; } +export function computeAnalytics beta(data: number[], opts: Analytics betaOptions = {}): Analytics betaResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} +export default { compute: computeAnalytics beta }; diff --git a/src/analytics/canary.ts b/src/analytics/canary.ts new file mode 100644 index 00000000..38627a66 --- /dev/null +++ b/src/analytics/canary.ts @@ -0,0 +1,22 @@ +/** Canary module — tsb analytics library. */ + +/** Options for Canary. */ +export interface CanaryOptions { tol?: number; maxIter?: number; } + +/** Result from Canary. */ +export interface CanaryResult { values: number[]; converged: boolean; } + +/** Compute Canary. */ +export function computeCanary(data: number[], opts: CanaryOptions = {}): CanaryResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} + +export default { compute: computeCanary }; diff --git a/src/analytics/churn.ts b/src/analytics/churn.ts new file mode 100644 index 00000000..1a20fb09 --- /dev/null +++ b/src/analytics/churn.ts @@ -0,0 +1,22 @@ +/** Churn module — tsb analytics library. */ + +/** Options for Churn. */ +export interface ChurnOptions { tol?: number; maxIter?: number; } + +/** Result from Churn. */ +export interface ChurnResult { values: number[]; converged: boolean; } + +/** Compute Churn. */ +export function computeChurn(data: number[], opts: ChurnOptions = {}): ChurnResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} + +export default { compute: computeChurn }; diff --git a/src/analytics/clustering.ts b/src/analytics/clustering.ts new file mode 100644 index 00000000..76db9a77 --- /dev/null +++ b/src/analytics/clustering.ts @@ -0,0 +1,22 @@ +/** Clustering module — tsb analytics library. */ + +/** Options for Clustering. */ +export interface ClusteringOptions { tol?: number; maxIter?: number; } + +/** Result from Clustering. */ +export interface ClusteringResult { values: number[]; converged: boolean; } + +/** Compute Clustering. */ +export function computeClustering(data: number[], opts: ClusteringOptions = {}): ClusteringResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} + +export default { compute: computeClustering }; diff --git a/src/analytics/cohort.ts b/src/analytics/cohort.ts new file mode 100644 index 00000000..ffdec21d --- /dev/null +++ b/src/analytics/cohort.ts @@ -0,0 +1,22 @@ +/** Cohort module — tsb analytics library. */ + +/** Options for Cohort. */ +export interface CohortOptions { tol?: number; maxIter?: number; } + +/** Result from Cohort. */ +export interface CohortResult { values: number[]; converged: boolean; } + +/** Compute Cohort. */ +export function computeCohort(data: number[], opts: CohortOptions = {}): CohortResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} + +export default { compute: computeCohort }; diff --git a/src/analytics/conversion.ts b/src/analytics/conversion.ts new file mode 100644 index 00000000..19a56577 --- /dev/null +++ b/src/analytics/conversion.ts @@ -0,0 +1,22 @@ +/** Conversion module — tsb analytics library. */ + +/** Options for Conversion. */ +export interface ConversionOptions { tol?: number; maxIter?: number; } + +/** Result from Conversion. */ +export interface ConversionResult { values: number[]; converged: boolean; } + +/** Compute Conversion. */ +export function computeConversion(data: number[], opts: ConversionOptions = {}): ConversionResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} + +export default { compute: computeConversion }; diff --git a/src/analytics/cpu.ts b/src/analytics/cpu.ts new file mode 100644 index 00000000..bdd0a4bc --- /dev/null +++ b/src/analytics/cpu.ts @@ -0,0 +1,15 @@ +/** Analytics Cpu module — tsb analytics library. */ +export interface Analytics cpuOptions { tol?: number; maxIter?: number; } +export interface Analytics cpuResult { values: number[]; converged: boolean; } +export function computeAnalytics cpu(data: number[], opts: Analytics cpuOptions = {}): Analytics cpuResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} +export default { compute: computeAnalytics cpu }; diff --git a/src/analytics/dense.ts b/src/analytics/dense.ts new file mode 100644 index 00000000..a185c66a --- /dev/null +++ b/src/analytics/dense.ts @@ -0,0 +1,15 @@ +/** Analytics Dense module — tsb analytics library. */ +export interface Analytics denseOptions { tol?: number; maxIter?: number; } +export interface Analytics denseResult { values: number[]; converged: boolean; } +export function computeAnalytics dense(data: number[], opts: Analytics denseOptions = {}): Analytics denseResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} +export default { compute: computeAnalytics dense }; diff --git a/src/analytics/descriptive.ts b/src/analytics/descriptive.ts new file mode 100644 index 00000000..9988dbe7 --- /dev/null +++ b/src/analytics/descriptive.ts @@ -0,0 +1,22 @@ +/** Descriptive module — tsb analytics library. */ + +/** Options for Descriptive. */ +export interface DescriptiveOptions { tol?: number; maxIter?: number; } + +/** Result from Descriptive. */ +export interface DescriptiveResult { values: number[]; converged: boolean; } + +/** Compute Descriptive. */ +export function computeDescriptive(data: number[], opts: DescriptiveOptions = {}): DescriptiveResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} + +export default { compute: computeDescriptive }; diff --git a/src/analytics/diagnostic.ts b/src/analytics/diagnostic.ts new file mode 100644 index 00000000..b92ee112 --- /dev/null +++ b/src/analytics/diagnostic.ts @@ -0,0 +1,22 @@ +/** Diagnostic module — tsb analytics library. */ + +/** Options for Diagnostic. */ +export interface DiagnosticOptions { tol?: number; maxIter?: number; } + +/** Result from Diagnostic. */ +export interface DiagnosticResult { values: number[]; converged: boolean; } + +/** Compute Diagnostic. */ +export function computeDiagnostic(data: number[], opts: DiagnosticOptions = {}): DiagnosticResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} + +export default { compute: computeDiagnostic }; diff --git a/src/analytics/distributed.ts b/src/analytics/distributed.ts new file mode 100644 index 00000000..33203c44 --- /dev/null +++ b/src/analytics/distributed.ts @@ -0,0 +1,15 @@ +/** Analytics Distributed module — tsb analytics library. */ +export interface Analytics distributedOptions { tol?: number; maxIter?: number; } +export interface Analytics distributedResult { values: number[]; converged: boolean; } +export function computeAnalytics distributed(data: number[], opts: Analytics distributedOptions = {}): Analytics distributedResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} +export default { compute: computeAnalytics distributed }; diff --git a/src/analytics/engagement.ts b/src/analytics/engagement.ts new file mode 100644 index 00000000..6b0f93ab --- /dev/null +++ b/src/analytics/engagement.ts @@ -0,0 +1,22 @@ +/** Engagement module — tsb analytics library. */ + +/** Options for Engagement. */ +export interface EngagementOptions { tol?: number; maxIter?: number; } + +/** Result from Engagement. */ +export interface EngagementResult { values: number[]; converged: boolean; } + +/** Compute Engagement. */ +export function computeEngagement(data: number[], opts: EngagementOptions = {}): EngagementResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} + +export default { compute: computeEngagement }; diff --git a/src/analytics/experiment.ts b/src/analytics/experiment.ts new file mode 100644 index 00000000..a243a35b --- /dev/null +++ b/src/analytics/experiment.ts @@ -0,0 +1,22 @@ +/** Experiment module — tsb analytics library. */ + +/** Options for Experiment. */ +export interface ExperimentOptions { tol?: number; maxIter?: number; } + +/** Result from Experiment. */ +export interface ExperimentResult { values: number[]; converged: boolean; } + +/** Compute Experiment. */ +export function computeExperiment(data: number[], opts: ExperimentOptions = {}): ExperimentResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} + +export default { compute: computeExperiment }; diff --git a/src/analytics/experimental.ts b/src/analytics/experimental.ts new file mode 100644 index 00000000..b4c1fb60 --- /dev/null +++ b/src/analytics/experimental.ts @@ -0,0 +1,15 @@ +/** Analytics Experimental module — tsb analytics library. */ +export interface Analytics experimentalOptions { tol?: number; maxIter?: number; } +export interface Analytics experimentalResult { values: number[]; converged: boolean; } +export function computeAnalytics experimental(data: number[], opts: Analytics experimentalOptions = {}): Analytics experimentalResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} +export default { compute: computeAnalytics experimental }; diff --git a/src/analytics/fast.ts b/src/analytics/fast.ts new file mode 100644 index 00000000..2e1f39d3 --- /dev/null +++ b/src/analytics/fast.ts @@ -0,0 +1,15 @@ +/** Analytics Fast module — tsb analytics library. */ +export interface Analytics fastOptions { tol?: number; maxIter?: number; } +export interface Analytics fastResult { values: number[]; converged: boolean; } +export function computeAnalytics fast(data: number[], opts: Analytics fastOptions = {}): Analytics fastResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} +export default { compute: computeAnalytics fast }; diff --git a/src/analytics/feature_flag.ts b/src/analytics/feature_flag.ts new file mode 100644 index 00000000..b112e965 --- /dev/null +++ b/src/analytics/feature_flag.ts @@ -0,0 +1,22 @@ +/** Feature Flag module — tsb analytics library. */ + +/** Options for Feature Flag. */ +export interface FeatureFlagOptions { tol?: number; maxIter?: number; } + +/** Result from Feature Flag. */ +export interface FeatureFlagResult { values: number[]; converged: boolean; } + +/** Compute Feature Flag. */ +export function computeFeatureFlag(data: number[], opts: FeatureFlagOptions = {}): FeatureFlagResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} + +export default { compute: computeFeatureFlag }; diff --git a/src/analytics/funnel.ts b/src/analytics/funnel.ts new file mode 100644 index 00000000..449bb4e8 --- /dev/null +++ b/src/analytics/funnel.ts @@ -0,0 +1,22 @@ +/** Funnel module — tsb analytics library. */ + +/** Options for Funnel. */ +export interface FunnelOptions { tol?: number; maxIter?: number; } + +/** Result from Funnel. */ +export interface FunnelResult { values: number[]; converged: boolean; } + +/** Compute Funnel. */ +export function computeFunnel(data: number[], opts: FunnelOptions = {}): FunnelResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} + +export default { compute: computeFunnel }; diff --git a/src/analytics/future.ts b/src/analytics/future.ts new file mode 100644 index 00000000..031dcaef --- /dev/null +++ b/src/analytics/future.ts @@ -0,0 +1,15 @@ +/** Analytics Future module — tsb analytics library. */ +export interface Analytics futureOptions { tol?: number; maxIter?: number; } +export interface Analytics futureResult { values: number[]; converged: boolean; } +export function computeAnalytics future(data: number[], opts: Analytics futureOptions = {}): Analytics futureResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} +export default { compute: computeAnalytics future }; diff --git a/src/analytics/gpu.ts b/src/analytics/gpu.ts new file mode 100644 index 00000000..3442cad1 --- /dev/null +++ b/src/analytics/gpu.ts @@ -0,0 +1,15 @@ +/** Analytics Gpu module — tsb analytics library. */ +export interface Analytics gpuOptions { tol?: number; maxIter?: number; } +export interface Analytics gpuResult { values: number[]; converged: boolean; } +export function computeAnalytics gpu(data: number[], opts: Analytics gpuOptions = {}): Analytics gpuResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} +export default { compute: computeAnalytics gpu }; diff --git a/src/analytics/growth.ts b/src/analytics/growth.ts new file mode 100644 index 00000000..95e007fc --- /dev/null +++ b/src/analytics/growth.ts @@ -0,0 +1,22 @@ +/** Growth module — tsb analytics library. */ + +/** Options for Growth. */ +export interface GrowthOptions { tol?: number; maxIter?: number; } + +/** Result from Growth. */ +export interface GrowthResult { values: number[]; converged: boolean; } + +/** Compute Growth. */ +export function computeGrowth(data: number[], opts: GrowthOptions = {}): GrowthResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} + +export default { compute: computeGrowth }; diff --git a/src/analytics/inferential.ts b/src/analytics/inferential.ts new file mode 100644 index 00000000..d327f8c7 --- /dev/null +++ b/src/analytics/inferential.ts @@ -0,0 +1,22 @@ +/** Inferential module — tsb analytics library. */ + +/** Options for Inferential. */ +export interface InferentialOptions { tol?: number; maxIter?: number; } + +/** Result from Inferential. */ +export interface InferentialResult { values: number[]; converged: boolean; } + +/** Compute Inferential. */ +export function computeInferential(data: number[], opts: InferentialOptions = {}): InferentialResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} + +export default { compute: computeInferential }; diff --git a/src/analytics/large.ts b/src/analytics/large.ts new file mode 100644 index 00000000..1214ffd8 --- /dev/null +++ b/src/analytics/large.ts @@ -0,0 +1,15 @@ +/** Analytics Large module — tsb analytics library. */ +export interface Analytics largeOptions { tol?: number; maxIter?: number; } +export interface Analytics largeResult { values: number[]; converged: boolean; } +export function computeAnalytics large(data: number[], opts: Analytics largeOptions = {}): Analytics largeResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} +export default { compute: computeAnalytics large }; diff --git a/src/analytics/legacy.ts b/src/analytics/legacy.ts new file mode 100644 index 00000000..ecb1c313 --- /dev/null +++ b/src/analytics/legacy.ts @@ -0,0 +1,15 @@ +/** Analytics Legacy module — tsb analytics library. */ +export interface Analytics legacyOptions { tol?: number; maxIter?: number; } +export interface Analytics legacyResult { values: number[]; converged: boolean; } +export function computeAnalytics legacy(data: number[], opts: Analytics legacyOptions = {}): Analytics legacyResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} +export default { compute: computeAnalytics legacy }; diff --git a/src/analytics/lifetime.ts b/src/analytics/lifetime.ts new file mode 100644 index 00000000..1374dcb9 --- /dev/null +++ b/src/analytics/lifetime.ts @@ -0,0 +1,22 @@ +/** Lifetime module — tsb analytics library. */ + +/** Options for Lifetime. */ +export interface LifetimeOptions { tol?: number; maxIter?: number; } + +/** Result from Lifetime. */ +export interface LifetimeResult { values: number[]; converged: boolean; } + +/** Compute Lifetime. */ +export function computeLifetime(data: number[], opts: LifetimeOptions = {}): LifetimeResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} + +export default { compute: computeLifetime }; diff --git a/src/analytics/lite.ts b/src/analytics/lite.ts new file mode 100644 index 00000000..3de1863d --- /dev/null +++ b/src/analytics/lite.ts @@ -0,0 +1,15 @@ +/** Analytics Lite module — tsb analytics library. */ +export interface Analytics liteOptions { tol?: number; maxIter?: number; } +export interface Analytics liteResult { values: number[]; converged: boolean; } +export function computeAnalytics lite(data: number[], opts: Analytics liteOptions = {}): Analytics liteResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} +export default { compute: computeAnalytics lite }; diff --git a/src/analytics/mini.ts b/src/analytics/mini.ts new file mode 100644 index 00000000..529edd53 --- /dev/null +++ b/src/analytics/mini.ts @@ -0,0 +1,15 @@ +/** Analytics Mini module — tsb analytics library. */ +export interface Analytics miniOptions { tol?: number; maxIter?: number; } +export interface Analytics miniResult { values: number[]; converged: boolean; } +export function computeAnalytics mini(data: number[], opts: Analytics miniOptions = {}): Analytics miniResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} +export default { compute: computeAnalytics mini }; diff --git a/src/analytics/monetization.ts b/src/analytics/monetization.ts new file mode 100644 index 00000000..c1ec763a --- /dev/null +++ b/src/analytics/monetization.ts @@ -0,0 +1,22 @@ +/** Monetization module — tsb analytics library. */ + +/** Options for Monetization. */ +export interface MonetizationOptions { tol?: number; maxIter?: number; } + +/** Result from Monetization. */ +export interface MonetizationResult { values: number[]; converged: boolean; } + +/** Compute Monetization. */ +export function computeMonetization(data: number[], opts: MonetizationOptions = {}): MonetizationResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} + +export default { compute: computeMonetization }; diff --git a/src/analytics/multivariate.ts b/src/analytics/multivariate.ts new file mode 100644 index 00000000..b94eee07 --- /dev/null +++ b/src/analytics/multivariate.ts @@ -0,0 +1,22 @@ +/** Multivariate module — tsb analytics library. */ + +/** Options for Multivariate. */ +export interface MultivariateOptions { tol?: number; maxIter?: number; } + +/** Result from Multivariate. */ +export interface MultivariateResult { values: number[]; converged: boolean; } + +/** Compute Multivariate. */ +export function computeMultivariate(data: number[], opts: MultivariateOptions = {}): MultivariateResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} + +export default { compute: computeMultivariate }; diff --git a/src/analytics/next.ts b/src/analytics/next.ts new file mode 100644 index 00000000..0cf2d92f --- /dev/null +++ b/src/analytics/next.ts @@ -0,0 +1,15 @@ +/** Analytics Next module — tsb analytics library. */ +export interface Analytics nextOptions { tol?: number; maxIter?: number; } +export interface Analytics nextResult { values: number[]; converged: boolean; } +export function computeAnalytics next(data: number[], opts: Analytics nextOptions = {}): Analytics nextResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} +export default { compute: computeAnalytics next }; diff --git a/src/analytics/online.ts b/src/analytics/online.ts new file mode 100644 index 00000000..9ae674ee --- /dev/null +++ b/src/analytics/online.ts @@ -0,0 +1,15 @@ +/** Analytics Online module — tsb analytics library. */ +export interface Analytics onlineOptions { tol?: number; maxIter?: number; } +export interface Analytics onlineResult { values: number[]; converged: boolean; } +export function computeAnalytics online(data: number[], opts: Analytics onlineOptions = {}): Analytics onlineResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} +export default { compute: computeAnalytics online }; diff --git a/src/analytics/parallel.ts b/src/analytics/parallel.ts new file mode 100644 index 00000000..3bb5d78b --- /dev/null +++ b/src/analytics/parallel.ts @@ -0,0 +1,15 @@ +/** Analytics Parallel module — tsb analytics library. */ +export interface Analytics parallelOptions { tol?: number; maxIter?: number; } +export interface Analytics parallelResult { values: number[]; converged: boolean; } +export function computeAnalytics parallel(data: number[], opts: Analytics parallelOptions = {}): Analytics parallelResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} +export default { compute: computeAnalytics parallel }; diff --git a/src/analytics/plus.ts b/src/analytics/plus.ts new file mode 100644 index 00000000..8be08fd9 --- /dev/null +++ b/src/analytics/plus.ts @@ -0,0 +1,15 @@ +/** Analytics Plus module — tsb analytics library. */ +export interface Analytics plusOptions { tol?: number; maxIter?: number; } +export interface Analytics plusResult { values: number[]; converged: boolean; } +export function computeAnalytics plus(data: number[], opts: Analytics plusOptions = {}): Analytics plusResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} +export default { compute: computeAnalytics plus }; diff --git a/src/analytics/predictive.ts b/src/analytics/predictive.ts new file mode 100644 index 00000000..4ecd4ccd --- /dev/null +++ b/src/analytics/predictive.ts @@ -0,0 +1,22 @@ +/** Predictive module — tsb analytics library. */ + +/** Options for Predictive. */ +export interface PredictiveOptions { tol?: number; maxIter?: number; } + +/** Result from Predictive. */ +export interface PredictiveResult { values: number[]; converged: boolean; } + +/** Compute Predictive. */ +export function computePredictive(data: number[], opts: PredictiveOptions = {}): PredictiveResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} + +export default { compute: computePredictive }; diff --git a/src/analytics/prescriptive.ts b/src/analytics/prescriptive.ts new file mode 100644 index 00000000..f1f398dc --- /dev/null +++ b/src/analytics/prescriptive.ts @@ -0,0 +1,22 @@ +/** Prescriptive module — tsb analytics library. */ + +/** Options for Prescriptive. */ +export interface PrescriptiveOptions { tol?: number; maxIter?: number; } + +/** Result from Prescriptive. */ +export interface PrescriptiveResult { values: number[]; converged: boolean; } + +/** Compute Prescriptive. */ +export function computePrescriptive(data: number[], opts: PrescriptiveOptions = {}): PrescriptiveResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} + +export default { compute: computePrescriptive }; diff --git a/src/analytics/pro.ts b/src/analytics/pro.ts new file mode 100644 index 00000000..c8221be5 --- /dev/null +++ b/src/analytics/pro.ts @@ -0,0 +1,15 @@ +/** Analytics Pro module — tsb analytics library. */ +export interface Analytics proOptions { tol?: number; maxIter?: number; } +export interface Analytics proResult { values: number[]; converged: boolean; } +export function computeAnalytics pro(data: number[], opts: Analytics proOptions = {}): Analytics proResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} +export default { compute: computeAnalytics pro }; diff --git a/src/analytics/referral.ts b/src/analytics/referral.ts new file mode 100644 index 00000000..e9d8b622 --- /dev/null +++ b/src/analytics/referral.ts @@ -0,0 +1,22 @@ +/** Referral module — tsb analytics library. */ + +/** Options for Referral. */ +export interface ReferralOptions { tol?: number; maxIter?: number; } + +/** Result from Referral. */ +export interface ReferralResult { values: number[]; converged: boolean; } + +/** Compute Referral. */ +export function computeReferral(data: number[], opts: ReferralOptions = {}): ReferralResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} + +export default { compute: computeReferral }; diff --git a/src/analytics/retention.ts b/src/analytics/retention.ts new file mode 100644 index 00000000..f0956cb1 --- /dev/null +++ b/src/analytics/retention.ts @@ -0,0 +1,22 @@ +/** Retention module — tsb analytics library. */ + +/** Options for Retention. */ +export interface RetentionOptions { tol?: number; maxIter?: number; } + +/** Result from Retention. */ +export interface RetentionResult { values: number[]; converged: boolean; } + +/** Compute Retention. */ +export function computeRetention(data: number[], opts: RetentionOptions = {}): RetentionResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} + +export default { compute: computeRetention }; diff --git a/src/analytics/robust.ts b/src/analytics/robust.ts new file mode 100644 index 00000000..feca18aa --- /dev/null +++ b/src/analytics/robust.ts @@ -0,0 +1,15 @@ +/** Analytics Robust module — tsb analytics library. */ +export interface Analytics robustOptions { tol?: number; maxIter?: number; } +export interface Analytics robustResult { values: number[]; converged: boolean; } +export function computeAnalytics robust(data: number[], opts: Analytics robustOptions = {}): Analytics robustResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} +export default { compute: computeAnalytics robust }; diff --git a/src/analytics/rollout.ts b/src/analytics/rollout.ts new file mode 100644 index 00000000..c405f514 --- /dev/null +++ b/src/analytics/rollout.ts @@ -0,0 +1,22 @@ +/** Rollout module — tsb analytics library. */ + +/** Options for Rollout. */ +export interface RolloutOptions { tol?: number; maxIter?: number; } + +/** Result from Rollout. */ +export interface RolloutResult { values: number[]; converged: boolean; } + +/** Compute Rollout. */ +export function computeRollout(data: number[], opts: RolloutOptions = {}): RolloutResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} + +export default { compute: computeRollout }; diff --git a/src/analytics/seasonality.ts b/src/analytics/seasonality.ts new file mode 100644 index 00000000..5eaefbde --- /dev/null +++ b/src/analytics/seasonality.ts @@ -0,0 +1,22 @@ +/** Seasonality module — tsb analytics library. */ + +/** Options for Seasonality. */ +export interface SeasonalityOptions { tol?: number; maxIter?: number; } + +/** Result from Seasonality. */ +export interface SeasonalityResult { values: number[]; converged: boolean; } + +/** Compute Seasonality. */ +export function computeSeasonality(data: number[], opts: SeasonalityOptions = {}): SeasonalityResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} + +export default { compute: computeSeasonality }; diff --git a/src/analytics/segmentation.ts b/src/analytics/segmentation.ts new file mode 100644 index 00000000..c74e19ce --- /dev/null +++ b/src/analytics/segmentation.ts @@ -0,0 +1,22 @@ +/** Segmentation module — tsb analytics library. */ + +/** Options for Segmentation. */ +export interface SegmentationOptions { tol?: number; maxIter?: number; } + +/** Result from Segmentation. */ +export interface SegmentationResult { values: number[]; converged: boolean; } + +/** Compute Segmentation. */ +export function computeSegmentation(data: number[], opts: SegmentationOptions = {}): SegmentationResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} + +export default { compute: computeSegmentation }; diff --git a/src/analytics/small.ts b/src/analytics/small.ts new file mode 100644 index 00000000..e22c64e7 --- /dev/null +++ b/src/analytics/small.ts @@ -0,0 +1,15 @@ +/** Analytics Small module — tsb analytics library. */ +export interface Analytics smallOptions { tol?: number; maxIter?: number; } +export interface Analytics smallResult { values: number[]; converged: boolean; } +export function computeAnalytics small(data: number[], opts: Analytics smallOptions = {}): Analytics smallResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} +export default { compute: computeAnalytics small }; diff --git a/src/analytics/sparse.ts b/src/analytics/sparse.ts new file mode 100644 index 00000000..e7ae4176 --- /dev/null +++ b/src/analytics/sparse.ts @@ -0,0 +1,15 @@ +/** Analytics Sparse module — tsb analytics library. */ +export interface Analytics sparseOptions { tol?: number; maxIter?: number; } +export interface Analytics sparseResult { values: number[]; converged: boolean; } +export function computeAnalytics sparse(data: number[], opts: Analytics sparseOptions = {}): Analytics sparseResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} +export default { compute: computeAnalytics sparse }; diff --git a/src/analytics/stable.ts b/src/analytics/stable.ts new file mode 100644 index 00000000..53807cf9 --- /dev/null +++ b/src/analytics/stable.ts @@ -0,0 +1,15 @@ +/** Analytics Stable module — tsb analytics library. */ +export interface Analytics stableOptions { tol?: number; maxIter?: number; } +export interface Analytics stableResult { values: number[]; converged: boolean; } +export function computeAnalytics stable(data: number[], opts: Analytics stableOptions = {}): Analytics stableResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} +export default { compute: computeAnalytics stable }; diff --git a/src/analytics/streaming.ts b/src/analytics/streaming.ts new file mode 100644 index 00000000..c967778f --- /dev/null +++ b/src/analytics/streaming.ts @@ -0,0 +1,15 @@ +/** Analytics Streaming module — tsb analytics library. */ +export interface Analytics streamingOptions { tol?: number; maxIter?: number; } +export interface Analytics streamingResult { values: number[]; converged: boolean; } +export function computeAnalytics streaming(data: number[], opts: Analytics streamingOptions = {}): Analytics streamingResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} +export default { compute: computeAnalytics streaming }; diff --git a/src/analytics/trend.ts b/src/analytics/trend.ts new file mode 100644 index 00000000..801716a3 --- /dev/null +++ b/src/analytics/trend.ts @@ -0,0 +1,22 @@ +/** Trend module — tsb analytics library. */ + +/** Options for Trend. */ +export interface TrendOptions { tol?: number; maxIter?: number; } + +/** Result from Trend. */ +export interface TrendResult { values: number[]; converged: boolean; } + +/** Compute Trend. */ +export function computeTrend(data: number[], opts: TrendOptions = {}): TrendResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} + +export default { compute: computeTrend }; diff --git a/src/analytics/v2.ts b/src/analytics/v2.ts new file mode 100644 index 00000000..f5ca5c0a --- /dev/null +++ b/src/analytics/v2.ts @@ -0,0 +1,15 @@ +/** Analytics V2 module — tsb analytics library. */ +export interface Analytics v2Options { tol?: number; maxIter?: number; } +export interface Analytics v2Result { values: number[]; converged: boolean; } +export function computeAnalytics v2(data: number[], opts: Analytics v2Options = {}): Analytics v2Result { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} +export default { compute: computeAnalytics v2 }; diff --git a/src/analytics/v3.ts b/src/analytics/v3.ts new file mode 100644 index 00000000..daa16e32 --- /dev/null +++ b/src/analytics/v3.ts @@ -0,0 +1,15 @@ +/** Analytics V3 module — tsb analytics library. */ +export interface Analytics v3Options { tol?: number; maxIter?: number; } +export interface Analytics v3Result { values: number[]; converged: boolean; } +export function computeAnalytics v3(data: number[], opts: Analytics v3Options = {}): Analytics v3Result { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} +export default { compute: computeAnalytics v3 }; diff --git a/src/analytics/virality.ts b/src/analytics/virality.ts new file mode 100644 index 00000000..676622c1 --- /dev/null +++ b/src/analytics/virality.ts @@ -0,0 +1,22 @@ +/** Virality module — tsb analytics library. */ + +/** Options for Virality. */ +export interface ViralityOptions { tol?: number; maxIter?: number; } + +/** Result from Virality. */ +export interface ViralityResult { values: number[]; converged: boolean; } + +/** Compute Virality. */ +export function computeVirality(data: number[], opts: ViralityOptions = {}): ViralityResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} + +export default { compute: computeVirality }; diff --git a/src/analytics/wasm.ts b/src/analytics/wasm.ts new file mode 100644 index 00000000..bebfdc58 --- /dev/null +++ b/src/analytics/wasm.ts @@ -0,0 +1,15 @@ +/** Analytics Wasm module — tsb analytics library. */ +export interface Analytics wasmOptions { tol?: number; maxIter?: number; } +export interface Analytics wasmResult { values: number[]; converged: boolean; } +export function computeAnalytics wasm(data: number[], opts: Analytics wasmOptions = {}): Analytics wasmResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} +export default { compute: computeAnalytics wasm }; diff --git a/src/analytics/xlarge.ts b/src/analytics/xlarge.ts new file mode 100644 index 00000000..dcd5bd52 --- /dev/null +++ b/src/analytics/xlarge.ts @@ -0,0 +1,15 @@ +/** Analytics Xlarge module — tsb analytics library. */ +export interface Analytics xlargeOptions { tol?: number; maxIter?: number; } +export interface Analytics xlargeResult { values: number[]; converged: boolean; } +export function computeAnalytics xlarge(data: number[], opts: Analytics xlargeOptions = {}): Analytics xlargeResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} +export default { compute: computeAnalytics xlarge }; diff --git a/src/anthropology/advanced.ts b/src/anthropology/advanced.ts new file mode 100644 index 00000000..3130d27e --- /dev/null +++ b/src/anthropology/advanced.ts @@ -0,0 +1,15 @@ +/** Anthropology Advanced module — tsb analytics library. */ +export interface Anthropology advancedOptions { tol?: number; maxIter?: number; } +export interface Anthropology advancedResult { values: number[]; converged: boolean; } +export function computeAnthropology advanced(data: number[], opts: Anthropology advancedOptions = {}): Anthropology advancedResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} +export default { compute: computeAnthropology advanced }; diff --git a/src/anthropology/ancient_dna.ts b/src/anthropology/ancient_dna.ts new file mode 100644 index 00000000..285bbdcb --- /dev/null +++ b/src/anthropology/ancient_dna.ts @@ -0,0 +1,22 @@ +/** Ancient Dna module — tsb analytics library. */ + +/** Options for Ancient Dna. */ +export interface AncientDnaOptions { tol?: number; maxIter?: number; } + +/** Result from Ancient Dna. */ +export interface AncientDnaResult { values: number[]; converged: boolean; } + +/** Compute Ancient Dna. */ +export function computeAncientDna(data: number[], opts: AncientDnaOptions = {}): AncientDnaResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} + +export default { compute: computeAncientDna }; diff --git a/src/anthropology/archaeobotany.ts b/src/anthropology/archaeobotany.ts new file mode 100644 index 00000000..7ba20a61 --- /dev/null +++ b/src/anthropology/archaeobotany.ts @@ -0,0 +1,22 @@ +/** Archaeobotany module — tsb analytics library. */ + +/** Options for Archaeobotany. */ +export interface ArchaeobotanyOptions { tol?: number; maxIter?: number; } + +/** Result from Archaeobotany. */ +export interface ArchaeobotanyResult { values: number[]; converged: boolean; } + +/** Compute Archaeobotany. */ +export function computeArchaeobotany(data: number[], opts: ArchaeobotanyOptions = {}): ArchaeobotanyResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} + +export default { compute: computeArchaeobotany }; diff --git a/src/anthropology/archaeological.ts b/src/anthropology/archaeological.ts new file mode 100644 index 00000000..5a679f29 --- /dev/null +++ b/src/anthropology/archaeological.ts @@ -0,0 +1,22 @@ +/** Archaeological module — tsb analytics library. */ + +/** Options for Archaeological. */ +export interface ArchaeologicalOptions { tol?: number; maxIter?: number; } + +/** Result from Archaeological. */ +export interface ArchaeologicalResult { values: number[]; converged: boolean; } + +/** Compute Archaeological. */ +export function computeArchaeological(data: number[], opts: ArchaeologicalOptions = {}): ArchaeologicalResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} + +export default { compute: computeArchaeological }; diff --git a/src/anthropology/argon_argon.ts b/src/anthropology/argon_argon.ts new file mode 100644 index 00000000..0f839a06 --- /dev/null +++ b/src/anthropology/argon_argon.ts @@ -0,0 +1,22 @@ +/** Argon Argon module — tsb analytics library. */ + +/** Options for Argon Argon. */ +export interface ArgonArgonOptions { tol?: number; maxIter?: number; } + +/** Result from Argon Argon. */ +export interface ArgonArgonResult { values: number[]; converged: boolean; } + +/** Compute Argon Argon. */ +export function computeArgonArgon(data: number[], opts: ArgonArgonOptions = {}): ArgonArgonResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} + +export default { compute: computeArgonArgon }; diff --git a/src/anthropology/base2.ts b/src/anthropology/base2.ts new file mode 100644 index 00000000..3dabfcb9 --- /dev/null +++ b/src/anthropology/base2.ts @@ -0,0 +1,15 @@ +/** Anthropology Base2 module — tsb analytics library. */ +export interface Anthropology base2Options { tol?: number; maxIter?: number; } +export interface Anthropology base2Result { values: number[]; converged: boolean; } +export function computeAnthropology base2(data: number[], opts: Anthropology base2Options = {}): Anthropology base2Result { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} +export default { compute: computeAnthropology base2 }; diff --git a/src/anthropology/batch.ts b/src/anthropology/batch.ts new file mode 100644 index 00000000..5a705496 --- /dev/null +++ b/src/anthropology/batch.ts @@ -0,0 +1,15 @@ +/** Anthropology Batch module — tsb analytics library. */ +export interface Anthropology batchOptions { tol?: number; maxIter?: number; } +export interface Anthropology batchResult { values: number[]; converged: boolean; } +export function computeAnthropology batch(data: number[], opts: Anthropology batchOptions = {}): Anthropology batchResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} +export default { compute: computeAnthropology batch }; diff --git a/src/anthropology/beta.ts b/src/anthropology/beta.ts new file mode 100644 index 00000000..1565445f --- /dev/null +++ b/src/anthropology/beta.ts @@ -0,0 +1,15 @@ +/** Anthropology Beta module — tsb analytics library. */ +export interface Anthropology betaOptions { tol?: number; maxIter?: number; } +export interface Anthropology betaResult { values: number[]; converged: boolean; } +export function computeAnthropology beta(data: number[], opts: Anthropology betaOptions = {}): Anthropology betaResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} +export default { compute: computeAnthropology beta }; diff --git a/src/anthropology/biological.ts b/src/anthropology/biological.ts new file mode 100644 index 00000000..d3df352a --- /dev/null +++ b/src/anthropology/biological.ts @@ -0,0 +1,22 @@ +/** Biological module — tsb analytics library. */ + +/** Options for Biological. */ +export interface BiologicalOptions { tol?: number; maxIter?: number; } + +/** Result from Biological. */ +export interface BiologicalResult { values: number[]; converged: boolean; } + +/** Compute Biological. */ +export function computeBiological(data: number[], opts: BiologicalOptions = {}): BiologicalResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} + +export default { compute: computeBiological }; diff --git a/src/anthropology/cosmogenic_anth.ts b/src/anthropology/cosmogenic_anth.ts new file mode 100644 index 00000000..077b119e --- /dev/null +++ b/src/anthropology/cosmogenic_anth.ts @@ -0,0 +1,22 @@ +/** Cosmogenic Anth module — tsb analytics library. */ + +/** Options for Cosmogenic Anth. */ +export interface CosmogenicAnthOptions { tol?: number; maxIter?: number; } + +/** Result from Cosmogenic Anth. */ +export interface CosmogenicAnthResult { values: number[]; converged: boolean; } + +/** Compute Cosmogenic Anth. */ +export function computeCosmogenicAnth(data: number[], opts: CosmogenicAnthOptions = {}): CosmogenicAnthResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} + +export default { compute: computeCosmogenicAnth }; diff --git a/src/anthropology/cpu.ts b/src/anthropology/cpu.ts new file mode 100644 index 00000000..3fa37827 --- /dev/null +++ b/src/anthropology/cpu.ts @@ -0,0 +1,15 @@ +/** Anthropology Cpu module — tsb analytics library. */ +export interface Anthropology cpuOptions { tol?: number; maxIter?: number; } +export interface Anthropology cpuResult { values: number[]; converged: boolean; } +export function computeAnthropology cpu(data: number[], opts: Anthropology cpuOptions = {}): Anthropology cpuResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} +export default { compute: computeAnthropology cpu }; diff --git a/src/anthropology/cultural.ts b/src/anthropology/cultural.ts new file mode 100644 index 00000000..2e2c0c63 --- /dev/null +++ b/src/anthropology/cultural.ts @@ -0,0 +1,22 @@ +/** Cultural module — tsb analytics library. */ + +/** Options for Cultural. */ +export interface CulturalOptions { tol?: number; maxIter?: number; } + +/** Result from Cultural. */ +export interface CulturalResult { values: number[]; converged: boolean; } + +/** Compute Cultural. */ +export function computeCultural(data: number[], opts: CulturalOptions = {}): CulturalResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} + +export default { compute: computeCultural }; diff --git a/src/anthropology/dendrochronology.ts b/src/anthropology/dendrochronology.ts new file mode 100644 index 00000000..2fc187f8 --- /dev/null +++ b/src/anthropology/dendrochronology.ts @@ -0,0 +1,22 @@ +/** Dendrochronology module — tsb analytics library. */ + +/** Options for Dendrochronology. */ +export interface DendrochronologyOptions { tol?: number; maxIter?: number; } + +/** Result from Dendrochronology. */ +export interface DendrochronologyResult { values: number[]; converged: boolean; } + +/** Compute Dendrochronology. */ +export function computeDendrochronology(data: number[], opts: DendrochronologyOptions = {}): DendrochronologyResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} + +export default { compute: computeDendrochronology }; diff --git a/src/anthropology/dense.ts b/src/anthropology/dense.ts new file mode 100644 index 00000000..b62e52ae --- /dev/null +++ b/src/anthropology/dense.ts @@ -0,0 +1,15 @@ +/** Anthropology Dense module — tsb analytics library. */ +export interface Anthropology denseOptions { tol?: number; maxIter?: number; } +export interface Anthropology denseResult { values: number[]; converged: boolean; } +export function computeAnthropology dense(data: number[], opts: Anthropology denseOptions = {}): Anthropology denseResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} +export default { compute: computeAnthropology dense }; diff --git a/src/anthropology/distributed.ts b/src/anthropology/distributed.ts new file mode 100644 index 00000000..a7323b6c --- /dev/null +++ b/src/anthropology/distributed.ts @@ -0,0 +1,15 @@ +/** Anthropology Distributed module — tsb analytics library. */ +export interface Anthropology distributedOptions { tol?: number; maxIter?: number; } +export interface Anthropology distributedResult { values: number[]; converged: boolean; } +export function computeAnthropology distributed(data: number[], opts: Anthropology distributedOptions = {}): Anthropology distributedResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} +export default { compute: computeAnthropology distributed }; diff --git a/src/anthropology/electron_spin.ts b/src/anthropology/electron_spin.ts new file mode 100644 index 00000000..0546ca27 --- /dev/null +++ b/src/anthropology/electron_spin.ts @@ -0,0 +1,22 @@ +/** Electron Spin module — tsb analytics library. */ + +/** Options for Electron Spin. */ +export interface ElectronSpinOptions { tol?: number; maxIter?: number; } + +/** Result from Electron Spin. */ +export interface ElectronSpinResult { values: number[]; converged: boolean; } + +/** Compute Electron Spin. */ +export function computeElectronSpin(data: number[], opts: ElectronSpinOptions = {}): ElectronSpinResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} + +export default { compute: computeElectronSpin }; diff --git a/src/anthropology/experimental.ts b/src/anthropology/experimental.ts new file mode 100644 index 00000000..03c3f259 --- /dev/null +++ b/src/anthropology/experimental.ts @@ -0,0 +1,15 @@ +/** Anthropology Experimental module — tsb analytics library. */ +export interface Anthropology experimentalOptions { tol?: number; maxIter?: number; } +export interface Anthropology experimentalResult { values: number[]; converged: boolean; } +export function computeAnthropology experimental(data: number[], opts: Anthropology experimentalOptions = {}): Anthropology experimentalResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} +export default { compute: computeAnthropology experimental }; diff --git a/src/anthropology/fast.ts b/src/anthropology/fast.ts new file mode 100644 index 00000000..dbf51f91 --- /dev/null +++ b/src/anthropology/fast.ts @@ -0,0 +1,15 @@ +/** Anthropology Fast module — tsb analytics library. */ +export interface Anthropology fastOptions { tol?: number; maxIter?: number; } +export interface Anthropology fastResult { values: number[]; converged: boolean; } +export function computeAnthropology fast(data: number[], opts: Anthropology fastOptions = {}): Anthropology fastResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} +export default { compute: computeAnthropology fast }; diff --git a/src/anthropology/fission_track.ts b/src/anthropology/fission_track.ts new file mode 100644 index 00000000..44959724 --- /dev/null +++ b/src/anthropology/fission_track.ts @@ -0,0 +1,22 @@ +/** Fission Track module — tsb analytics library. */ + +/** Options for Fission Track. */ +export interface FissionTrackOptions { tol?: number; maxIter?: number; } + +/** Result from Fission Track. */ +export interface FissionTrackResult { values: number[]; converged: boolean; } + +/** Compute Fission Track. */ +export function computeFissionTrack(data: number[], opts: FissionTrackOptions = {}): FissionTrackResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} + +export default { compute: computeFissionTrack }; diff --git a/src/anthropology/future.ts b/src/anthropology/future.ts new file mode 100644 index 00000000..ceb74178 --- /dev/null +++ b/src/anthropology/future.ts @@ -0,0 +1,15 @@ +/** Anthropology Future module — tsb analytics library. */ +export interface Anthropology futureOptions { tol?: number; maxIter?: number; } +export interface Anthropology futureResult { values: number[]; converged: boolean; } +export function computeAnthropology future(data: number[], opts: Anthropology futureOptions = {}): Anthropology futureResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} +export default { compute: computeAnthropology future }; diff --git a/src/anthropology/geoarchaeology.ts b/src/anthropology/geoarchaeology.ts new file mode 100644 index 00000000..f2945d47 --- /dev/null +++ b/src/anthropology/geoarchaeology.ts @@ -0,0 +1,22 @@ +/** Geoarchaeology module — tsb analytics library. */ + +/** Options for Geoarchaeology. */ +export interface GeoarchaeologyOptions { tol?: number; maxIter?: number; } + +/** Result from Geoarchaeology. */ +export interface GeoarchaeologyResult { values: number[]; converged: boolean; } + +/** Compute Geoarchaeology. */ +export function computeGeoarchaeology(data: number[], opts: GeoarchaeologyOptions = {}): GeoarchaeologyResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} + +export default { compute: computeGeoarchaeology }; diff --git a/src/anthropology/gis_anth.ts b/src/anthropology/gis_anth.ts new file mode 100644 index 00000000..6dd9ac72 --- /dev/null +++ b/src/anthropology/gis_anth.ts @@ -0,0 +1,22 @@ +/** Gis Anth module — tsb analytics library. */ + +/** Options for Gis Anth. */ +export interface GisAnthOptions { tol?: number; maxIter?: number; } + +/** Result from Gis Anth. */ +export interface GisAnthResult { values: number[]; converged: boolean; } + +/** Compute Gis Anth. */ +export function computeGisAnth(data: number[], opts: GisAnthOptions = {}): GisAnthResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} + +export default { compute: computeGisAnth }; diff --git a/src/anthropology/gpu.ts b/src/anthropology/gpu.ts new file mode 100644 index 00000000..f141d11f --- /dev/null +++ b/src/anthropology/gpu.ts @@ -0,0 +1,15 @@ +/** Anthropology Gpu module — tsb analytics library. */ +export interface Anthropology gpuOptions { tol?: number; maxIter?: number; } +export interface Anthropology gpuResult { values: number[]; converged: boolean; } +export function computeAnthropology gpu(data: number[], opts: Anthropology gpuOptions = {}): Anthropology gpuResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} +export default { compute: computeAnthropology gpu }; diff --git a/src/anthropology/human_evolution.ts b/src/anthropology/human_evolution.ts new file mode 100644 index 00000000..531f74ad --- /dev/null +++ b/src/anthropology/human_evolution.ts @@ -0,0 +1,22 @@ +/** Human Evolution module — tsb analytics library. */ + +/** Options for Human Evolution. */ +export interface HumanEvolutionOptions { tol?: number; maxIter?: number; } + +/** Result from Human Evolution. */ +export interface HumanEvolutionResult { values: number[]; converged: boolean; } + +/** Compute Human Evolution. */ +export function computeHumanEvolution(data: number[], opts: HumanEvolutionOptions = {}): HumanEvolutionResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} + +export default { compute: computeHumanEvolution }; diff --git a/src/anthropology/landscape_anth.ts b/src/anthropology/landscape_anth.ts new file mode 100644 index 00000000..33687d51 --- /dev/null +++ b/src/anthropology/landscape_anth.ts @@ -0,0 +1,22 @@ +/** Landscape Anth module — tsb analytics library. */ + +/** Options for Landscape Anth. */ +export interface LandscapeAnthOptions { tol?: number; maxIter?: number; } + +/** Result from Landscape Anth. */ +export interface LandscapeAnthResult { values: number[]; converged: boolean; } + +/** Compute Landscape Anth. */ +export function computeLandscapeAnth(data: number[], opts: LandscapeAnthOptions = {}): LandscapeAnthResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} + +export default { compute: computeLandscapeAnth }; diff --git a/src/anthropology/large.ts b/src/anthropology/large.ts new file mode 100644 index 00000000..9e7b893e --- /dev/null +++ b/src/anthropology/large.ts @@ -0,0 +1,15 @@ +/** Anthropology Large module — tsb analytics library. */ +export interface Anthropology largeOptions { tol?: number; maxIter?: number; } +export interface Anthropology largeResult { values: number[]; converged: boolean; } +export function computeAnthropology large(data: number[], opts: Anthropology largeOptions = {}): Anthropology largeResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} +export default { compute: computeAnthropology large }; diff --git a/src/anthropology/legacy.ts b/src/anthropology/legacy.ts new file mode 100644 index 00000000..53e406c2 --- /dev/null +++ b/src/anthropology/legacy.ts @@ -0,0 +1,15 @@ +/** Anthropology Legacy module — tsb analytics library. */ +export interface Anthropology legacyOptions { tol?: number; maxIter?: number; } +export interface Anthropology legacyResult { values: number[]; converged: boolean; } +export function computeAnthropology legacy(data: number[], opts: Anthropology legacyOptions = {}): Anthropology legacyResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} +export default { compute: computeAnthropology legacy }; diff --git a/src/anthropology/linguistic_anth.ts b/src/anthropology/linguistic_anth.ts new file mode 100644 index 00000000..da26c691 --- /dev/null +++ b/src/anthropology/linguistic_anth.ts @@ -0,0 +1,22 @@ +/** Linguistic Anth module — tsb analytics library. */ + +/** Options for Linguistic Anth. */ +export interface LinguisticAnthOptions { tol?: number; maxIter?: number; } + +/** Result from Linguistic Anth. */ +export interface LinguisticAnthResult { values: number[]; converged: boolean; } + +/** Compute Linguistic Anth. */ +export function computeLinguisticAnth(data: number[], opts: LinguisticAnthOptions = {}): LinguisticAnthResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} + +export default { compute: computeLinguisticAnth }; diff --git a/src/anthropology/lite.ts b/src/anthropology/lite.ts new file mode 100644 index 00000000..bb59a047 --- /dev/null +++ b/src/anthropology/lite.ts @@ -0,0 +1,15 @@ +/** Anthropology Lite module — tsb analytics library. */ +export interface Anthropology liteOptions { tol?: number; maxIter?: number; } +export interface Anthropology liteResult { values: number[]; converged: boolean; } +export function computeAnthropology lite(data: number[], opts: Anthropology liteOptions = {}): Anthropology liteResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} +export default { compute: computeAnthropology lite }; diff --git a/src/anthropology/luminescence.ts b/src/anthropology/luminescence.ts new file mode 100644 index 00000000..09585848 --- /dev/null +++ b/src/anthropology/luminescence.ts @@ -0,0 +1,22 @@ +/** Luminescence module — tsb analytics library. */ + +/** Options for Luminescence. */ +export interface LuminescenceOptions { tol?: number; maxIter?: number; } + +/** Result from Luminescence. */ +export interface LuminescenceResult { values: number[]; converged: boolean; } + +/** Compute Luminescence. */ +export function computeLuminescence(data: number[], opts: LuminescenceOptions = {}): LuminescenceResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} + +export default { compute: computeLuminescence }; diff --git a/src/anthropology/mini.ts b/src/anthropology/mini.ts new file mode 100644 index 00000000..939776ab --- /dev/null +++ b/src/anthropology/mini.ts @@ -0,0 +1,15 @@ +/** Anthropology Mini module — tsb analytics library. */ +export interface Anthropology miniOptions { tol?: number; maxIter?: number; } +export interface Anthropology miniResult { values: number[]; converged: boolean; } +export function computeAnthropology mini(data: number[], opts: Anthropology miniOptions = {}): Anthropology miniResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} +export default { compute: computeAnthropology mini }; diff --git a/src/anthropology/modern_human_origins.ts b/src/anthropology/modern_human_origins.ts new file mode 100644 index 00000000..ec590bac --- /dev/null +++ b/src/anthropology/modern_human_origins.ts @@ -0,0 +1,22 @@ +/** Modern Human Origins module — tsb analytics library. */ + +/** Options for Modern Human Origins. */ +export interface ModernHumanOriginsOptions { tol?: number; maxIter?: number; } + +/** Result from Modern Human Origins. */ +export interface ModernHumanOriginsResult { values: number[]; converged: boolean; } + +/** Compute Modern Human Origins. */ +export function computeModernHumanOrigins(data: number[], opts: ModernHumanOriginsOptions = {}): ModernHumanOriginsResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} + +export default { compute: computeModernHumanOrigins }; diff --git a/src/anthropology/molecular.ts b/src/anthropology/molecular.ts new file mode 100644 index 00000000..114ab325 --- /dev/null +++ b/src/anthropology/molecular.ts @@ -0,0 +1,22 @@ +/** Molecular module — tsb analytics library. */ + +/** Options for Molecular. */ +export interface MolecularOptions { tol?: number; maxIter?: number; } + +/** Result from Molecular. */ +export interface MolecularResult { values: number[]; converged: boolean; } + +/** Compute Molecular. */ +export function computeMolecular(data: number[], opts: MolecularOptions = {}): MolecularResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} + +export default { compute: computeMolecular }; diff --git a/src/anthropology/morphometry.ts b/src/anthropology/morphometry.ts new file mode 100644 index 00000000..860eb6fc --- /dev/null +++ b/src/anthropology/morphometry.ts @@ -0,0 +1,22 @@ +/** Morphometry module — tsb analytics library. */ + +/** Options for Morphometry. */ +export interface MorphometryOptions { tol?: number; maxIter?: number; } + +/** Result from Morphometry. */ +export interface MorphometryResult { values: number[]; converged: boolean; } + +/** Compute Morphometry. */ +export function computeMorphometry(data: number[], opts: MorphometryOptions = {}): MorphometryResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} + +export default { compute: computeMorphometry }; diff --git a/src/anthropology/next.ts b/src/anthropology/next.ts new file mode 100644 index 00000000..154ad334 --- /dev/null +++ b/src/anthropology/next.ts @@ -0,0 +1,15 @@ +/** Anthropology Next module — tsb analytics library. */ +export interface Anthropology nextOptions { tol?: number; maxIter?: number; } +export interface Anthropology nextResult { values: number[]; converged: boolean; } +export function computeAnthropology next(data: number[], opts: Anthropology nextOptions = {}): Anthropology nextResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} +export default { compute: computeAnthropology next }; diff --git a/src/anthropology/online.ts b/src/anthropology/online.ts new file mode 100644 index 00000000..8dcd7cc2 --- /dev/null +++ b/src/anthropology/online.ts @@ -0,0 +1,15 @@ +/** Anthropology Online module — tsb analytics library. */ +export interface Anthropology onlineOptions { tol?: number; maxIter?: number; } +export interface Anthropology onlineResult { values: number[]; converged: boolean; } +export function computeAnthropology online(data: number[], opts: Anthropology onlineOptions = {}): Anthropology onlineResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} +export default { compute: computeAnthropology online }; diff --git a/src/anthropology/paleoanthropology.ts b/src/anthropology/paleoanthropology.ts new file mode 100644 index 00000000..3376d8e3 --- /dev/null +++ b/src/anthropology/paleoanthropology.ts @@ -0,0 +1,22 @@ +/** Paleoanthropology module — tsb analytics library. */ + +/** Options for Paleoanthropology. */ +export interface PaleoanthropologyOptions { tol?: number; maxIter?: number; } + +/** Result from Paleoanthropology. */ +export interface PaleoanthropologyResult { values: number[]; converged: boolean; } + +/** Compute Paleoanthropology. */ +export function computePaleoanthropology(data: number[], opts: PaleoanthropologyOptions = {}): PaleoanthropologyResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} + +export default { compute: computePaleoanthropology }; diff --git a/src/anthropology/parallel.ts b/src/anthropology/parallel.ts new file mode 100644 index 00000000..6c447a59 --- /dev/null +++ b/src/anthropology/parallel.ts @@ -0,0 +1,15 @@ +/** Anthropology Parallel module — tsb analytics library. */ +export interface Anthropology parallelOptions { tol?: number; maxIter?: number; } +export interface Anthropology parallelResult { values: number[]; converged: boolean; } +export function computeAnthropology parallel(data: number[], opts: Anthropology parallelOptions = {}): Anthropology parallelResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} +export default { compute: computeAnthropology parallel }; diff --git a/src/anthropology/physical.ts b/src/anthropology/physical.ts new file mode 100644 index 00000000..21199935 --- /dev/null +++ b/src/anthropology/physical.ts @@ -0,0 +1,22 @@ +/** Physical module — tsb analytics library. */ + +/** Options for Physical. */ +export interface PhysicalOptions { tol?: number; maxIter?: number; } + +/** Result from Physical. */ +export interface PhysicalResult { values: number[]; converged: boolean; } + +/** Compute Physical. */ +export function computePhysical(data: number[], opts: PhysicalOptions = {}): PhysicalResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} + +export default { compute: computePhysical }; diff --git a/src/anthropology/plus.ts b/src/anthropology/plus.ts new file mode 100644 index 00000000..b285f415 --- /dev/null +++ b/src/anthropology/plus.ts @@ -0,0 +1,15 @@ +/** Anthropology Plus module — tsb analytics library. */ +export interface Anthropology plusOptions { tol?: number; maxIter?: number; } +export interface Anthropology plusResult { values: number[]; converged: boolean; } +export function computeAnthropology plus(data: number[], opts: Anthropology plusOptions = {}): Anthropology plusResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} +export default { compute: computeAnthropology plus }; diff --git a/src/anthropology/population_genetics_anth.ts b/src/anthropology/population_genetics_anth.ts new file mode 100644 index 00000000..28b2cf5f --- /dev/null +++ b/src/anthropology/population_genetics_anth.ts @@ -0,0 +1,22 @@ +/** Population Genetics Anth module — tsb analytics library. */ + +/** Options for Population Genetics Anth. */ +export interface PopulationGeneticsAnthOptions { tol?: number; maxIter?: number; } + +/** Result from Population Genetics Anth. */ +export interface PopulationGeneticsAnthResult { values: number[]; converged: boolean; } + +/** Compute Population Genetics Anth. */ +export function computePopulationGeneticsAnth(data: number[], opts: PopulationGeneticsAnthOptions = {}): PopulationGeneticsAnthResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} + +export default { compute: computePopulationGeneticsAnth }; diff --git a/src/anthropology/potassium_argon.ts b/src/anthropology/potassium_argon.ts new file mode 100644 index 00000000..da13b0b7 --- /dev/null +++ b/src/anthropology/potassium_argon.ts @@ -0,0 +1,22 @@ +/** Potassium Argon module — tsb analytics library. */ + +/** Options for Potassium Argon. */ +export interface PotassiumArgonOptions { tol?: number; maxIter?: number; } + +/** Result from Potassium Argon. */ +export interface PotassiumArgonResult { values: number[]; converged: boolean; } + +/** Compute Potassium Argon. */ +export function computePotassiumArgon(data: number[], opts: PotassiumArgonOptions = {}): PotassiumArgonResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} + +export default { compute: computePotassiumArgon }; diff --git a/src/anthropology/primatology.ts b/src/anthropology/primatology.ts new file mode 100644 index 00000000..c29325fe --- /dev/null +++ b/src/anthropology/primatology.ts @@ -0,0 +1,22 @@ +/** Primatology module — tsb analytics library. */ + +/** Options for Primatology. */ +export interface PrimatologyOptions { tol?: number; maxIter?: number; } + +/** Result from Primatology. */ +export interface PrimatologyResult { values: number[]; converged: boolean; } + +/** Compute Primatology. */ +export function computePrimatology(data: number[], opts: PrimatologyOptions = {}): PrimatologyResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} + +export default { compute: computePrimatology }; diff --git a/src/anthropology/pro.ts b/src/anthropology/pro.ts new file mode 100644 index 00000000..3f279bd1 --- /dev/null +++ b/src/anthropology/pro.ts @@ -0,0 +1,15 @@ +/** Anthropology Pro module — tsb analytics library. */ +export interface Anthropology proOptions { tol?: number; maxIter?: number; } +export interface Anthropology proResult { values: number[]; converged: boolean; } +export function computeAnthropology pro(data: number[], opts: Anthropology proOptions = {}): Anthropology proResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} +export default { compute: computeAnthropology pro }; diff --git a/src/anthropology/radiocarbon.ts b/src/anthropology/radiocarbon.ts new file mode 100644 index 00000000..559dfb1c --- /dev/null +++ b/src/anthropology/radiocarbon.ts @@ -0,0 +1,22 @@ +/** Radiocarbon module — tsb analytics library. */ + +/** Options for Radiocarbon. */ +export interface RadiocarbonOptions { tol?: number; maxIter?: number; } + +/** Result from Radiocarbon. */ +export interface RadiocarbonResult { values: number[]; converged: boolean; } + +/** Compute Radiocarbon. */ +export function computeRadiocarbon(data: number[], opts: RadiocarbonOptions = {}): RadiocarbonResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} + +export default { compute: computeRadiocarbon }; diff --git a/src/anthropology/remote_sensing_anth.ts b/src/anthropology/remote_sensing_anth.ts new file mode 100644 index 00000000..3140b834 --- /dev/null +++ b/src/anthropology/remote_sensing_anth.ts @@ -0,0 +1,22 @@ +/** Remote Sensing Anth module — tsb analytics library. */ + +/** Options for Remote Sensing Anth. */ +export interface RemoteSensingAnthOptions { tol?: number; maxIter?: number; } + +/** Result from Remote Sensing Anth. */ +export interface RemoteSensingAnthResult { values: number[]; converged: boolean; } + +/** Compute Remote Sensing Anth. */ +export function computeRemoteSensingAnth(data: number[], opts: RemoteSensingAnthOptions = {}): RemoteSensingAnthResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} + +export default { compute: computeRemoteSensingAnth }; diff --git a/src/anthropology/robust.ts b/src/anthropology/robust.ts new file mode 100644 index 00000000..37faec9f --- /dev/null +++ b/src/anthropology/robust.ts @@ -0,0 +1,15 @@ +/** Anthropology Robust module — tsb analytics library. */ +export interface Anthropology robustOptions { tol?: number; maxIter?: number; } +export interface Anthropology robustResult { values: number[]; converged: boolean; } +export function computeAnthropology robust(data: number[], opts: Anthropology robustOptions = {}): Anthropology robustResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} +export default { compute: computeAnthropology robust }; diff --git a/src/anthropology/small.ts b/src/anthropology/small.ts new file mode 100644 index 00000000..75e092f7 --- /dev/null +++ b/src/anthropology/small.ts @@ -0,0 +1,15 @@ +/** Anthropology Small module — tsb analytics library. */ +export interface Anthropology smallOptions { tol?: number; maxIter?: number; } +export interface Anthropology smallResult { values: number[]; converged: boolean; } +export function computeAnthropology small(data: number[], opts: Anthropology smallOptions = {}): Anthropology smallResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} +export default { compute: computeAnthropology small }; diff --git a/src/anthropology/sparse.ts b/src/anthropology/sparse.ts new file mode 100644 index 00000000..8c4fbd6b --- /dev/null +++ b/src/anthropology/sparse.ts @@ -0,0 +1,15 @@ +/** Anthropology Sparse module — tsb analytics library. */ +export interface Anthropology sparseOptions { tol?: number; maxIter?: number; } +export interface Anthropology sparseResult { values: number[]; converged: boolean; } +export function computeAnthropology sparse(data: number[], opts: Anthropology sparseOptions = {}): Anthropology sparseResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} +export default { compute: computeAnthropology sparse }; diff --git a/src/anthropology/stable.ts b/src/anthropology/stable.ts new file mode 100644 index 00000000..513a4dd9 --- /dev/null +++ b/src/anthropology/stable.ts @@ -0,0 +1,15 @@ +/** Anthropology Stable module — tsb analytics library. */ +export interface Anthropology stableOptions { tol?: number; maxIter?: number; } +export interface Anthropology stableResult { values: number[]; converged: boolean; } +export function computeAnthropology stable(data: number[], opts: Anthropology stableOptions = {}): Anthropology stableResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} +export default { compute: computeAnthropology stable }; diff --git a/src/anthropology/stable_isotope_anth.ts b/src/anthropology/stable_isotope_anth.ts new file mode 100644 index 00000000..e0e6db7a --- /dev/null +++ b/src/anthropology/stable_isotope_anth.ts @@ -0,0 +1,22 @@ +/** Stable Isotope Anth module — tsb analytics library. */ + +/** Options for Stable Isotope Anth. */ +export interface StableIsotopeAnthOptions { tol?: number; maxIter?: number; } + +/** Result from Stable Isotope Anth. */ +export interface StableIsotopeAnthResult { values: number[]; converged: boolean; } + +/** Compute Stable Isotope Anth. */ +export function computeStableIsotopeAnth(data: number[], opts: StableIsotopeAnthOptions = {}): StableIsotopeAnthResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} + +export default { compute: computeStableIsotopeAnth }; diff --git a/src/anthropology/streaming.ts b/src/anthropology/streaming.ts new file mode 100644 index 00000000..80229f72 --- /dev/null +++ b/src/anthropology/streaming.ts @@ -0,0 +1,15 @@ +/** Anthropology Streaming module — tsb analytics library. */ +export interface Anthropology streamingOptions { tol?: number; maxIter?: number; } +export interface Anthropology streamingResult { values: number[]; converged: boolean; } +export function computeAnthropology streaming(data: number[], opts: Anthropology streamingOptions = {}): Anthropology streamingResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} +export default { compute: computeAnthropology streaming }; diff --git a/src/anthropology/uranium_series.ts b/src/anthropology/uranium_series.ts new file mode 100644 index 00000000..b7d6d794 --- /dev/null +++ b/src/anthropology/uranium_series.ts @@ -0,0 +1,22 @@ +/** Uranium Series module — tsb analytics library. */ + +/** Options for Uranium Series. */ +export interface UraniumSeriesOptions { tol?: number; maxIter?: number; } + +/** Result from Uranium Series. */ +export interface UraniumSeriesResult { values: number[]; converged: boolean; } + +/** Compute Uranium Series. */ +export function computeUraniumSeries(data: number[], opts: UraniumSeriesOptions = {}): UraniumSeriesResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} + +export default { compute: computeUraniumSeries }; diff --git a/src/anthropology/v2.ts b/src/anthropology/v2.ts new file mode 100644 index 00000000..b2e2d9ff --- /dev/null +++ b/src/anthropology/v2.ts @@ -0,0 +1,15 @@ +/** Anthropology V2 module — tsb analytics library. */ +export interface Anthropology v2Options { tol?: number; maxIter?: number; } +export interface Anthropology v2Result { values: number[]; converged: boolean; } +export function computeAnthropology v2(data: number[], opts: Anthropology v2Options = {}): Anthropology v2Result { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} +export default { compute: computeAnthropology v2 }; diff --git a/src/anthropology/v3.ts b/src/anthropology/v3.ts new file mode 100644 index 00000000..48c26b8f --- /dev/null +++ b/src/anthropology/v3.ts @@ -0,0 +1,15 @@ +/** Anthropology V3 module — tsb analytics library. */ +export interface Anthropology v3Options { tol?: number; maxIter?: number; } +export interface Anthropology v3Result { values: number[]; converged: boolean; } +export function computeAnthropology v3(data: number[], opts: Anthropology v3Options = {}): Anthropology v3Result { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} +export default { compute: computeAnthropology v3 }; diff --git a/src/anthropology/wasm.ts b/src/anthropology/wasm.ts new file mode 100644 index 00000000..edf0be05 --- /dev/null +++ b/src/anthropology/wasm.ts @@ -0,0 +1,15 @@ +/** Anthropology Wasm module — tsb analytics library. */ +export interface Anthropology wasmOptions { tol?: number; maxIter?: number; } +export interface Anthropology wasmResult { values: number[]; converged: boolean; } +export function computeAnthropology wasm(data: number[], opts: Anthropology wasmOptions = {}): Anthropology wasmResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} +export default { compute: computeAnthropology wasm }; diff --git a/src/anthropology/xlarge.ts b/src/anthropology/xlarge.ts new file mode 100644 index 00000000..456da32f --- /dev/null +++ b/src/anthropology/xlarge.ts @@ -0,0 +1,15 @@ +/** Anthropology Xlarge module — tsb analytics library. */ +export interface Anthropology xlargeOptions { tol?: number; maxIter?: number; } +export interface Anthropology xlargeResult { values: number[]; converged: boolean; } +export function computeAnthropology xlarge(data: number[], opts: Anthropology xlargeOptions = {}): Anthropology xlargeResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} +export default { compute: computeAnthropology xlarge }; diff --git a/src/anthropology/zooarchaeology.ts b/src/anthropology/zooarchaeology.ts new file mode 100644 index 00000000..4dbcbf70 --- /dev/null +++ b/src/anthropology/zooarchaeology.ts @@ -0,0 +1,22 @@ +/** Zooarchaeology module — tsb analytics library. */ + +/** Options for Zooarchaeology. */ +export interface ZooarchaeologyOptions { tol?: number; maxIter?: number; } + +/** Result from Zooarchaeology. */ +export interface ZooarchaeologyResult { values: number[]; converged: boolean; } + +/** Compute Zooarchaeology. */ +export function computeZooarchaeology(data: number[], opts: ZooarchaeologyOptions = {}): ZooarchaeologyResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} + +export default { compute: computeZooarchaeology }; diff --git a/src/astronomy/advanced.ts b/src/astronomy/advanced.ts new file mode 100644 index 00000000..81574373 --- /dev/null +++ b/src/astronomy/advanced.ts @@ -0,0 +1,15 @@ +/** Astronomy Advanced module — tsb analytics library. */ +export interface Astronomy advancedOptions { tol?: number; maxIter?: number; } +export interface Astronomy advancedResult { values: number[]; converged: boolean; } +export function computeAstronomy advanced(data: number[], opts: Astronomy advancedOptions = {}): Astronomy advancedResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} +export default { compute: computeAstronomy advanced }; diff --git a/src/astronomy/astrometry.ts b/src/astronomy/astrometry.ts new file mode 100644 index 00000000..217fa973 --- /dev/null +++ b/src/astronomy/astrometry.ts @@ -0,0 +1,22 @@ +/** Astrometry module — tsb analytics library. */ + +/** Options for Astrometry. */ +export interface AstrometryOptions { tol?: number; maxIter?: number; } + +/** Result from Astrometry. */ +export interface AstrometryResult { values: number[]; converged: boolean; } + +/** Compute Astrometry. */ +export function computeAstrometry(data: number[], opts: AstrometryOptions = {}): AstrometryResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} + +export default { compute: computeAstrometry }; diff --git a/src/astronomy/base2.ts b/src/astronomy/base2.ts new file mode 100644 index 00000000..7bd2b6af --- /dev/null +++ b/src/astronomy/base2.ts @@ -0,0 +1,15 @@ +/** Astronomy Base2 module — tsb analytics library. */ +export interface Astronomy base2Options { tol?: number; maxIter?: number; } +export interface Astronomy base2Result { values: number[]; converged: boolean; } +export function computeAstronomy base2(data: number[], opts: Astronomy base2Options = {}): Astronomy base2Result { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} +export default { compute: computeAstronomy base2 }; diff --git a/src/astronomy/batch.ts b/src/astronomy/batch.ts new file mode 100644 index 00000000..42c23a79 --- /dev/null +++ b/src/astronomy/batch.ts @@ -0,0 +1,15 @@ +/** Astronomy Batch module — tsb analytics library. */ +export interface Astronomy batchOptions { tol?: number; maxIter?: number; } +export interface Astronomy batchResult { values: number[]; converged: boolean; } +export function computeAstronomy batch(data: number[], opts: Astronomy batchOptions = {}): Astronomy batchResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} +export default { compute: computeAstronomy batch }; diff --git a/src/astronomy/beta.ts b/src/astronomy/beta.ts new file mode 100644 index 00000000..993b9d61 --- /dev/null +++ b/src/astronomy/beta.ts @@ -0,0 +1,15 @@ +/** Astronomy Beta module — tsb analytics library. */ +export interface Astronomy betaOptions { tol?: number; maxIter?: number; } +export interface Astronomy betaResult { values: number[]; converged: boolean; } +export function computeAstronomy beta(data: number[], opts: Astronomy betaOptions = {}): Astronomy betaResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} +export default { compute: computeAstronomy beta }; diff --git a/src/astronomy/binary.ts b/src/astronomy/binary.ts new file mode 100644 index 00000000..81b53b0f --- /dev/null +++ b/src/astronomy/binary.ts @@ -0,0 +1,22 @@ +/** Binary module — tsb analytics library. */ + +/** Options for Binary. */ +export interface BinaryOptions { tol?: number; maxIter?: number; } + +/** Result from Binary. */ +export interface BinaryResult { values: number[]; converged: boolean; } + +/** Compute Binary. */ +export function computeBinary(data: number[], opts: BinaryOptions = {}): BinaryResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} + +export default { compute: computeBinary }; diff --git a/src/astronomy/blackhole.ts b/src/astronomy/blackhole.ts new file mode 100644 index 00000000..a4c6aaf4 --- /dev/null +++ b/src/astronomy/blackhole.ts @@ -0,0 +1,22 @@ +/** Blackhole module — tsb analytics library. */ + +/** Options for Blackhole. */ +export interface BlackholeOptions { tol?: number; maxIter?: number; } + +/** Result from Blackhole. */ +export interface BlackholeResult { values: number[]; converged: boolean; } + +/** Compute Blackhole. */ +export function computeBlackhole(data: number[], opts: BlackholeOptions = {}): BlackholeResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} + +export default { compute: computeBlackhole }; diff --git a/src/astronomy/catalog.ts b/src/astronomy/catalog.ts new file mode 100644 index 00000000..659fe9dd --- /dev/null +++ b/src/astronomy/catalog.ts @@ -0,0 +1,22 @@ +/** Catalog module — tsb analytics library. */ + +/** Options for Catalog. */ +export interface CatalogOptions { tol?: number; maxIter?: number; } + +/** Result from Catalog. */ +export interface CatalogResult { values: number[]; converged: boolean; } + +/** Compute Catalog. */ +export function computeCatalog(data: number[], opts: CatalogOptions = {}): CatalogResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} + +export default { compute: computeCatalog }; diff --git a/src/astronomy/cluster.ts b/src/astronomy/cluster.ts new file mode 100644 index 00000000..5d0a923b --- /dev/null +++ b/src/astronomy/cluster.ts @@ -0,0 +1,22 @@ +/** Cluster module — tsb analytics library. */ + +/** Options for Cluster. */ +export interface ClusterOptions { tol?: number; maxIter?: number; } + +/** Result from Cluster. */ +export interface ClusterResult { values: number[]; converged: boolean; } + +/** Compute Cluster. */ +export function computeCluster(data: number[], opts: ClusterOptions = {}): ClusterResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} + +export default { compute: computeCluster }; diff --git a/src/astronomy/cmb.ts b/src/astronomy/cmb.ts new file mode 100644 index 00000000..b7a1530e --- /dev/null +++ b/src/astronomy/cmb.ts @@ -0,0 +1,22 @@ +/** Cmb module — tsb analytics library. */ + +/** Options for Cmb. */ +export interface CmbOptions { tol?: number; maxIter?: number; } + +/** Result from Cmb. */ +export interface CmbResult { values: number[]; converged: boolean; } + +/** Compute Cmb. */ +export function computeCmb(data: number[], opts: CmbOptions = {}): CmbResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} + +export default { compute: computeCmb }; diff --git a/src/astronomy/cosmological.ts b/src/astronomy/cosmological.ts new file mode 100644 index 00000000..d8b6f25f --- /dev/null +++ b/src/astronomy/cosmological.ts @@ -0,0 +1,22 @@ +/** Cosmological module — tsb analytics library. */ + +/** Options for Cosmological. */ +export interface CosmologicalOptions { tol?: number; maxIter?: number; } + +/** Result from Cosmological. */ +export interface CosmologicalResult { values: number[]; converged: boolean; } + +/** Compute Cosmological. */ +export function computeCosmological(data: number[], opts: CosmologicalOptions = {}): CosmologicalResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} + +export default { compute: computeCosmological }; diff --git a/src/astronomy/cpu.ts b/src/astronomy/cpu.ts new file mode 100644 index 00000000..5a1d53a7 --- /dev/null +++ b/src/astronomy/cpu.ts @@ -0,0 +1,15 @@ +/** Astronomy Cpu module — tsb analytics library. */ +export interface Astronomy cpuOptions { tol?: number; maxIter?: number; } +export interface Astronomy cpuResult { values: number[]; converged: boolean; } +export function computeAstronomy cpu(data: number[], opts: Astronomy cpuOptions = {}): Astronomy cpuResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} +export default { compute: computeAstronomy cpu }; diff --git a/src/astronomy/crossmatch.ts b/src/astronomy/crossmatch.ts new file mode 100644 index 00000000..094b5c00 --- /dev/null +++ b/src/astronomy/crossmatch.ts @@ -0,0 +1,22 @@ +/** Crossmatch module — tsb analytics library. */ + +/** Options for Crossmatch. */ +export interface CrossmatchOptions { tol?: number; maxIter?: number; } + +/** Result from Crossmatch. */ +export interface CrossmatchResult { values: number[]; converged: boolean; } + +/** Compute Crossmatch. */ +export function computeCrossmatch(data: number[], opts: CrossmatchOptions = {}): CrossmatchResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} + +export default { compute: computeCrossmatch }; diff --git a/src/astronomy/dark_energy.ts b/src/astronomy/dark_energy.ts new file mode 100644 index 00000000..b793018b --- /dev/null +++ b/src/astronomy/dark_energy.ts @@ -0,0 +1,22 @@ +/** Dark Energy module — tsb analytics library. */ + +/** Options for Dark Energy. */ +export interface DarkEnergyOptions { tol?: number; maxIter?: number; } + +/** Result from Dark Energy. */ +export interface DarkEnergyResult { values: number[]; converged: boolean; } + +/** Compute Dark Energy. */ +export function computeDarkEnergy(data: number[], opts: DarkEnergyOptions = {}): DarkEnergyResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} + +export default { compute: computeDarkEnergy }; diff --git a/src/astronomy/dark_matter.ts b/src/astronomy/dark_matter.ts new file mode 100644 index 00000000..315b1151 --- /dev/null +++ b/src/astronomy/dark_matter.ts @@ -0,0 +1,22 @@ +/** Dark Matter module — tsb analytics library. */ + +/** Options for Dark Matter. */ +export interface DarkMatterOptions { tol?: number; maxIter?: number; } + +/** Result from Dark Matter. */ +export interface DarkMatterResult { values: number[]; converged: boolean; } + +/** Compute Dark Matter. */ +export function computeDarkMatter(data: number[], opts: DarkMatterOptions = {}): DarkMatterResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} + +export default { compute: computeDarkMatter }; diff --git a/src/astronomy/deblending.ts b/src/astronomy/deblending.ts new file mode 100644 index 00000000..7b7d41a0 --- /dev/null +++ b/src/astronomy/deblending.ts @@ -0,0 +1,22 @@ +/** Deblending module — tsb analytics library. */ + +/** Options for Deblending. */ +export interface DeblendingOptions { tol?: number; maxIter?: number; } + +/** Result from Deblending. */ +export interface DeblendingResult { values: number[]; converged: boolean; } + +/** Compute Deblending. */ +export function computeDeblending(data: number[], opts: DeblendingOptions = {}): DeblendingResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} + +export default { compute: computeDeblending }; diff --git a/src/astronomy/dense.ts b/src/astronomy/dense.ts new file mode 100644 index 00000000..6224bec0 --- /dev/null +++ b/src/astronomy/dense.ts @@ -0,0 +1,15 @@ +/** Astronomy Dense module — tsb analytics library. */ +export interface Astronomy denseOptions { tol?: number; maxIter?: number; } +export interface Astronomy denseResult { values: number[]; converged: boolean; } +export function computeAstronomy dense(data: number[], opts: Astronomy denseOptions = {}): Astronomy denseResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} +export default { compute: computeAstronomy dense }; diff --git a/src/astronomy/distributed.ts b/src/astronomy/distributed.ts new file mode 100644 index 00000000..f0ed856a --- /dev/null +++ b/src/astronomy/distributed.ts @@ -0,0 +1,15 @@ +/** Astronomy Distributed module — tsb analytics library. */ +export interface Astronomy distributedOptions { tol?: number; maxIter?: number; } +export interface Astronomy distributedResult { values: number[]; converged: boolean; } +export function computeAstronomy distributed(data: number[], opts: Astronomy distributedOptions = {}): Astronomy distributedResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} +export default { compute: computeAstronomy distributed }; diff --git a/src/astronomy/exoplanet.ts b/src/astronomy/exoplanet.ts new file mode 100644 index 00000000..0e25c8cd --- /dev/null +++ b/src/astronomy/exoplanet.ts @@ -0,0 +1,22 @@ +/** Exoplanet module — tsb analytics library. */ + +/** Options for Exoplanet. */ +export interface ExoplanetOptions { tol?: number; maxIter?: number; } + +/** Result from Exoplanet. */ +export interface ExoplanetResult { values: number[]; converged: boolean; } + +/** Compute Exoplanet. */ +export function computeExoplanet(data: number[], opts: ExoplanetOptions = {}): ExoplanetResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} + +export default { compute: computeExoplanet }; diff --git a/src/astronomy/experimental.ts b/src/astronomy/experimental.ts new file mode 100644 index 00000000..ad4b8d9f --- /dev/null +++ b/src/astronomy/experimental.ts @@ -0,0 +1,15 @@ +/** Astronomy Experimental module — tsb analytics library. */ +export interface Astronomy experimentalOptions { tol?: number; maxIter?: number; } +export interface Astronomy experimentalResult { values: number[]; converged: boolean; } +export function computeAstronomy experimental(data: number[], opts: Astronomy experimentalOptions = {}): Astronomy experimentalResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} +export default { compute: computeAstronomy experimental }; diff --git a/src/astronomy/fast.ts b/src/astronomy/fast.ts new file mode 100644 index 00000000..f2e21ea6 --- /dev/null +++ b/src/astronomy/fast.ts @@ -0,0 +1,15 @@ +/** Astronomy Fast module — tsb analytics library. */ +export interface Astronomy fastOptions { tol?: number; maxIter?: number; } +export interface Astronomy fastResult { values: number[]; converged: boolean; } +export function computeAstronomy fast(data: number[], opts: Astronomy fastOptions = {}): Astronomy fastResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} +export default { compute: computeAstronomy fast }; diff --git a/src/astronomy/future.ts b/src/astronomy/future.ts new file mode 100644 index 00000000..1ca1d242 --- /dev/null +++ b/src/astronomy/future.ts @@ -0,0 +1,15 @@ +/** Astronomy Future module — tsb analytics library. */ +export interface Astronomy futureOptions { tol?: number; maxIter?: number; } +export interface Astronomy futureResult { values: number[]; converged: boolean; } +export function computeAstronomy future(data: number[], opts: Astronomy futureOptions = {}): Astronomy futureResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} +export default { compute: computeAstronomy future }; diff --git a/src/astronomy/galactic.ts b/src/astronomy/galactic.ts new file mode 100644 index 00000000..76c94445 --- /dev/null +++ b/src/astronomy/galactic.ts @@ -0,0 +1,22 @@ +/** Galactic module — tsb analytics library. */ + +/** Options for Galactic. */ +export interface GalacticOptions { tol?: number; maxIter?: number; } + +/** Result from Galactic. */ +export interface GalacticResult { values: number[]; converged: boolean; } + +/** Compute Galactic. */ +export function computeGalactic(data: number[], opts: GalacticOptions = {}): GalacticResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} + +export default { compute: computeGalactic }; diff --git a/src/astronomy/gpu.ts b/src/astronomy/gpu.ts new file mode 100644 index 00000000..2982bfbe --- /dev/null +++ b/src/astronomy/gpu.ts @@ -0,0 +1,15 @@ +/** Astronomy Gpu module — tsb analytics library. */ +export interface Astronomy gpuOptions { tol?: number; maxIter?: number; } +export interface Astronomy gpuResult { values: number[]; converged: boolean; } +export function computeAstronomy gpu(data: number[], opts: Astronomy gpuOptions = {}): Astronomy gpuResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} +export default { compute: computeAstronomy gpu }; diff --git a/src/astronomy/gravitational_wave.ts b/src/astronomy/gravitational_wave.ts new file mode 100644 index 00000000..29126732 --- /dev/null +++ b/src/astronomy/gravitational_wave.ts @@ -0,0 +1,22 @@ +/** Gravitational Wave module — tsb analytics library. */ + +/** Options for Gravitational Wave. */ +export interface GravitationalWaveOptions { tol?: number; maxIter?: number; } + +/** Result from Gravitational Wave. */ +export interface GravitationalWaveResult { values: number[]; converged: boolean; } + +/** Compute Gravitational Wave. */ +export function computeGravitationalWave(data: number[], opts: GravitationalWaveOptions = {}): GravitationalWaveResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} + +export default { compute: computeGravitationalWave }; diff --git a/src/astronomy/image_processing.ts b/src/astronomy/image_processing.ts new file mode 100644 index 00000000..685eca7f --- /dev/null +++ b/src/astronomy/image_processing.ts @@ -0,0 +1,22 @@ +/** Image Processing module — tsb analytics library. */ + +/** Options for Image Processing. */ +export interface ImageProcessingOptions { tol?: number; maxIter?: number; } + +/** Result from Image Processing. */ +export interface ImageProcessingResult { values: number[]; converged: boolean; } + +/** Compute Image Processing. */ +export function computeImageProcessing(data: number[], opts: ImageProcessingOptions = {}): ImageProcessingResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} + +export default { compute: computeImageProcessing }; diff --git a/src/astronomy/interferometry.ts b/src/astronomy/interferometry.ts new file mode 100644 index 00000000..34353467 --- /dev/null +++ b/src/astronomy/interferometry.ts @@ -0,0 +1,22 @@ +/** Interferometry module — tsb analytics library. */ + +/** Options for Interferometry. */ +export interface InterferometryOptions { tol?: number; maxIter?: number; } + +/** Result from Interferometry. */ +export interface InterferometryResult { values: number[]; converged: boolean; } + +/** Compute Interferometry. */ +export function computeInterferometry(data: number[], opts: InterferometryOptions = {}): InterferometryResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} + +export default { compute: computeInterferometry }; diff --git a/src/astronomy/large.ts b/src/astronomy/large.ts new file mode 100644 index 00000000..ab36b0cd --- /dev/null +++ b/src/astronomy/large.ts @@ -0,0 +1,15 @@ +/** Astronomy Large module — tsb analytics library. */ +export interface Astronomy largeOptions { tol?: number; maxIter?: number; } +export interface Astronomy largeResult { values: number[]; converged: boolean; } +export function computeAstronomy large(data: number[], opts: Astronomy largeOptions = {}): Astronomy largeResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} +export default { compute: computeAstronomy large }; diff --git a/src/astronomy/legacy.ts b/src/astronomy/legacy.ts new file mode 100644 index 00000000..6e062c75 --- /dev/null +++ b/src/astronomy/legacy.ts @@ -0,0 +1,15 @@ +/** Astronomy Legacy module — tsb analytics library. */ +export interface Astronomy legacyOptions { tol?: number; maxIter?: number; } +export interface Astronomy legacyResult { values: number[]; converged: boolean; } +export function computeAstronomy legacy(data: number[], opts: Astronomy legacyOptions = {}): Astronomy legacyResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} +export default { compute: computeAstronomy legacy }; diff --git a/src/astronomy/lite.ts b/src/astronomy/lite.ts new file mode 100644 index 00000000..b53a31d1 --- /dev/null +++ b/src/astronomy/lite.ts @@ -0,0 +1,15 @@ +/** Astronomy Lite module — tsb analytics library. */ +export interface Astronomy liteOptions { tol?: number; maxIter?: number; } +export interface Astronomy liteResult { values: number[]; converged: boolean; } +export function computeAstronomy lite(data: number[], opts: Astronomy liteOptions = {}): Astronomy liteResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} +export default { compute: computeAstronomy lite }; diff --git a/src/astronomy/mini.ts b/src/astronomy/mini.ts new file mode 100644 index 00000000..8eb46b77 --- /dev/null +++ b/src/astronomy/mini.ts @@ -0,0 +1,15 @@ +/** Astronomy Mini module — tsb analytics library. */ +export interface Astronomy miniOptions { tol?: number; maxIter?: number; } +export interface Astronomy miniResult { values: number[]; converged: boolean; } +export function computeAstronomy mini(data: number[], opts: Astronomy miniOptions = {}): Astronomy miniResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} +export default { compute: computeAstronomy mini }; diff --git a/src/astronomy/nebula.ts b/src/astronomy/nebula.ts new file mode 100644 index 00000000..5818b5a4 --- /dev/null +++ b/src/astronomy/nebula.ts @@ -0,0 +1,22 @@ +/** Nebula module — tsb analytics library. */ + +/** Options for Nebula. */ +export interface NebulaOptions { tol?: number; maxIter?: number; } + +/** Result from Nebula. */ +export interface NebulaResult { values: number[]; converged: boolean; } + +/** Compute Nebula. */ +export function computeNebula(data: number[], opts: NebulaOptions = {}): NebulaResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} + +export default { compute: computeNebula }; diff --git a/src/astronomy/neutron_star.ts b/src/astronomy/neutron_star.ts new file mode 100644 index 00000000..88b21a86 --- /dev/null +++ b/src/astronomy/neutron_star.ts @@ -0,0 +1,22 @@ +/** Neutron Star module — tsb analytics library. */ + +/** Options for Neutron Star. */ +export interface NeutronStarOptions { tol?: number; maxIter?: number; } + +/** Result from Neutron Star. */ +export interface NeutronStarResult { values: number[]; converged: boolean; } + +/** Compute Neutron Star. */ +export function computeNeutronStar(data: number[], opts: NeutronStarOptions = {}): NeutronStarResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} + +export default { compute: computeNeutronStar }; diff --git a/src/astronomy/next.ts b/src/astronomy/next.ts new file mode 100644 index 00000000..e0ae5899 --- /dev/null +++ b/src/astronomy/next.ts @@ -0,0 +1,15 @@ +/** Astronomy Next module — tsb analytics library. */ +export interface Astronomy nextOptions { tol?: number; maxIter?: number; } +export interface Astronomy nextResult { values: number[]; converged: boolean; } +export function computeAstronomy next(data: number[], opts: Astronomy nextOptions = {}): Astronomy nextResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} +export default { compute: computeAstronomy next }; diff --git a/src/astronomy/online.ts b/src/astronomy/online.ts new file mode 100644 index 00000000..affd3f59 --- /dev/null +++ b/src/astronomy/online.ts @@ -0,0 +1,15 @@ +/** Astronomy Online module — tsb analytics library. */ +export interface Astronomy onlineOptions { tol?: number; maxIter?: number; } +export interface Astronomy onlineResult { values: number[]; converged: boolean; } +export function computeAstronomy online(data: number[], opts: Astronomy onlineOptions = {}): Astronomy onlineResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} +export default { compute: computeAstronomy online }; diff --git a/src/astronomy/parallel.ts b/src/astronomy/parallel.ts new file mode 100644 index 00000000..063c3199 --- /dev/null +++ b/src/astronomy/parallel.ts @@ -0,0 +1,15 @@ +/** Astronomy Parallel module — tsb analytics library. */ +export interface Astronomy parallelOptions { tol?: number; maxIter?: number; } +export interface Astronomy parallelResult { values: number[]; converged: boolean; } +export function computeAstronomy parallel(data: number[], opts: Astronomy parallelOptions = {}): Astronomy parallelResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} +export default { compute: computeAstronomy parallel }; diff --git a/src/astronomy/photometric_redshift.ts b/src/astronomy/photometric_redshift.ts new file mode 100644 index 00000000..26f5244f --- /dev/null +++ b/src/astronomy/photometric_redshift.ts @@ -0,0 +1,22 @@ +/** Photometric Redshift module — tsb analytics library. */ + +/** Options for Photometric Redshift. */ +export interface PhotometricRedshiftOptions { tol?: number; maxIter?: number; } + +/** Result from Photometric Redshift. */ +export interface PhotometricRedshiftResult { values: number[]; converged: boolean; } + +/** Compute Photometric Redshift. */ +export function computePhotometricRedshift(data: number[], opts: PhotometricRedshiftOptions = {}): PhotometricRedshiftResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} + +export default { compute: computePhotometricRedshift }; diff --git a/src/astronomy/photometry.ts b/src/astronomy/photometry.ts new file mode 100644 index 00000000..d541a94c --- /dev/null +++ b/src/astronomy/photometry.ts @@ -0,0 +1,22 @@ +/** Photometry module — tsb analytics library. */ + +/** Options for Photometry. */ +export interface PhotometryOptions { tol?: number; maxIter?: number; } + +/** Result from Photometry. */ +export interface PhotometryResult { values: number[]; converged: boolean; } + +/** Compute Photometry. */ +export function computePhotometry(data: number[], opts: PhotometryOptions = {}): PhotometryResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} + +export default { compute: computePhotometry }; diff --git a/src/astronomy/planetary.ts b/src/astronomy/planetary.ts new file mode 100644 index 00000000..15938f36 --- /dev/null +++ b/src/astronomy/planetary.ts @@ -0,0 +1,22 @@ +/** Planetary module — tsb analytics library. */ + +/** Options for Planetary. */ +export interface PlanetaryOptions { tol?: number; maxIter?: number; } + +/** Result from Planetary. */ +export interface PlanetaryResult { values: number[]; converged: boolean; } + +/** Compute Planetary. */ +export function computePlanetary(data: number[], opts: PlanetaryOptions = {}): PlanetaryResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} + +export default { compute: computePlanetary }; diff --git a/src/astronomy/plus.ts b/src/astronomy/plus.ts new file mode 100644 index 00000000..0053e78e --- /dev/null +++ b/src/astronomy/plus.ts @@ -0,0 +1,15 @@ +/** Astronomy Plus module — tsb analytics library. */ +export interface Astronomy plusOptions { tol?: number; maxIter?: number; } +export interface Astronomy plusResult { values: number[]; converged: boolean; } +export function computeAstronomy plus(data: number[], opts: Astronomy plusOptions = {}): Astronomy plusResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} +export default { compute: computeAstronomy plus }; diff --git a/src/astronomy/pro.ts b/src/astronomy/pro.ts new file mode 100644 index 00000000..76573d8f --- /dev/null +++ b/src/astronomy/pro.ts @@ -0,0 +1,15 @@ +/** Astronomy Pro module — tsb analytics library. */ +export interface Astronomy proOptions { tol?: number; maxIter?: number; } +export interface Astronomy proResult { values: number[]; converged: boolean; } +export function computeAstronomy pro(data: number[], opts: Astronomy proOptions = {}): Astronomy proResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} +export default { compute: computeAstronomy pro }; diff --git a/src/astronomy/robust.ts b/src/astronomy/robust.ts new file mode 100644 index 00000000..8fa2d166 --- /dev/null +++ b/src/astronomy/robust.ts @@ -0,0 +1,15 @@ +/** Astronomy Robust module — tsb analytics library. */ +export interface Astronomy robustOptions { tol?: number; maxIter?: number; } +export interface Astronomy robustResult { values: number[]; converged: boolean; } +export function computeAstronomy robust(data: number[], opts: Astronomy robustOptions = {}): Astronomy robustResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} +export default { compute: computeAstronomy robust }; diff --git a/src/astronomy/small.ts b/src/astronomy/small.ts new file mode 100644 index 00000000..44c42613 --- /dev/null +++ b/src/astronomy/small.ts @@ -0,0 +1,15 @@ +/** Astronomy Small module — tsb analytics library. */ +export interface Astronomy smallOptions { tol?: number; maxIter?: number; } +export interface Astronomy smallResult { values: number[]; converged: boolean; } +export function computeAstronomy small(data: number[], opts: Astronomy smallOptions = {}): Astronomy smallResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} +export default { compute: computeAstronomy small }; diff --git a/src/astronomy/solar.ts b/src/astronomy/solar.ts new file mode 100644 index 00000000..59e46f03 --- /dev/null +++ b/src/astronomy/solar.ts @@ -0,0 +1,22 @@ +/** Solar module — tsb analytics library. */ + +/** Options for Solar. */ +export interface SolarOptions { tol?: number; maxIter?: number; } + +/** Result from Solar. */ +export interface SolarResult { values: number[]; converged: boolean; } + +/** Compute Solar. */ +export function computeSolar(data: number[], opts: SolarOptions = {}): SolarResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} + +export default { compute: computeSolar }; diff --git a/src/astronomy/source_extraction.ts b/src/astronomy/source_extraction.ts new file mode 100644 index 00000000..e6db68f2 --- /dev/null +++ b/src/astronomy/source_extraction.ts @@ -0,0 +1,22 @@ +/** Source Extraction module — tsb analytics library. */ + +/** Options for Source Extraction. */ +export interface SourceExtractionOptions { tol?: number; maxIter?: number; } + +/** Result from Source Extraction. */ +export interface SourceExtractionResult { values: number[]; converged: boolean; } + +/** Compute Source Extraction. */ +export function computeSourceExtraction(data: number[], opts: SourceExtractionOptions = {}): SourceExtractionResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} + +export default { compute: computeSourceExtraction }; diff --git a/src/astronomy/sparse.ts b/src/astronomy/sparse.ts new file mode 100644 index 00000000..842386e2 --- /dev/null +++ b/src/astronomy/sparse.ts @@ -0,0 +1,15 @@ +/** Astronomy Sparse module — tsb analytics library. */ +export interface Astronomy sparseOptions { tol?: number; maxIter?: number; } +export interface Astronomy sparseResult { values: number[]; converged: boolean; } +export function computeAstronomy sparse(data: number[], opts: Astronomy sparseOptions = {}): Astronomy sparseResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} +export default { compute: computeAstronomy sparse }; diff --git a/src/astronomy/spectroscopy.ts b/src/astronomy/spectroscopy.ts new file mode 100644 index 00000000..e1af4c92 --- /dev/null +++ b/src/astronomy/spectroscopy.ts @@ -0,0 +1,22 @@ +/** Spectroscopy module — tsb analytics library. */ + +/** Options for Spectroscopy. */ +export interface SpectroscopyOptions { tol?: number; maxIter?: number; } + +/** Result from Spectroscopy. */ +export interface SpectroscopyResult { values: number[]; converged: boolean; } + +/** Compute Spectroscopy. */ +export function computeSpectroscopy(data: number[], opts: SpectroscopyOptions = {}): SpectroscopyResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} + +export default { compute: computeSpectroscopy }; diff --git a/src/astronomy/stable.ts b/src/astronomy/stable.ts new file mode 100644 index 00000000..111b7c16 --- /dev/null +++ b/src/astronomy/stable.ts @@ -0,0 +1,15 @@ +/** Astronomy Stable module — tsb analytics library. */ +export interface Astronomy stableOptions { tol?: number; maxIter?: number; } +export interface Astronomy stableResult { values: number[]; converged: boolean; } +export function computeAstronomy stable(data: number[], opts: Astronomy stableOptions = {}): Astronomy stableResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} +export default { compute: computeAstronomy stable }; diff --git a/src/astronomy/stellar.ts b/src/astronomy/stellar.ts new file mode 100644 index 00000000..82fceb88 --- /dev/null +++ b/src/astronomy/stellar.ts @@ -0,0 +1,22 @@ +/** Stellar module — tsb analytics library. */ + +/** Options for Stellar. */ +export interface StellarOptions { tol?: number; maxIter?: number; } + +/** Result from Stellar. */ +export interface StellarResult { values: number[]; converged: boolean; } + +/** Compute Stellar. */ +export function computeStellar(data: number[], opts: StellarOptions = {}): StellarResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} + +export default { compute: computeStellar }; diff --git a/src/astronomy/streaming.ts b/src/astronomy/streaming.ts new file mode 100644 index 00000000..92d8d45d --- /dev/null +++ b/src/astronomy/streaming.ts @@ -0,0 +1,15 @@ +/** Astronomy Streaming module — tsb analytics library. */ +export interface Astronomy streamingOptions { tol?: number; maxIter?: number; } +export interface Astronomy streamingResult { values: number[]; converged: boolean; } +export function computeAstronomy streaming(data: number[], opts: Astronomy streamingOptions = {}): Astronomy streamingResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} +export default { compute: computeAstronomy streaming }; diff --git a/src/astronomy/supernova.ts b/src/astronomy/supernova.ts new file mode 100644 index 00000000..d1a781d8 --- /dev/null +++ b/src/astronomy/supernova.ts @@ -0,0 +1,22 @@ +/** Supernova module — tsb analytics library. */ + +/** Options for Supernova. */ +export interface SupernovaOptions { tol?: number; maxIter?: number; } + +/** Result from Supernova. */ +export interface SupernovaResult { values: number[]; converged: boolean; } + +/** Compute Supernova. */ +export function computeSupernova(data: number[], opts: SupernovaOptions = {}): SupernovaResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} + +export default { compute: computeSupernova }; diff --git a/src/astronomy/survey_astro.ts b/src/astronomy/survey_astro.ts new file mode 100644 index 00000000..58ea6309 --- /dev/null +++ b/src/astronomy/survey_astro.ts @@ -0,0 +1,22 @@ +/** Survey Astro module — tsb analytics library. */ + +/** Options for Survey Astro. */ +export interface SurveyAstroOptions { tol?: number; maxIter?: number; } + +/** Result from Survey Astro. */ +export interface SurveyAstroResult { values: number[]; converged: boolean; } + +/** Compute Survey Astro. */ +export function computeSurveyAstro(data: number[], opts: SurveyAstroOptions = {}): SurveyAstroResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} + +export default { compute: computeSurveyAstro }; diff --git a/src/astronomy/transient.ts b/src/astronomy/transient.ts new file mode 100644 index 00000000..68194800 --- /dev/null +++ b/src/astronomy/transient.ts @@ -0,0 +1,22 @@ +/** Transient module — tsb analytics library. */ + +/** Options for Transient. */ +export interface TransientOptions { tol?: number; maxIter?: number; } + +/** Result from Transient. */ +export interface TransientResult { values: number[]; converged: boolean; } + +/** Compute Transient. */ +export function computeTransient(data: number[], opts: TransientOptions = {}): TransientResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} + +export default { compute: computeTransient }; diff --git a/src/astronomy/v2.ts b/src/astronomy/v2.ts new file mode 100644 index 00000000..7ee9dbfd --- /dev/null +++ b/src/astronomy/v2.ts @@ -0,0 +1,15 @@ +/** Astronomy V2 module — tsb analytics library. */ +export interface Astronomy v2Options { tol?: number; maxIter?: number; } +export interface Astronomy v2Result { values: number[]; converged: boolean; } +export function computeAstronomy v2(data: number[], opts: Astronomy v2Options = {}): Astronomy v2Result { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} +export default { compute: computeAstronomy v2 }; diff --git a/src/astronomy/v3.ts b/src/astronomy/v3.ts new file mode 100644 index 00000000..9edaf5b9 --- /dev/null +++ b/src/astronomy/v3.ts @@ -0,0 +1,15 @@ +/** Astronomy V3 module — tsb analytics library. */ +export interface Astronomy v3Options { tol?: number; maxIter?: number; } +export interface Astronomy v3Result { values: number[]; converged: boolean; } +export function computeAstronomy v3(data: number[], opts: Astronomy v3Options = {}): Astronomy v3Result { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} +export default { compute: computeAstronomy v3 }; diff --git a/src/astronomy/variability.ts b/src/astronomy/variability.ts new file mode 100644 index 00000000..3a97b30d --- /dev/null +++ b/src/astronomy/variability.ts @@ -0,0 +1,22 @@ +/** Variability module — tsb analytics library. */ + +/** Options for Variability. */ +export interface VariabilityOptions { tol?: number; maxIter?: number; } + +/** Result from Variability. */ +export interface VariabilityResult { values: number[]; converged: boolean; } + +/** Compute Variability. */ +export function computeVariability(data: number[], opts: VariabilityOptions = {}): VariabilityResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} + +export default { compute: computeVariability }; diff --git a/src/astronomy/wasm.ts b/src/astronomy/wasm.ts new file mode 100644 index 00000000..977ef323 --- /dev/null +++ b/src/astronomy/wasm.ts @@ -0,0 +1,15 @@ +/** Astronomy Wasm module — tsb analytics library. */ +export interface Astronomy wasmOptions { tol?: number; maxIter?: number; } +export interface Astronomy wasmResult { values: number[]; converged: boolean; } +export function computeAstronomy wasm(data: number[], opts: Astronomy wasmOptions = {}): Astronomy wasmResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} +export default { compute: computeAstronomy wasm }; diff --git a/src/astronomy/white_dwarf.ts b/src/astronomy/white_dwarf.ts new file mode 100644 index 00000000..150f1247 --- /dev/null +++ b/src/astronomy/white_dwarf.ts @@ -0,0 +1,22 @@ +/** White Dwarf module — tsb analytics library. */ + +/** Options for White Dwarf. */ +export interface WhiteDwarfOptions { tol?: number; maxIter?: number; } + +/** Result from White Dwarf. */ +export interface WhiteDwarfResult { values: number[]; converged: boolean; } + +/** Compute White Dwarf. */ +export function computeWhiteDwarf(data: number[], opts: WhiteDwarfOptions = {}): WhiteDwarfResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} + +export default { compute: computeWhiteDwarf }; diff --git a/src/astronomy/xlarge.ts b/src/astronomy/xlarge.ts new file mode 100644 index 00000000..2371bf56 --- /dev/null +++ b/src/astronomy/xlarge.ts @@ -0,0 +1,15 @@ +/** Astronomy Xlarge module — tsb analytics library. */ +export interface Astronomy xlargeOptions { tol?: number; maxIter?: number; } +export interface Astronomy xlargeResult { values: number[]; converged: boolean; } +export function computeAstronomy xlarge(data: number[], opts: Astronomy xlargeOptions = {}): Astronomy xlargeResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} +export default { compute: computeAstronomy xlarge }; diff --git a/src/bayes/abc.ts b/src/bayes/abc.ts new file mode 100644 index 00000000..b8393242 --- /dev/null +++ b/src/bayes/abc.ts @@ -0,0 +1,22 @@ +/** Abc module — tsb analytics library. */ + +/** Options for Abc. */ +export interface AbcOptions { tol?: number; maxIter?: number; } + +/** Result from Abc. */ +export interface AbcResult { values: number[]; converged: boolean; } + +/** Compute Abc. */ +export function computeAbc(data: number[], opts: AbcOptions = {}): AbcResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} + +export default { compute: computeAbc }; diff --git a/src/bayes/active_learning.ts b/src/bayes/active_learning.ts new file mode 100644 index 00000000..9795fa76 --- /dev/null +++ b/src/bayes/active_learning.ts @@ -0,0 +1,22 @@ +/** Active Learning module — tsb analytics library. */ + +/** Options for Active Learning. */ +export interface ActiveLearningOptions { tol?: number; maxIter?: number; } + +/** Result from Active Learning. */ +export interface ActiveLearningResult { values: number[]; converged: boolean; } + +/** Compute Active Learning. */ +export function computeActiveLearning(data: number[], opts: ActiveLearningOptions = {}): ActiveLearningResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} + +export default { compute: computeActiveLearning }; diff --git a/src/bayes/advanced.ts b/src/bayes/advanced.ts new file mode 100644 index 00000000..1be62ccf --- /dev/null +++ b/src/bayes/advanced.ts @@ -0,0 +1,15 @@ +/** Bayes Advanced module — tsb analytics library. */ +export interface Bayes advancedOptions { tol?: number; maxIter?: number; } +export interface Bayes advancedResult { values: number[]; converged: boolean; } +export function computeBayes advanced(data: number[], opts: Bayes advancedOptions = {}): Bayes advancedResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} +export default { compute: computeBayes advanced }; diff --git a/src/bayes/base2.ts b/src/bayes/base2.ts new file mode 100644 index 00000000..02a48c8c --- /dev/null +++ b/src/bayes/base2.ts @@ -0,0 +1,15 @@ +/** Bayes Base2 module — tsb analytics library. */ +export interface Bayes base2Options { tol?: number; maxIter?: number; } +export interface Bayes base2Result { values: number[]; converged: boolean; } +export function computeBayes base2(data: number[], opts: Bayes base2Options = {}): Bayes base2Result { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} +export default { compute: computeBayes base2 }; diff --git a/src/bayes/batch.ts b/src/bayes/batch.ts new file mode 100644 index 00000000..c98aae93 --- /dev/null +++ b/src/bayes/batch.ts @@ -0,0 +1,15 @@ +/** Bayes Batch module — tsb analytics library. */ +export interface Bayes batchOptions { tol?: number; maxIter?: number; } +export interface Bayes batchResult { values: number[]; converged: boolean; } +export function computeBayes batch(data: number[], opts: Bayes batchOptions = {}): Bayes batchResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} +export default { compute: computeBayes batch }; diff --git a/src/bayes/bayesian_nn.ts b/src/bayes/bayesian_nn.ts new file mode 100644 index 00000000..188d4a02 --- /dev/null +++ b/src/bayes/bayesian_nn.ts @@ -0,0 +1,22 @@ +/** Bayesian Nn module — tsb analytics library. */ + +/** Options for Bayesian Nn. */ +export interface BayesianNnOptions { tol?: number; maxIter?: number; } + +/** Result from Bayesian Nn. */ +export interface BayesianNnResult { values: number[]; converged: boolean; } + +/** Compute Bayesian Nn. */ +export function computeBayesianNn(data: number[], opts: BayesianNnOptions = {}): BayesianNnResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} + +export default { compute: computeBayesianNn }; diff --git a/src/bayes/bayesian_opt.ts b/src/bayes/bayesian_opt.ts new file mode 100644 index 00000000..014f0782 --- /dev/null +++ b/src/bayes/bayesian_opt.ts @@ -0,0 +1,22 @@ +/** Bayesian Opt module — tsb analytics library. */ + +/** Options for Bayesian Opt. */ +export interface BayesianOptOptions { tol?: number; maxIter?: number; } + +/** Result from Bayesian Opt. */ +export interface BayesianOptResult { values: number[]; converged: boolean; } + +/** Compute Bayesian Opt. */ +export function computeBayesianOpt(data: number[], opts: BayesianOptOptions = {}): BayesianOptResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} + +export default { compute: computeBayesianOpt }; diff --git a/src/bayes/bayesian_rl.ts b/src/bayes/bayesian_rl.ts new file mode 100644 index 00000000..59b13e20 --- /dev/null +++ b/src/bayes/bayesian_rl.ts @@ -0,0 +1,22 @@ +/** Bayesian Rl module — tsb analytics library. */ + +/** Options for Bayesian Rl. */ +export interface BayesianRlOptions { tol?: number; maxIter?: number; } + +/** Result from Bayesian Rl. */ +export interface BayesianRlResult { values: number[]; converged: boolean; } + +/** Compute Bayesian Rl. */ +export function computeBayesianRl(data: number[], opts: BayesianRlOptions = {}): BayesianRlResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} + +export default { compute: computeBayesianRl }; diff --git a/src/bayes/beta.ts b/src/bayes/beta.ts new file mode 100644 index 00000000..ccb15a13 --- /dev/null +++ b/src/bayes/beta.ts @@ -0,0 +1,15 @@ +/** Bayes Beta module — tsb analytics library. */ +export interface Bayes betaOptions { tol?: number; maxIter?: number; } +export interface Bayes betaResult { values: number[]; converged: boolean; } +export function computeBayes beta(data: number[], opts: Bayes betaOptions = {}): Bayes betaResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} +export default { compute: computeBayes beta }; diff --git a/src/bayes/cpu.ts b/src/bayes/cpu.ts new file mode 100644 index 00000000..71edfe99 --- /dev/null +++ b/src/bayes/cpu.ts @@ -0,0 +1,15 @@ +/** Bayes Cpu module — tsb analytics library. */ +export interface Bayes cpuOptions { tol?: number; maxIter?: number; } +export interface Bayes cpuResult { values: number[]; converged: boolean; } +export function computeBayes cpu(data: number[], opts: Bayes cpuOptions = {}): Bayes cpuResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} +export default { compute: computeBayes cpu }; diff --git a/src/bayes/dense.ts b/src/bayes/dense.ts new file mode 100644 index 00000000..077acf92 --- /dev/null +++ b/src/bayes/dense.ts @@ -0,0 +1,15 @@ +/** Bayes Dense module — tsb analytics library. */ +export interface Bayes denseOptions { tol?: number; maxIter?: number; } +export interface Bayes denseResult { values: number[]; converged: boolean; } +export function computeBayes dense(data: number[], opts: Bayes denseOptions = {}): Bayes denseResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} +export default { compute: computeBayes dense }; diff --git a/src/bayes/diffusion_bayes.ts b/src/bayes/diffusion_bayes.ts new file mode 100644 index 00000000..7226e4a2 --- /dev/null +++ b/src/bayes/diffusion_bayes.ts @@ -0,0 +1,22 @@ +/** Diffusion Bayes module — tsb analytics library. */ + +/** Options for Diffusion Bayes. */ +export interface DiffusionBayesOptions { tol?: number; maxIter?: number; } + +/** Result from Diffusion Bayes. */ +export interface DiffusionBayesResult { values: number[]; converged: boolean; } + +/** Compute Diffusion Bayes. */ +export function computeDiffusionBayes(data: number[], opts: DiffusionBayesOptions = {}): DiffusionBayesResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} + +export default { compute: computeDiffusionBayes }; diff --git a/src/bayes/distributed.ts b/src/bayes/distributed.ts new file mode 100644 index 00000000..49778abc --- /dev/null +++ b/src/bayes/distributed.ts @@ -0,0 +1,15 @@ +/** Bayes Distributed module — tsb analytics library. */ +export interface Bayes distributedOptions { tol?: number; maxIter?: number; } +export interface Bayes distributedResult { values: number[]; converged: boolean; } +export function computeBayes distributed(data: number[], opts: Bayes distributedOptions = {}): Bayes distributedResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} +export default { compute: computeBayes distributed }; diff --git a/src/bayes/elbo.ts b/src/bayes/elbo.ts new file mode 100644 index 00000000..2b71cfd9 --- /dev/null +++ b/src/bayes/elbo.ts @@ -0,0 +1,22 @@ +/** Elbo module — tsb analytics library. */ + +/** Options for Elbo. */ +export interface ElboOptions { tol?: number; maxIter?: number; } + +/** Result from Elbo. */ +export interface ElboResult { values: number[]; converged: boolean; } + +/** Compute Elbo. */ +export function computeElbo(data: number[], opts: ElboOptions = {}): ElboResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} + +export default { compute: computeElbo }; diff --git a/src/bayes/em.ts b/src/bayes/em.ts new file mode 100644 index 00000000..8cc7410e --- /dev/null +++ b/src/bayes/em.ts @@ -0,0 +1,22 @@ +/** Em module — tsb analytics library. */ + +/** Options for Em. */ +export interface EmOptions { tol?: number; maxIter?: number; } + +/** Result from Em. */ +export interface EmResult { values: number[]; converged: boolean; } + +/** Compute Em. */ +export function computeEm(data: number[], opts: EmOptions = {}): EmResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} + +export default { compute: computeEm }; diff --git a/src/bayes/entropy.ts b/src/bayes/entropy.ts new file mode 100644 index 00000000..d313aeaf --- /dev/null +++ b/src/bayes/entropy.ts @@ -0,0 +1,22 @@ +/** Entropy module — tsb analytics library. */ + +/** Options for Entropy. */ +export interface EntropyOptions { tol?: number; maxIter?: number; } + +/** Result from Entropy. */ +export interface EntropyResult { values: number[]; converged: boolean; } + +/** Compute Entropy. */ +export function computeEntropy(data: number[], opts: EntropyOptions = {}): EntropyResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} + +export default { compute: computeEntropy }; diff --git a/src/bayes/evidence.ts b/src/bayes/evidence.ts new file mode 100644 index 00000000..a1e871d4 --- /dev/null +++ b/src/bayes/evidence.ts @@ -0,0 +1,22 @@ +/** Evidence module — tsb analytics library. */ + +/** Options for Evidence. */ +export interface EvidenceOptions { tol?: number; maxIter?: number; } + +/** Result from Evidence. */ +export interface EvidenceResult { values: number[]; converged: boolean; } + +/** Compute Evidence. */ +export function computeEvidence(data: number[], opts: EvidenceOptions = {}): EvidenceResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} + +export default { compute: computeEvidence }; diff --git a/src/bayes/experimental.ts b/src/bayes/experimental.ts new file mode 100644 index 00000000..97d8ea93 --- /dev/null +++ b/src/bayes/experimental.ts @@ -0,0 +1,15 @@ +/** Bayes Experimental module — tsb analytics library. */ +export interface Bayes experimentalOptions { tol?: number; maxIter?: number; } +export interface Bayes experimentalResult { values: number[]; converged: boolean; } +export function computeBayes experimental(data: number[], opts: Bayes experimentalOptions = {}): Bayes experimentalResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} +export default { compute: computeBayes experimental }; diff --git a/src/bayes/experimental_design.ts b/src/bayes/experimental_design.ts new file mode 100644 index 00000000..fab13917 --- /dev/null +++ b/src/bayes/experimental_design.ts @@ -0,0 +1,22 @@ +/** Experimental Design module — tsb analytics library. */ + +/** Options for Experimental Design. */ +export interface ExperimentalDesignOptions { tol?: number; maxIter?: number; } + +/** Result from Experimental Design. */ +export interface ExperimentalDesignResult { values: number[]; converged: boolean; } + +/** Compute Experimental Design. */ +export function computeExperimentalDesign(data: number[], opts: ExperimentalDesignOptions = {}): ExperimentalDesignResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} + +export default { compute: computeExperimentalDesign }; diff --git a/src/bayes/fast.ts b/src/bayes/fast.ts new file mode 100644 index 00000000..312c3029 --- /dev/null +++ b/src/bayes/fast.ts @@ -0,0 +1,15 @@ +/** Bayes Fast module — tsb analytics library. */ +export interface Bayes fastOptions { tol?: number; maxIter?: number; } +export interface Bayes fastResult { values: number[]; converged: boolean; } +export function computeBayes fast(data: number[], opts: Bayes fastOptions = {}): Bayes fastResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} +export default { compute: computeBayes fast }; diff --git a/src/bayes/future.ts b/src/bayes/future.ts new file mode 100644 index 00000000..af81025e --- /dev/null +++ b/src/bayes/future.ts @@ -0,0 +1,15 @@ +/** Bayes Future module — tsb analytics library. */ +export interface Bayes futureOptions { tol?: number; maxIter?: number; } +export interface Bayes futureResult { values: number[]; converged: boolean; } +export function computeBayes future(data: number[], opts: Bayes futureOptions = {}): Bayes futureResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} +export default { compute: computeBayes future }; diff --git a/src/bayes/gaussian_process.ts b/src/bayes/gaussian_process.ts new file mode 100644 index 00000000..c9b70406 --- /dev/null +++ b/src/bayes/gaussian_process.ts @@ -0,0 +1,22 @@ +/** Gaussian Process module — tsb analytics library. */ + +/** Options for Gaussian Process. */ +export interface GaussianProcessOptions { tol?: number; maxIter?: number; } + +/** Result from Gaussian Process. */ +export interface GaussianProcessResult { values: number[]; converged: boolean; } + +/** Compute Gaussian Process. */ +export function computeGaussianProcess(data: number[], opts: GaussianProcessOptions = {}): GaussianProcessResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} + +export default { compute: computeGaussianProcess }; diff --git a/src/bayes/gibbs.ts b/src/bayes/gibbs.ts new file mode 100644 index 00000000..c3be8200 --- /dev/null +++ b/src/bayes/gibbs.ts @@ -0,0 +1,22 @@ +/** Gibbs module — tsb analytics library. */ + +/** Options for Gibbs. */ +export interface GibbsOptions { tol?: number; maxIter?: number; } + +/** Result from Gibbs. */ +export interface GibbsResult { values: number[]; converged: boolean; } + +/** Compute Gibbs. */ +export function computeGibbs(data: number[], opts: GibbsOptions = {}): GibbsResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} + +export default { compute: computeGibbs }; diff --git a/src/bayes/gpu.ts b/src/bayes/gpu.ts new file mode 100644 index 00000000..38cd0ee2 --- /dev/null +++ b/src/bayes/gpu.ts @@ -0,0 +1,15 @@ +/** Bayes Gpu module — tsb analytics library. */ +export interface Bayes gpuOptions { tol?: number; maxIter?: number; } +export interface Bayes gpuResult { values: number[]; converged: boolean; } +export function computeBayes gpu(data: number[], opts: Bayes gpuOptions = {}): Bayes gpuResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} +export default { compute: computeBayes gpu }; diff --git a/src/bayes/hmc.ts b/src/bayes/hmc.ts new file mode 100644 index 00000000..9bc9020f --- /dev/null +++ b/src/bayes/hmc.ts @@ -0,0 +1,22 @@ +/** Hmc module — tsb analytics library. */ + +/** Options for Hmc. */ +export interface HmcOptions { tol?: number; maxIter?: number; } + +/** Result from Hmc. */ +export interface HmcResult { values: number[]; converged: boolean; } + +/** Compute Hmc. */ +export function computeHmc(data: number[], opts: HmcOptions = {}): HmcResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} + +export default { compute: computeHmc }; diff --git a/src/bayes/information_gain.ts b/src/bayes/information_gain.ts new file mode 100644 index 00000000..7b2e3c60 --- /dev/null +++ b/src/bayes/information_gain.ts @@ -0,0 +1,22 @@ +/** Information Gain module — tsb analytics library. */ + +/** Options for Information Gain. */ +export interface InformationGainOptions { tol?: number; maxIter?: number; } + +/** Result from Information Gain. */ +export interface InformationGainResult { values: number[]; converged: boolean; } + +/** Compute Information Gain. */ +export function computeInformationGain(data: number[], opts: InformationGainOptions = {}): InformationGainResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} + +export default { compute: computeInformationGain }; diff --git a/src/bayes/kl_divergence.ts b/src/bayes/kl_divergence.ts new file mode 100644 index 00000000..f47785d1 --- /dev/null +++ b/src/bayes/kl_divergence.ts @@ -0,0 +1,22 @@ +/** Kl Divergence module — tsb analytics library. */ + +/** Options for Kl Divergence. */ +export interface KlDivergenceOptions { tol?: number; maxIter?: number; } + +/** Result from Kl Divergence. */ +export interface KlDivergenceResult { values: number[]; converged: boolean; } + +/** Compute Kl Divergence. */ +export function computeKlDivergence(data: number[], opts: KlDivergenceOptions = {}): KlDivergenceResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} + +export default { compute: computeKlDivergence }; diff --git a/src/bayes/laplace_approx.ts b/src/bayes/laplace_approx.ts new file mode 100644 index 00000000..52985088 --- /dev/null +++ b/src/bayes/laplace_approx.ts @@ -0,0 +1,22 @@ +/** Laplace Approx module — tsb analytics library. */ + +/** Options for Laplace Approx. */ +export interface LaplaceApproxOptions { tol?: number; maxIter?: number; } + +/** Result from Laplace Approx. */ +export interface LaplaceApproxResult { values: number[]; converged: boolean; } + +/** Compute Laplace Approx. */ +export function computeLaplaceApprox(data: number[], opts: LaplaceApproxOptions = {}): LaplaceApproxResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} + +export default { compute: computeLaplaceApprox }; diff --git a/src/bayes/large.ts b/src/bayes/large.ts new file mode 100644 index 00000000..0780ac7c --- /dev/null +++ b/src/bayes/large.ts @@ -0,0 +1,15 @@ +/** Bayes Large module — tsb analytics library. */ +export interface Bayes largeOptions { tol?: number; maxIter?: number; } +export interface Bayes largeResult { values: number[]; converged: boolean; } +export function computeBayes large(data: number[], opts: Bayes largeOptions = {}): Bayes largeResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} +export default { compute: computeBayes large }; diff --git a/src/bayes/legacy.ts b/src/bayes/legacy.ts new file mode 100644 index 00000000..c83496e5 --- /dev/null +++ b/src/bayes/legacy.ts @@ -0,0 +1,15 @@ +/** Bayes Legacy module — tsb analytics library. */ +export interface Bayes legacyOptions { tol?: number; maxIter?: number; } +export interface Bayes legacyResult { values: number[]; converged: boolean; } +export function computeBayes legacy(data: number[], opts: Bayes legacyOptions = {}): Bayes legacyResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} +export default { compute: computeBayes legacy }; diff --git a/src/bayes/likelihood.ts b/src/bayes/likelihood.ts new file mode 100644 index 00000000..ef8bf291 --- /dev/null +++ b/src/bayes/likelihood.ts @@ -0,0 +1,22 @@ +/** Likelihood module — tsb analytics library. */ + +/** Options for Likelihood. */ +export interface LikelihoodOptions { tol?: number; maxIter?: number; } + +/** Result from Likelihood. */ +export interface LikelihoodResult { values: number[]; converged: boolean; } + +/** Compute Likelihood. */ +export function computeLikelihood(data: number[], opts: LikelihoodOptions = {}): LikelihoodResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} + +export default { compute: computeLikelihood }; diff --git a/src/bayes/lite.ts b/src/bayes/lite.ts new file mode 100644 index 00000000..b53e42e9 --- /dev/null +++ b/src/bayes/lite.ts @@ -0,0 +1,15 @@ +/** Bayes Lite module — tsb analytics library. */ +export interface Bayes liteOptions { tol?: number; maxIter?: number; } +export interface Bayes liteResult { values: number[]; converged: boolean; } +export function computeBayes lite(data: number[], opts: Bayes liteOptions = {}): Bayes liteResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} +export default { compute: computeBayes lite }; diff --git a/src/bayes/mcmc.ts b/src/bayes/mcmc.ts new file mode 100644 index 00000000..8f617880 --- /dev/null +++ b/src/bayes/mcmc.ts @@ -0,0 +1,22 @@ +/** Mcmc module — tsb analytics library. */ + +/** Options for Mcmc. */ +export interface McmcOptions { tol?: number; maxIter?: number; } + +/** Result from Mcmc. */ +export interface McmcResult { values: number[]; converged: boolean; } + +/** Compute Mcmc. */ +export function computeMcmc(data: number[], opts: McmcOptions = {}): McmcResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} + +export default { compute: computeMcmc }; diff --git a/src/bayes/mh.ts b/src/bayes/mh.ts new file mode 100644 index 00000000..f1de10ad --- /dev/null +++ b/src/bayes/mh.ts @@ -0,0 +1,22 @@ +/** Mh module — tsb analytics library. */ + +/** Options for Mh. */ +export interface MhOptions { tol?: number; maxIter?: number; } + +/** Result from Mh. */ +export interface MhResult { values: number[]; converged: boolean; } + +/** Compute Mh. */ +export function computeMh(data: number[], opts: MhOptions = {}): MhResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} + +export default { compute: computeMh }; diff --git a/src/bayes/mini.ts b/src/bayes/mini.ts new file mode 100644 index 00000000..bf644303 --- /dev/null +++ b/src/bayes/mini.ts @@ -0,0 +1,15 @@ +/** Bayes Mini module — tsb analytics library. */ +export interface Bayes miniOptions { tol?: number; maxIter?: number; } +export interface Bayes miniResult { values: number[]; converged: boolean; } +export function computeBayes mini(data: number[], opts: Bayes miniOptions = {}): Bayes miniResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} +export default { compute: computeBayes mini }; diff --git a/src/bayes/mutual_information.ts b/src/bayes/mutual_information.ts new file mode 100644 index 00000000..b65a069c --- /dev/null +++ b/src/bayes/mutual_information.ts @@ -0,0 +1,22 @@ +/** Mutual Information module — tsb analytics library. */ + +/** Options for Mutual Information. */ +export interface MutualInformationOptions { tol?: number; maxIter?: number; } + +/** Result from Mutual Information. */ +export interface MutualInformationResult { values: number[]; converged: boolean; } + +/** Compute Mutual Information. */ +export function computeMutualInformation(data: number[], opts: MutualInformationOptions = {}): MutualInformationResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} + +export default { compute: computeMutualInformation }; diff --git a/src/bayes/next.ts b/src/bayes/next.ts new file mode 100644 index 00000000..c98e94a7 --- /dev/null +++ b/src/bayes/next.ts @@ -0,0 +1,15 @@ +/** Bayes Next module — tsb analytics library. */ +export interface Bayes nextOptions { tol?: number; maxIter?: number; } +export interface Bayes nextResult { values: number[]; converged: boolean; } +export function computeBayes next(data: number[], opts: Bayes nextOptions = {}): Bayes nextResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} +export default { compute: computeBayes next }; diff --git a/src/bayes/normalizing_flow.ts b/src/bayes/normalizing_flow.ts new file mode 100644 index 00000000..17d92c02 --- /dev/null +++ b/src/bayes/normalizing_flow.ts @@ -0,0 +1,22 @@ +/** Normalizing Flow module — tsb analytics library. */ + +/** Options for Normalizing Flow. */ +export interface NormalizingFlowOptions { tol?: number; maxIter?: number; } + +/** Result from Normalizing Flow. */ +export interface NormalizingFlowResult { values: number[]; converged: boolean; } + +/** Compute Normalizing Flow. */ +export function computeNormalizingFlow(data: number[], opts: NormalizingFlowOptions = {}): NormalizingFlowResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} + +export default { compute: computeNormalizingFlow }; diff --git a/src/bayes/nuts.ts b/src/bayes/nuts.ts new file mode 100644 index 00000000..3da26243 --- /dev/null +++ b/src/bayes/nuts.ts @@ -0,0 +1,22 @@ +/** Nuts module — tsb analytics library. */ + +/** Options for Nuts. */ +export interface NutsOptions { tol?: number; maxIter?: number; } + +/** Result from Nuts. */ +export interface NutsResult { values: number[]; converged: boolean; } + +/** Compute Nuts. */ +export function computeNuts(data: number[], opts: NutsOptions = {}): NutsResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} + +export default { compute: computeNuts }; diff --git a/src/bayes/online.ts b/src/bayes/online.ts new file mode 100644 index 00000000..085f10e4 --- /dev/null +++ b/src/bayes/online.ts @@ -0,0 +1,15 @@ +/** Bayes Online module — tsb analytics library. */ +export interface Bayes onlineOptions { tol?: number; maxIter?: number; } +export interface Bayes onlineResult { values: number[]; converged: boolean; } +export function computeBayes online(data: number[], opts: Bayes onlineOptions = {}): Bayes onlineResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} +export default { compute: computeBayes online }; diff --git a/src/bayes/parallel.ts b/src/bayes/parallel.ts new file mode 100644 index 00000000..636863b2 --- /dev/null +++ b/src/bayes/parallel.ts @@ -0,0 +1,15 @@ +/** Bayes Parallel module — tsb analytics library. */ +export interface Bayes parallelOptions { tol?: number; maxIter?: number; } +export interface Bayes parallelResult { values: number[]; converged: boolean; } +export function computeBayes parallel(data: number[], opts: Bayes parallelOptions = {}): Bayes parallelResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} +export default { compute: computeBayes parallel }; diff --git a/src/bayes/plus.ts b/src/bayes/plus.ts new file mode 100644 index 00000000..51e5f338 --- /dev/null +++ b/src/bayes/plus.ts @@ -0,0 +1,15 @@ +/** Bayes Plus module — tsb analytics library. */ +export interface Bayes plusOptions { tol?: number; maxIter?: number; } +export interface Bayes plusResult { values: number[]; converged: boolean; } +export function computeBayes plus(data: number[], opts: Bayes plusOptions = {}): Bayes plusResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} +export default { compute: computeBayes plus }; diff --git a/src/bayes/posterior.ts b/src/bayes/posterior.ts new file mode 100644 index 00000000..c1ca04e6 --- /dev/null +++ b/src/bayes/posterior.ts @@ -0,0 +1,22 @@ +/** Posterior module — tsb analytics library. */ + +/** Options for Posterior. */ +export interface PosteriorOptions { tol?: number; maxIter?: number; } + +/** Result from Posterior. */ +export interface PosteriorResult { values: number[]; converged: boolean; } + +/** Compute Posterior. */ +export function computePosterior(data: number[], opts: PosteriorOptions = {}): PosteriorResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} + +export default { compute: computePosterior }; diff --git a/src/bayes/predictive.ts b/src/bayes/predictive.ts new file mode 100644 index 00000000..4ecd4ccd --- /dev/null +++ b/src/bayes/predictive.ts @@ -0,0 +1,22 @@ +/** Predictive module — tsb analytics library. */ + +/** Options for Predictive. */ +export interface PredictiveOptions { tol?: number; maxIter?: number; } + +/** Result from Predictive. */ +export interface PredictiveResult { values: number[]; converged: boolean; } + +/** Compute Predictive. */ +export function computePredictive(data: number[], opts: PredictiveOptions = {}): PredictiveResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} + +export default { compute: computePredictive }; diff --git a/src/bayes/prior.ts b/src/bayes/prior.ts new file mode 100644 index 00000000..d66c4fb7 --- /dev/null +++ b/src/bayes/prior.ts @@ -0,0 +1,22 @@ +/** Prior module — tsb analytics library. */ + +/** Options for Prior. */ +export interface PriorOptions { tol?: number; maxIter?: number; } + +/** Result from Prior. */ +export interface PriorResult { values: number[]; converged: boolean; } + +/** Compute Prior. */ +export function computePrior(data: number[], opts: PriorOptions = {}): PriorResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} + +export default { compute: computePrior }; diff --git a/src/bayes/pro.ts b/src/bayes/pro.ts new file mode 100644 index 00000000..9fbc8c45 --- /dev/null +++ b/src/bayes/pro.ts @@ -0,0 +1,15 @@ +/** Bayes Pro module — tsb analytics library. */ +export interface Bayes proOptions { tol?: number; maxIter?: number; } +export interface Bayes proResult { values: number[]; converged: boolean; } +export function computeBayes pro(data: number[], opts: Bayes proOptions = {}): Bayes proResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} +export default { compute: computeBayes pro }; diff --git a/src/bayes/robust.ts b/src/bayes/robust.ts new file mode 100644 index 00000000..030d676a --- /dev/null +++ b/src/bayes/robust.ts @@ -0,0 +1,15 @@ +/** Bayes Robust module — tsb analytics library. */ +export interface Bayes robustOptions { tol?: number; maxIter?: number; } +export interface Bayes robustResult { values: number[]; converged: boolean; } +export function computeBayes robust(data: number[], opts: Bayes robustOptions = {}): Bayes robustResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} +export default { compute: computeBayes robust }; diff --git a/src/bayes/score_matching.ts b/src/bayes/score_matching.ts new file mode 100644 index 00000000..4bc77a8a --- /dev/null +++ b/src/bayes/score_matching.ts @@ -0,0 +1,22 @@ +/** Score Matching module — tsb analytics library. */ + +/** Options for Score Matching. */ +export interface ScoreMatchingOptions { tol?: number; maxIter?: number; } + +/** Result from Score Matching. */ +export interface ScoreMatchingResult { values: number[]; converged: boolean; } + +/** Compute Score Matching. */ +export function computeScoreMatching(data: number[], opts: ScoreMatchingOptions = {}): ScoreMatchingResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} + +export default { compute: computeScoreMatching }; diff --git a/src/bayes/small.ts b/src/bayes/small.ts new file mode 100644 index 00000000..fa6aef65 --- /dev/null +++ b/src/bayes/small.ts @@ -0,0 +1,15 @@ +/** Bayes Small module — tsb analytics library. */ +export interface Bayes smallOptions { tol?: number; maxIter?: number; } +export interface Bayes smallResult { values: number[]; converged: boolean; } +export function computeBayes small(data: number[], opts: Bayes smallOptions = {}): Bayes smallResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} +export default { compute: computeBayes small }; diff --git a/src/bayes/smc.ts b/src/bayes/smc.ts new file mode 100644 index 00000000..ee89912d --- /dev/null +++ b/src/bayes/smc.ts @@ -0,0 +1,22 @@ +/** Smc module — tsb analytics library. */ + +/** Options for Smc. */ +export interface SmcOptions { tol?: number; maxIter?: number; } + +/** Result from Smc. */ +export interface SmcResult { values: number[]; converged: boolean; } + +/** Compute Smc. */ +export function computeSmc(data: number[], opts: SmcOptions = {}): SmcResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} + +export default { compute: computeSmc }; diff --git a/src/bayes/sparse.ts b/src/bayes/sparse.ts new file mode 100644 index 00000000..2fb541e8 --- /dev/null +++ b/src/bayes/sparse.ts @@ -0,0 +1,15 @@ +/** Bayes Sparse module — tsb analytics library. */ +export interface Bayes sparseOptions { tol?: number; maxIter?: number; } +export interface Bayes sparseResult { values: number[]; converged: boolean; } +export function computeBayes sparse(data: number[], opts: Bayes sparseOptions = {}): Bayes sparseResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} +export default { compute: computeBayes sparse }; diff --git a/src/bayes/stable.ts b/src/bayes/stable.ts new file mode 100644 index 00000000..f423bb2d --- /dev/null +++ b/src/bayes/stable.ts @@ -0,0 +1,15 @@ +/** Bayes Stable module — tsb analytics library. */ +export interface Bayes stableOptions { tol?: number; maxIter?: number; } +export interface Bayes stableResult { values: number[]; converged: boolean; } +export function computeBayes stable(data: number[], opts: Bayes stableOptions = {}): Bayes stableResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} +export default { compute: computeBayes stable }; diff --git a/src/bayes/streaming.ts b/src/bayes/streaming.ts new file mode 100644 index 00000000..5c46ed98 --- /dev/null +++ b/src/bayes/streaming.ts @@ -0,0 +1,15 @@ +/** Bayes Streaming module — tsb analytics library. */ +export interface Bayes streamingOptions { tol?: number; maxIter?: number; } +export interface Bayes streamingResult { values: number[]; converged: boolean; } +export function computeBayes streaming(data: number[], opts: Bayes streamingOptions = {}): Bayes streamingResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} +export default { compute: computeBayes streaming }; diff --git a/src/bayes/v2.ts b/src/bayes/v2.ts new file mode 100644 index 00000000..b09895a5 --- /dev/null +++ b/src/bayes/v2.ts @@ -0,0 +1,15 @@ +/** Bayes V2 module — tsb analytics library. */ +export interface Bayes v2Options { tol?: number; maxIter?: number; } +export interface Bayes v2Result { values: number[]; converged: boolean; } +export function computeBayes v2(data: number[], opts: Bayes v2Options = {}): Bayes v2Result { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} +export default { compute: computeBayes v2 }; diff --git a/src/bayes/v3.ts b/src/bayes/v3.ts new file mode 100644 index 00000000..a4464a74 --- /dev/null +++ b/src/bayes/v3.ts @@ -0,0 +1,15 @@ +/** Bayes V3 module — tsb analytics library. */ +export interface Bayes v3Options { tol?: number; maxIter?: number; } +export interface Bayes v3Result { values: number[]; converged: boolean; } +export function computeBayes v3(data: number[], opts: Bayes v3Options = {}): Bayes v3Result { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} +export default { compute: computeBayes v3 }; diff --git a/src/bayes/vae_bayes.ts b/src/bayes/vae_bayes.ts new file mode 100644 index 00000000..7638ab24 --- /dev/null +++ b/src/bayes/vae_bayes.ts @@ -0,0 +1,22 @@ +/** Vae Bayes module — tsb analytics library. */ + +/** Options for Vae Bayes. */ +export interface VaeBayesOptions { tol?: number; maxIter?: number; } + +/** Result from Vae Bayes. */ +export interface VaeBayesResult { values: number[]; converged: boolean; } + +/** Compute Vae Bayes. */ +export function computeVaeBayes(data: number[], opts: VaeBayesOptions = {}): VaeBayesResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} + +export default { compute: computeVaeBayes }; diff --git a/src/bayes/variational_bayes.ts b/src/bayes/variational_bayes.ts new file mode 100644 index 00000000..9b8e97bd --- /dev/null +++ b/src/bayes/variational_bayes.ts @@ -0,0 +1,22 @@ +/** Variational Bayes module — tsb analytics library. */ + +/** Options for Variational Bayes. */ +export interface VariationalBayesOptions { tol?: number; maxIter?: number; } + +/** Result from Variational Bayes. */ +export interface VariationalBayesResult { values: number[]; converged: boolean; } + +/** Compute Variational Bayes. */ +export function computeVariationalBayes(data: number[], opts: VariationalBayesOptions = {}): VariationalBayesResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} + +export default { compute: computeVariationalBayes }; diff --git a/src/bayes/wasm.ts b/src/bayes/wasm.ts new file mode 100644 index 00000000..7b0aae77 --- /dev/null +++ b/src/bayes/wasm.ts @@ -0,0 +1,15 @@ +/** Bayes Wasm module — tsb analytics library. */ +export interface Bayes wasmOptions { tol?: number; maxIter?: number; } +export interface Bayes wasmResult { values: number[]; converged: boolean; } +export function computeBayes wasm(data: number[], opts: Bayes wasmOptions = {}): Bayes wasmResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} +export default { compute: computeBayes wasm }; diff --git a/src/bayes/xlarge.ts b/src/bayes/xlarge.ts new file mode 100644 index 00000000..4f089970 --- /dev/null +++ b/src/bayes/xlarge.ts @@ -0,0 +1,15 @@ +/** Bayes Xlarge module — tsb analytics library. */ +export interface Bayes xlargeOptions { tol?: number; maxIter?: number; } +export interface Bayes xlargeResult { values: number[]; converged: boolean; } +export function computeBayes xlarge(data: number[], opts: Bayes xlargeOptions = {}): Bayes xlargeResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} +export default { compute: computeBayes xlarge }; diff --git a/src/bio/admixture.ts b/src/bio/admixture.ts new file mode 100644 index 00000000..8591c8cc --- /dev/null +++ b/src/bio/admixture.ts @@ -0,0 +1,22 @@ +/** Admixture module — tsb analytics library. */ + +/** Options for Admixture. */ +export interface AdmixtureOptions { tol?: number; maxIter?: number; } + +/** Result from Admixture. */ +export interface AdmixtureResult { values: number[]; converged: boolean; } + +/** Compute Admixture. */ +export function computeAdmixture(data: number[], opts: AdmixtureOptions = {}): AdmixtureResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} + +export default { compute: computeAdmixture }; diff --git a/src/bio/advanced.ts b/src/bio/advanced.ts new file mode 100644 index 00000000..68cf9185 --- /dev/null +++ b/src/bio/advanced.ts @@ -0,0 +1,15 @@ +/** Bio Advanced module — tsb analytics library. */ +export interface Bio advancedOptions { tol?: number; maxIter?: number; } +export interface Bio advancedResult { values: number[]; converged: boolean; } +export function computeBio advanced(data: number[], opts: Bio advancedOptions = {}): Bio advancedResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} +export default { compute: computeBio advanced }; diff --git a/src/bio/alignment.ts b/src/bio/alignment.ts new file mode 100644 index 00000000..d9072c48 --- /dev/null +++ b/src/bio/alignment.ts @@ -0,0 +1,22 @@ +/** Alignment module — tsb analytics library. */ + +/** Options for Alignment. */ +export interface AlignmentOptions { tol?: number; maxIter?: number; } + +/** Result from Alignment. */ +export interface AlignmentResult { values: number[]; converged: boolean; } + +/** Compute Alignment. */ +export function computeAlignment(data: number[], opts: AlignmentOptions = {}): AlignmentResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} + +export default { compute: computeAlignment }; diff --git a/src/bio/ancestry.ts b/src/bio/ancestry.ts new file mode 100644 index 00000000..6b787acc --- /dev/null +++ b/src/bio/ancestry.ts @@ -0,0 +1,22 @@ +/** Ancestry module — tsb analytics library. */ + +/** Options for Ancestry. */ +export interface AncestryOptions { tol?: number; maxIter?: number; } + +/** Result from Ancestry. */ +export interface AncestryResult { values: number[]; converged: boolean; } + +/** Compute Ancestry. */ +export function computeAncestry(data: number[], opts: AncestryOptions = {}): AncestryResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} + +export default { compute: computeAncestry }; diff --git a/src/bio/base2.ts b/src/bio/base2.ts new file mode 100644 index 00000000..6041b6d3 --- /dev/null +++ b/src/bio/base2.ts @@ -0,0 +1,15 @@ +/** Bio Base2 module — tsb analytics library. */ +export interface Bio base2Options { tol?: number; maxIter?: number; } +export interface Bio base2Result { values: number[]; converged: boolean; } +export function computeBio base2(data: number[], opts: Bio base2Options = {}): Bio base2Result { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} +export default { compute: computeBio base2 }; diff --git a/src/bio/batch.ts b/src/bio/batch.ts new file mode 100644 index 00000000..02b40002 --- /dev/null +++ b/src/bio/batch.ts @@ -0,0 +1,15 @@ +/** Bio Batch module — tsb analytics library. */ +export interface Bio batchOptions { tol?: number; maxIter?: number; } +export interface Bio batchResult { values: number[]; converged: boolean; } +export function computeBio batch(data: number[], opts: Bio batchOptions = {}): Bio batchResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} +export default { compute: computeBio batch }; diff --git a/src/bio/bayesian_phylo.ts b/src/bio/bayesian_phylo.ts new file mode 100644 index 00000000..2cde71fe --- /dev/null +++ b/src/bio/bayesian_phylo.ts @@ -0,0 +1,22 @@ +/** Bayesian Phylo module — tsb analytics library. */ + +/** Options for Bayesian Phylo. */ +export interface BayesianPhyloOptions { tol?: number; maxIter?: number; } + +/** Result from Bayesian Phylo. */ +export interface BayesianPhyloResult { values: number[]; converged: boolean; } + +/** Compute Bayesian Phylo. */ +export function computeBayesianPhylo(data: number[], opts: BayesianPhyloOptions = {}): BayesianPhyloResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} + +export default { compute: computeBayesianPhylo }; diff --git a/src/bio/beta.ts b/src/bio/beta.ts new file mode 100644 index 00000000..0cd11e32 --- /dev/null +++ b/src/bio/beta.ts @@ -0,0 +1,15 @@ +/** Bio Beta module — tsb analytics library. */ +export interface Bio betaOptions { tol?: number; maxIter?: number; } +export interface Bio betaResult { values: number[]; converged: boolean; } +export function computeBio beta(data: number[], opts: Bio betaOptions = {}): Bio betaResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} +export default { compute: computeBio beta }; diff --git a/src/bio/coalescent.ts b/src/bio/coalescent.ts new file mode 100644 index 00000000..2689ae84 --- /dev/null +++ b/src/bio/coalescent.ts @@ -0,0 +1,22 @@ +/** Coalescent module — tsb analytics library. */ + +/** Options for Coalescent. */ +export interface CoalescentOptions { tol?: number; maxIter?: number; } + +/** Result from Coalescent. */ +export interface CoalescentResult { values: number[]; converged: boolean; } + +/** Compute Coalescent. */ +export function computeCoalescent(data: number[], opts: CoalescentOptions = {}): CoalescentResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} + +export default { compute: computeCoalescent }; diff --git a/src/bio/comparative.ts b/src/bio/comparative.ts new file mode 100644 index 00000000..8a4490aa --- /dev/null +++ b/src/bio/comparative.ts @@ -0,0 +1,22 @@ +/** Comparative module — tsb analytics library. */ + +/** Options for Comparative. */ +export interface ComparativeOptions { tol?: number; maxIter?: number; } + +/** Result from Comparative. */ +export interface ComparativeResult { values: number[]; converged: boolean; } + +/** Compute Comparative. */ +export function computeComparative(data: number[], opts: ComparativeOptions = {}): ComparativeResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} + +export default { compute: computeComparative }; diff --git a/src/bio/cpu.ts b/src/bio/cpu.ts new file mode 100644 index 00000000..597ccdd8 --- /dev/null +++ b/src/bio/cpu.ts @@ -0,0 +1,15 @@ +/** Bio Cpu module — tsb analytics library. */ +export interface Bio cpuOptions { tol?: number; maxIter?: number; } +export interface Bio cpuResult { values: number[]; converged: boolean; } +export function computeBio cpu(data: number[], opts: Bio cpuOptions = {}): Bio cpuResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} +export default { compute: computeBio cpu }; diff --git a/src/bio/demography_bio.ts b/src/bio/demography_bio.ts new file mode 100644 index 00000000..02db6f65 --- /dev/null +++ b/src/bio/demography_bio.ts @@ -0,0 +1,22 @@ +/** Demography Bio module — tsb analytics library. */ + +/** Options for Demography Bio. */ +export interface DemographyBioOptions { tol?: number; maxIter?: number; } + +/** Result from Demography Bio. */ +export interface DemographyBioResult { values: number[]; converged: boolean; } + +/** Compute Demography Bio. */ +export function computeDemographyBio(data: number[], opts: DemographyBioOptions = {}): DemographyBioResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} + +export default { compute: computeDemographyBio }; diff --git a/src/bio/dense.ts b/src/bio/dense.ts new file mode 100644 index 00000000..aaa5487c --- /dev/null +++ b/src/bio/dense.ts @@ -0,0 +1,15 @@ +/** Bio Dense module — tsb analytics library. */ +export interface Bio denseOptions { tol?: number; maxIter?: number; } +export interface Bio denseResult { values: number[]; converged: boolean; } +export function computeBio dense(data: number[], opts: Bio denseOptions = {}): Bio denseResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} +export default { compute: computeBio dense }; diff --git a/src/bio/distributed.ts b/src/bio/distributed.ts new file mode 100644 index 00000000..0817ed30 --- /dev/null +++ b/src/bio/distributed.ts @@ -0,0 +1,15 @@ +/** Bio Distributed module — tsb analytics library. */ +export interface Bio distributedOptions { tol?: number; maxIter?: number; } +export interface Bio distributedResult { values: number[]; converged: boolean; } +export function computeBio distributed(data: number[], opts: Bio distributedOptions = {}): Bio distributedResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} +export default { compute: computeBio distributed }; diff --git a/src/bio/docking.ts b/src/bio/docking.ts new file mode 100644 index 00000000..f2850a1b --- /dev/null +++ b/src/bio/docking.ts @@ -0,0 +1,22 @@ +/** Docking module — tsb analytics library. */ + +/** Options for Docking. */ +export interface DockingOptions { tol?: number; maxIter?: number; } + +/** Result from Docking. */ +export interface DockingResult { values: number[]; converged: boolean; } + +/** Compute Docking. */ +export function computeDocking(data: number[], opts: DockingOptions = {}): DockingResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} + +export default { compute: computeDocking }; diff --git a/src/bio/eqtl.ts b/src/bio/eqtl.ts new file mode 100644 index 00000000..c224b9d6 --- /dev/null +++ b/src/bio/eqtl.ts @@ -0,0 +1,22 @@ +/** Eqtl module — tsb analytics library. */ + +/** Options for Eqtl. */ +export interface EqtlOptions { tol?: number; maxIter?: number; } + +/** Result from Eqtl. */ +export interface EqtlResult { values: number[]; converged: boolean; } + +/** Compute Eqtl. */ +export function computeEqtl(data: number[], opts: EqtlOptions = {}): EqtlResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} + +export default { compute: computeEqtl }; diff --git a/src/bio/experimental.ts b/src/bio/experimental.ts new file mode 100644 index 00000000..08a2f51f --- /dev/null +++ b/src/bio/experimental.ts @@ -0,0 +1,15 @@ +/** Bio Experimental module — tsb analytics library. */ +export interface Bio experimentalOptions { tol?: number; maxIter?: number; } +export interface Bio experimentalResult { values: number[]; converged: boolean; } +export function computeBio experimental(data: number[], opts: Bio experimentalOptions = {}): Bio experimentalResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} +export default { compute: computeBio experimental }; diff --git a/src/bio/expression.ts b/src/bio/expression.ts new file mode 100644 index 00000000..001df1cd --- /dev/null +++ b/src/bio/expression.ts @@ -0,0 +1,22 @@ +/** Expression module — tsb analytics library. */ + +/** Options for Expression. */ +export interface ExpressionOptions { tol?: number; maxIter?: number; } + +/** Result from Expression. */ +export interface ExpressionResult { values: number[]; converged: boolean; } + +/** Compute Expression. */ +export function computeExpression(data: number[], opts: ExpressionOptions = {}): ExpressionResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} + +export default { compute: computeExpression }; diff --git a/src/bio/fast.ts b/src/bio/fast.ts new file mode 100644 index 00000000..d1c7da8e --- /dev/null +++ b/src/bio/fast.ts @@ -0,0 +1,15 @@ +/** Bio Fast module — tsb analytics library. */ +export interface Bio fastOptions { tol?: number; maxIter?: number; } +export interface Bio fastResult { values: number[]; converged: boolean; } +export function computeBio fast(data: number[], opts: Bio fastOptions = {}): Bio fastResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} +export default { compute: computeBio fast }; diff --git a/src/bio/folding.ts b/src/bio/folding.ts new file mode 100644 index 00000000..e54b3c36 --- /dev/null +++ b/src/bio/folding.ts @@ -0,0 +1,22 @@ +/** Folding module — tsb analytics library. */ + +/** Options for Folding. */ +export interface FoldingOptions { tol?: number; maxIter?: number; } + +/** Result from Folding. */ +export interface FoldingResult { values: number[]; converged: boolean; } + +/** Compute Folding. */ +export function computeFolding(data: number[], opts: FoldingOptions = {}): FoldingResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} + +export default { compute: computeFolding }; diff --git a/src/bio/functional.ts b/src/bio/functional.ts new file mode 100644 index 00000000..d5ed05e4 --- /dev/null +++ b/src/bio/functional.ts @@ -0,0 +1,22 @@ +/** Functional module — tsb analytics library. */ + +/** Options for Functional. */ +export interface FunctionalOptions { tol?: number; maxIter?: number; } + +/** Result from Functional. */ +export interface FunctionalResult { values: number[]; converged: boolean; } + +/** Compute Functional. */ +export function computeFunctional(data: number[], opts: FunctionalOptions = {}): FunctionalResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} + +export default { compute: computeFunctional }; diff --git a/src/bio/future.ts b/src/bio/future.ts new file mode 100644 index 00000000..ffd18bb6 --- /dev/null +++ b/src/bio/future.ts @@ -0,0 +1,15 @@ +/** Bio Future module — tsb analytics library. */ +export interface Bio futureOptions { tol?: number; maxIter?: number; } +export interface Bio futureResult { values: number[]; converged: boolean; } +export function computeBio future(data: number[], opts: Bio futureOptions = {}): Bio futureResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} +export default { compute: computeBio future }; diff --git a/src/bio/genome.ts b/src/bio/genome.ts new file mode 100644 index 00000000..c3879cd5 --- /dev/null +++ b/src/bio/genome.ts @@ -0,0 +1,22 @@ +/** Genome module — tsb analytics library. */ + +/** Options for Genome. */ +export interface GenomeOptions { tol?: number; maxIter?: number; } + +/** Result from Genome. */ +export interface GenomeResult { values: number[]; converged: boolean; } + +/** Compute Genome. */ +export function computeGenome(data: number[], opts: GenomeOptions = {}): GenomeResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} + +export default { compute: computeGenome }; diff --git a/src/bio/gpu.ts b/src/bio/gpu.ts new file mode 100644 index 00000000..652afde2 --- /dev/null +++ b/src/bio/gpu.ts @@ -0,0 +1,15 @@ +/** Bio Gpu module — tsb analytics library. */ +export interface Bio gpuOptions { tol?: number; maxIter?: number; } +export interface Bio gpuResult { values: number[]; converged: boolean; } +export function computeBio gpu(data: number[], opts: Bio gpuOptions = {}): Bio gpuResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} +export default { compute: computeBio gpu }; diff --git a/src/bio/gwas.ts b/src/bio/gwas.ts new file mode 100644 index 00000000..56ec19ad --- /dev/null +++ b/src/bio/gwas.ts @@ -0,0 +1,22 @@ +/** Gwas module — tsb analytics library. */ + +/** Options for Gwas. */ +export interface GwasOptions { tol?: number; maxIter?: number; } + +/** Result from Gwas. */ +export interface GwasResult { values: number[]; converged: boolean; } + +/** Compute Gwas. */ +export function computeGwas(data: number[], opts: GwasOptions = {}): GwasResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} + +export default { compute: computeGwas }; diff --git a/src/bio/imputation.ts b/src/bio/imputation.ts new file mode 100644 index 00000000..41014255 --- /dev/null +++ b/src/bio/imputation.ts @@ -0,0 +1,22 @@ +/** Imputation module — tsb analytics library. */ + +/** Options for Imputation. */ +export interface ImputationOptions { tol?: number; maxIter?: number; } + +/** Result from Imputation. */ +export interface ImputationResult { values: number[]; converged: boolean; } + +/** Compute Imputation. */ +export function computeImputation(data: number[], opts: ImputationOptions = {}): ImputationResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} + +export default { compute: computeImputation }; diff --git a/src/bio/large.ts b/src/bio/large.ts new file mode 100644 index 00000000..93c7ef56 --- /dev/null +++ b/src/bio/large.ts @@ -0,0 +1,15 @@ +/** Bio Large module — tsb analytics library. */ +export interface Bio largeOptions { tol?: number; maxIter?: number; } +export interface Bio largeResult { values: number[]; converged: boolean; } +export function computeBio large(data: number[], opts: Bio largeOptions = {}): Bio largeResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} +export default { compute: computeBio large }; diff --git a/src/bio/legacy.ts b/src/bio/legacy.ts new file mode 100644 index 00000000..ce7f81ab --- /dev/null +++ b/src/bio/legacy.ts @@ -0,0 +1,15 @@ +/** Bio Legacy module — tsb analytics library. */ +export interface Bio legacyOptions { tol?: number; maxIter?: number; } +export interface Bio legacyResult { values: number[]; converged: boolean; } +export function computeBio legacy(data: number[], opts: Bio legacyOptions = {}): Bio legacyResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} +export default { compute: computeBio legacy }; diff --git a/src/bio/lite.ts b/src/bio/lite.ts new file mode 100644 index 00000000..acab1c5e --- /dev/null +++ b/src/bio/lite.ts @@ -0,0 +1,15 @@ +/** Bio Lite module — tsb analytics library. */ +export interface Bio liteOptions { tol?: number; maxIter?: number; } +export interface Bio liteResult { values: number[]; converged: boolean; } +export function computeBio lite(data: number[], opts: Bio liteOptions = {}): Bio liteResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} +export default { compute: computeBio lite }; diff --git a/src/bio/metabolomics.ts b/src/bio/metabolomics.ts new file mode 100644 index 00000000..599e7880 --- /dev/null +++ b/src/bio/metabolomics.ts @@ -0,0 +1,22 @@ +/** Metabolomics module — tsb analytics library. */ + +/** Options for Metabolomics. */ +export interface MetabolomicsOptions { tol?: number; maxIter?: number; } + +/** Result from Metabolomics. */ +export interface MetabolomicsResult { values: number[]; converged: boolean; } + +/** Compute Metabolomics. */ +export function computeMetabolomics(data: number[], opts: MetabolomicsOptions = {}): MetabolomicsResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} + +export default { compute: computeMetabolomics }; diff --git a/src/bio/migration.ts b/src/bio/migration.ts new file mode 100644 index 00000000..4b3a750e --- /dev/null +++ b/src/bio/migration.ts @@ -0,0 +1,22 @@ +/** Migration module — tsb analytics library. */ + +/** Options for Migration. */ +export interface MigrationOptions { tol?: number; maxIter?: number; } + +/** Result from Migration. */ +export interface MigrationResult { values: number[]; converged: boolean; } + +/** Compute Migration. */ +export function computeMigration(data: number[], opts: MigrationOptions = {}): MigrationResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} + +export default { compute: computeMigration }; diff --git a/src/bio/mini.ts b/src/bio/mini.ts new file mode 100644 index 00000000..7d3bea7c --- /dev/null +++ b/src/bio/mini.ts @@ -0,0 +1,15 @@ +/** Bio Mini module — tsb analytics library. */ +export interface Bio miniOptions { tol?: number; maxIter?: number; } +export interface Bio miniResult { values: number[]; converged: boolean; } +export function computeBio mini(data: number[], opts: Bio miniOptions = {}): Bio miniResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} +export default { compute: computeBio mini }; diff --git a/src/bio/next.ts b/src/bio/next.ts new file mode 100644 index 00000000..fd626de4 --- /dev/null +++ b/src/bio/next.ts @@ -0,0 +1,15 @@ +/** Bio Next module — tsb analytics library. */ +export interface Bio nextOptions { tol?: number; maxIter?: number; } +export interface Bio nextResult { values: number[]; converged: boolean; } +export function computeBio next(data: number[], opts: Bio nextOptions = {}): Bio nextResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} +export default { compute: computeBio next }; diff --git a/src/bio/online.ts b/src/bio/online.ts new file mode 100644 index 00000000..0648332c --- /dev/null +++ b/src/bio/online.ts @@ -0,0 +1,15 @@ +/** Bio Online module — tsb analytics library. */ +export interface Bio onlineOptions { tol?: number; maxIter?: number; } +export interface Bio onlineResult { values: number[]; converged: boolean; } +export function computeBio online(data: number[], opts: Bio onlineOptions = {}): Bio onlineResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} +export default { compute: computeBio online }; diff --git a/src/bio/ontology.ts b/src/bio/ontology.ts new file mode 100644 index 00000000..2fb2c89c --- /dev/null +++ b/src/bio/ontology.ts @@ -0,0 +1,22 @@ +/** Ontology module — tsb analytics library. */ + +/** Options for Ontology. */ +export interface OntologyOptions { tol?: number; maxIter?: number; } + +/** Result from Ontology. */ +export interface OntologyResult { values: number[]; converged: boolean; } + +/** Compute Ontology. */ +export function computeOntology(data: number[], opts: OntologyOptions = {}): OntologyResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} + +export default { compute: computeOntology }; diff --git a/src/bio/parallel.ts b/src/bio/parallel.ts new file mode 100644 index 00000000..574eab73 --- /dev/null +++ b/src/bio/parallel.ts @@ -0,0 +1,15 @@ +/** Bio Parallel module — tsb analytics library. */ +export interface Bio parallelOptions { tol?: number; maxIter?: number; } +export interface Bio parallelResult { values: number[]; converged: boolean; } +export function computeBio parallel(data: number[], opts: Bio parallelOptions = {}): Bio parallelResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} +export default { compute: computeBio parallel }; diff --git a/src/bio/pathway.ts b/src/bio/pathway.ts new file mode 100644 index 00000000..343cb312 --- /dev/null +++ b/src/bio/pathway.ts @@ -0,0 +1,22 @@ +/** Pathway module — tsb analytics library. */ + +/** Options for Pathway. */ +export interface PathwayOptions { tol?: number; maxIter?: number; } + +/** Result from Pathway. */ +export interface PathwayResult { values: number[]; converged: boolean; } + +/** Compute Pathway. */ +export function computePathway(data: number[], opts: PathwayOptions = {}): PathwayResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} + +export default { compute: computePathway }; diff --git a/src/bio/phylogenetics.ts b/src/bio/phylogenetics.ts new file mode 100644 index 00000000..88b124fc --- /dev/null +++ b/src/bio/phylogenetics.ts @@ -0,0 +1,22 @@ +/** Phylogenetics module — tsb analytics library. */ + +/** Options for Phylogenetics. */ +export interface PhylogeneticsOptions { tol?: number; maxIter?: number; } + +/** Result from Phylogenetics. */ +export interface PhylogeneticsResult { values: number[]; converged: boolean; } + +/** Compute Phylogenetics. */ +export function computePhylogenetics(data: number[], opts: PhylogeneticsOptions = {}): PhylogeneticsResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} + +export default { compute: computePhylogenetics }; diff --git a/src/bio/plus.ts b/src/bio/plus.ts new file mode 100644 index 00000000..0dd83026 --- /dev/null +++ b/src/bio/plus.ts @@ -0,0 +1,15 @@ +/** Bio Plus module — tsb analytics library. */ +export interface Bio plusOptions { tol?: number; maxIter?: number; } +export interface Bio plusResult { values: number[]; converged: boolean; } +export function computeBio plus(data: number[], opts: Bio plusOptions = {}): Bio plusResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} +export default { compute: computeBio plus }; diff --git a/src/bio/pro.ts b/src/bio/pro.ts new file mode 100644 index 00000000..13d0b861 --- /dev/null +++ b/src/bio/pro.ts @@ -0,0 +1,15 @@ +/** Bio Pro module — tsb analytics library. */ +export interface Bio proOptions { tol?: number; maxIter?: number; } +export interface Bio proResult { values: number[]; converged: boolean; } +export function computeBio pro(data: number[], opts: Bio proOptions = {}): Bio proResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} +export default { compute: computeBio pro }; diff --git a/src/bio/protein.ts b/src/bio/protein.ts new file mode 100644 index 00000000..c6995339 --- /dev/null +++ b/src/bio/protein.ts @@ -0,0 +1,22 @@ +/** Protein module — tsb analytics library. */ + +/** Options for Protein. */ +export interface ProteinOptions { tol?: number; maxIter?: number; } + +/** Result from Protein. */ +export interface ProteinResult { values: number[]; converged: boolean; } + +/** Compute Protein. */ +export function computeProtein(data: number[], opts: ProteinOptions = {}): ProteinResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} + +export default { compute: computeProtein }; diff --git a/src/bio/proteomics.ts b/src/bio/proteomics.ts new file mode 100644 index 00000000..674f243e --- /dev/null +++ b/src/bio/proteomics.ts @@ -0,0 +1,22 @@ +/** Proteomics module — tsb analytics library. */ + +/** Options for Proteomics. */ +export interface ProteomicsOptions { tol?: number; maxIter?: number; } + +/** Result from Proteomics. */ +export interface ProteomicsResult { values: number[]; converged: boolean; } + +/** Compute Proteomics. */ +export function computeProteomics(data: number[], opts: ProteomicsOptions = {}): ProteomicsResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} + +export default { compute: computeProteomics }; diff --git a/src/bio/prs.ts b/src/bio/prs.ts new file mode 100644 index 00000000..69d32e0f --- /dev/null +++ b/src/bio/prs.ts @@ -0,0 +1,22 @@ +/** Prs module — tsb analytics library. */ + +/** Options for Prs. */ +export interface PrsOptions { tol?: number; maxIter?: number; } + +/** Result from Prs. */ +export interface PrsResult { values: number[]; converged: boolean; } + +/** Compute Prs. */ +export function computePrs(data: number[], opts: PrsOptions = {}): PrsResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} + +export default { compute: computePrs }; diff --git a/src/bio/qtl.ts b/src/bio/qtl.ts new file mode 100644 index 00000000..1cfd400e --- /dev/null +++ b/src/bio/qtl.ts @@ -0,0 +1,22 @@ +/** Qtl module — tsb analytics library. */ + +/** Options for Qtl. */ +export interface QtlOptions { tol?: number; maxIter?: number; } + +/** Result from Qtl. */ +export interface QtlResult { values: number[]; converged: boolean; } + +/** Compute Qtl. */ +export function computeQtl(data: number[], opts: QtlOptions = {}): QtlResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} + +export default { compute: computeQtl }; diff --git a/src/bio/robust.ts b/src/bio/robust.ts new file mode 100644 index 00000000..5d83e005 --- /dev/null +++ b/src/bio/robust.ts @@ -0,0 +1,15 @@ +/** Bio Robust module — tsb analytics library. */ +export interface Bio robustOptions { tol?: number; maxIter?: number; } +export interface Bio robustResult { values: number[]; converged: boolean; } +export function computeBio robust(data: number[], opts: Bio robustOptions = {}): Bio robustResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} +export default { compute: computeBio robust }; diff --git a/src/bio/selection.ts b/src/bio/selection.ts new file mode 100644 index 00000000..162f83f2 --- /dev/null +++ b/src/bio/selection.ts @@ -0,0 +1,22 @@ +/** Selection module — tsb analytics library. */ + +/** Options for Selection. */ +export interface SelectionOptions { tol?: number; maxIter?: number; } + +/** Result from Selection. */ +export interface SelectionResult { values: number[]; converged: boolean; } + +/** Compute Selection. */ +export function computeSelection(data: number[], opts: SelectionOptions = {}): SelectionResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} + +export default { compute: computeSelection }; diff --git a/src/bio/sequence.ts b/src/bio/sequence.ts new file mode 100644 index 00000000..3472f1ae --- /dev/null +++ b/src/bio/sequence.ts @@ -0,0 +1,22 @@ +/** Sequence module — tsb analytics library. */ + +/** Options for Sequence. */ +export interface SequenceOptions { tol?: number; maxIter?: number; } + +/** Result from Sequence. */ +export interface SequenceResult { values: number[]; converged: boolean; } + +/** Compute Sequence. */ +export function computeSequence(data: number[], opts: SequenceOptions = {}): SequenceResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} + +export default { compute: computeSequence }; diff --git a/src/bio/small.ts b/src/bio/small.ts new file mode 100644 index 00000000..7cbae307 --- /dev/null +++ b/src/bio/small.ts @@ -0,0 +1,15 @@ +/** Bio Small module — tsb analytics library. */ +export interface Bio smallOptions { tol?: number; maxIter?: number; } +export interface Bio smallResult { values: number[]; converged: boolean; } +export function computeBio small(data: number[], opts: Bio smallOptions = {}): Bio smallResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} +export default { compute: computeBio small }; diff --git a/src/bio/snp.ts b/src/bio/snp.ts new file mode 100644 index 00000000..236e506f --- /dev/null +++ b/src/bio/snp.ts @@ -0,0 +1,22 @@ +/** Snp module — tsb analytics library. */ + +/** Options for Snp. */ +export interface SnpOptions { tol?: number; maxIter?: number; } + +/** Result from Snp. */ +export interface SnpResult { values: number[]; converged: boolean; } + +/** Compute Snp. */ +export function computeSnp(data: number[], opts: SnpOptions = {}): SnpResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} + +export default { compute: computeSnp }; diff --git a/src/bio/sparse.ts b/src/bio/sparse.ts new file mode 100644 index 00000000..53ed7838 --- /dev/null +++ b/src/bio/sparse.ts @@ -0,0 +1,15 @@ +/** Bio Sparse module — tsb analytics library. */ +export interface Bio sparseOptions { tol?: number; maxIter?: number; } +export interface Bio sparseResult { values: number[]; converged: boolean; } +export function computeBio sparse(data: number[], opts: Bio sparseOptions = {}): Bio sparseResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} +export default { compute: computeBio sparse }; diff --git a/src/bio/stable.ts b/src/bio/stable.ts new file mode 100644 index 00000000..a954af28 --- /dev/null +++ b/src/bio/stable.ts @@ -0,0 +1,15 @@ +/** Bio Stable module — tsb analytics library. */ +export interface Bio stableOptions { tol?: number; maxIter?: number; } +export interface Bio stableResult { values: number[]; converged: boolean; } +export function computeBio stable(data: number[], opts: Bio stableOptions = {}): Bio stableResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} +export default { compute: computeBio stable }; diff --git a/src/bio/streaming.ts b/src/bio/streaming.ts new file mode 100644 index 00000000..a0e3e250 --- /dev/null +++ b/src/bio/streaming.ts @@ -0,0 +1,15 @@ +/** Bio Streaming module — tsb analytics library. */ +export interface Bio streamingOptions { tol?: number; maxIter?: number; } +export interface Bio streamingResult { values: number[]; converged: boolean; } +export function computeBio streaming(data: number[], opts: Bio streamingOptions = {}): Bio streamingResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} +export default { compute: computeBio streaming }; diff --git a/src/bio/structure.ts b/src/bio/structure.ts new file mode 100644 index 00000000..162813c5 --- /dev/null +++ b/src/bio/structure.ts @@ -0,0 +1,22 @@ +/** Structure module — tsb analytics library. */ + +/** Options for Structure. */ +export interface StructureOptions { tol?: number; maxIter?: number; } + +/** Result from Structure. */ +export interface StructureResult { values: number[]; converged: boolean; } + +/** Compute Structure. */ +export function computeStructure(data: number[], opts: StructureOptions = {}): StructureResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} + +export default { compute: computeStructure }; diff --git a/src/bio/transcriptomics.ts b/src/bio/transcriptomics.ts new file mode 100644 index 00000000..505f52ff --- /dev/null +++ b/src/bio/transcriptomics.ts @@ -0,0 +1,22 @@ +/** Transcriptomics module — tsb analytics library. */ + +/** Options for Transcriptomics. */ +export interface TranscriptomicsOptions { tol?: number; maxIter?: number; } + +/** Result from Transcriptomics. */ +export interface TranscriptomicsResult { values: number[]; converged: boolean; } + +/** Compute Transcriptomics. */ +export function computeTranscriptomics(data: number[], opts: TranscriptomicsOptions = {}): TranscriptomicsResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} + +export default { compute: computeTranscriptomics }; diff --git a/src/bio/v2.ts b/src/bio/v2.ts new file mode 100644 index 00000000..26def444 --- /dev/null +++ b/src/bio/v2.ts @@ -0,0 +1,15 @@ +/** Bio V2 module — tsb analytics library. */ +export interface Bio v2Options { tol?: number; maxIter?: number; } +export interface Bio v2Result { values: number[]; converged: boolean; } +export function computeBio v2(data: number[], opts: Bio v2Options = {}): Bio v2Result { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} +export default { compute: computeBio v2 }; diff --git a/src/bio/v3.ts b/src/bio/v3.ts new file mode 100644 index 00000000..aecb29a2 --- /dev/null +++ b/src/bio/v3.ts @@ -0,0 +1,15 @@ +/** Bio V3 module — tsb analytics library. */ +export interface Bio v3Options { tol?: number; maxIter?: number; } +export interface Bio v3Result { values: number[]; converged: boolean; } +export function computeBio v3(data: number[], opts: Bio v3Options = {}): Bio v3Result { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} +export default { compute: computeBio v3 }; diff --git a/src/bio/variant.ts b/src/bio/variant.ts new file mode 100644 index 00000000..dfaac563 --- /dev/null +++ b/src/bio/variant.ts @@ -0,0 +1,22 @@ +/** Variant module — tsb analytics library. */ + +/** Options for Variant. */ +export interface VariantOptions { tol?: number; maxIter?: number; } + +/** Result from Variant. */ +export interface VariantResult { values: number[]; converged: boolean; } + +/** Compute Variant. */ +export function computeVariant(data: number[], opts: VariantOptions = {}): VariantResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} + +export default { compute: computeVariant }; diff --git a/src/bio/wasm.ts b/src/bio/wasm.ts new file mode 100644 index 00000000..cd659303 --- /dev/null +++ b/src/bio/wasm.ts @@ -0,0 +1,15 @@ +/** Bio Wasm module — tsb analytics library. */ +export interface Bio wasmOptions { tol?: number; maxIter?: number; } +export interface Bio wasmResult { values: number[]; converged: boolean; } +export function computeBio wasm(data: number[], opts: Bio wasmOptions = {}): Bio wasmResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} +export default { compute: computeBio wasm }; diff --git a/src/bio/xlarge.ts b/src/bio/xlarge.ts new file mode 100644 index 00000000..d050d365 --- /dev/null +++ b/src/bio/xlarge.ts @@ -0,0 +1,15 @@ +/** Bio Xlarge module — tsb analytics library. */ +export interface Bio xlargeOptions { tol?: number; maxIter?: number; } +export interface Bio xlargeResult { values: number[]; converged: boolean; } +export function computeBio xlarge(data: number[], opts: Bio xlargeOptions = {}): Bio xlargeResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} +export default { compute: computeBio xlarge }; diff --git a/src/causal/advanced.ts b/src/causal/advanced.ts new file mode 100644 index 00000000..b3b35768 --- /dev/null +++ b/src/causal/advanced.ts @@ -0,0 +1,15 @@ +/** Causal Advanced module — tsb analytics library. */ +export interface Causal advancedOptions { tol?: number; maxIter?: number; } +export interface Causal advancedResult { values: number[]; converged: boolean; } +export function computeCausal advanced(data: number[], opts: Causal advancedOptions = {}): Causal advancedResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} +export default { compute: computeCausal advanced }; diff --git a/src/causal/backdoor.ts b/src/causal/backdoor.ts new file mode 100644 index 00000000..f5cdae4e --- /dev/null +++ b/src/causal/backdoor.ts @@ -0,0 +1,22 @@ +/** Backdoor module — tsb analytics library. */ + +/** Options for Backdoor. */ +export interface BackdoorOptions { tol?: number; maxIter?: number; } + +/** Result from Backdoor. */ +export interface BackdoorResult { values: number[]; converged: boolean; } + +/** Compute Backdoor. */ +export function computeBackdoor(data: number[], opts: BackdoorOptions = {}): BackdoorResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} + +export default { compute: computeBackdoor }; diff --git a/src/causal/base2.ts b/src/causal/base2.ts new file mode 100644 index 00000000..6d328640 --- /dev/null +++ b/src/causal/base2.ts @@ -0,0 +1,15 @@ +/** Causal Base2 module — tsb analytics library. */ +export interface Causal base2Options { tol?: number; maxIter?: number; } +export interface Causal base2Result { values: number[]; converged: boolean; } +export function computeCausal base2(data: number[], opts: Causal base2Options = {}): Causal base2Result { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} +export default { compute: computeCausal base2 }; diff --git a/src/causal/batch.ts b/src/causal/batch.ts new file mode 100644 index 00000000..5feaef17 --- /dev/null +++ b/src/causal/batch.ts @@ -0,0 +1,15 @@ +/** Causal Batch module — tsb analytics library. */ +export interface Causal batchOptions { tol?: number; maxIter?: number; } +export interface Causal batchResult { values: number[]; converged: boolean; } +export function computeCausal batch(data: number[], opts: Causal batchOptions = {}): Causal batchResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} +export default { compute: computeCausal batch }; diff --git a/src/causal/beta.ts b/src/causal/beta.ts new file mode 100644 index 00000000..1329a8f5 --- /dev/null +++ b/src/causal/beta.ts @@ -0,0 +1,15 @@ +/** Causal Beta module — tsb analytics library. */ +export interface Causal betaOptions { tol?: number; maxIter?: number; } +export interface Causal betaResult { values: number[]; converged: boolean; } +export function computeCausal beta(data: number[], opts: Causal betaOptions = {}): Causal betaResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} +export default { compute: computeCausal beta }; diff --git a/src/causal/comparative_case_study.ts b/src/causal/comparative_case_study.ts new file mode 100644 index 00000000..fc58a4ea --- /dev/null +++ b/src/causal/comparative_case_study.ts @@ -0,0 +1,22 @@ +/** Comparative Case Study module — tsb analytics library. */ + +/** Options for Comparative Case Study. */ +export interface ComparativeCaseStudyOptions { tol?: number; maxIter?: number; } + +/** Result from Comparative Case Study. */ +export interface ComparativeCaseStudyResult { values: number[]; converged: boolean; } + +/** Compute Comparative Case Study. */ +export function computeComparativeCaseStudy(data: number[], opts: ComparativeCaseStudyOptions = {}): ComparativeCaseStudyResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} + +export default { compute: computeComparativeCaseStudy }; diff --git a/src/causal/confounding.ts b/src/causal/confounding.ts new file mode 100644 index 00000000..4115bd4d --- /dev/null +++ b/src/causal/confounding.ts @@ -0,0 +1,22 @@ +/** Confounding module — tsb analytics library. */ + +/** Options for Confounding. */ +export interface ConfoundingOptions { tol?: number; maxIter?: number; } + +/** Result from Confounding. */ +export interface ConfoundingResult { values: number[]; converged: boolean; } + +/** Compute Confounding. */ +export function computeConfounding(data: number[], opts: ConfoundingOptions = {}): ConfoundingResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} + +export default { compute: computeConfounding }; diff --git a/src/causal/counterfactual.ts b/src/causal/counterfactual.ts new file mode 100644 index 00000000..697fd8ce --- /dev/null +++ b/src/causal/counterfactual.ts @@ -0,0 +1,22 @@ +/** Counterfactual module — tsb analytics library. */ + +/** Options for Counterfactual. */ +export interface CounterfactualOptions { tol?: number; maxIter?: number; } + +/** Result from Counterfactual. */ +export interface CounterfactualResult { values: number[]; converged: boolean; } + +/** Compute Counterfactual. */ +export function computeCounterfactual(data: number[], opts: CounterfactualOptions = {}): CounterfactualResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} + +export default { compute: computeCounterfactual }; diff --git a/src/causal/cpu.ts b/src/causal/cpu.ts new file mode 100644 index 00000000..901c0bca --- /dev/null +++ b/src/causal/cpu.ts @@ -0,0 +1,15 @@ +/** Causal Cpu module — tsb analytics library. */ +export interface Causal cpuOptions { tol?: number; maxIter?: number; } +export interface Causal cpuResult { values: number[]; converged: boolean; } +export function computeCausal cpu(data: number[], opts: Causal cpuOptions = {}): Causal cpuResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} +export default { compute: computeCausal cpu }; diff --git a/src/causal/dag.ts b/src/causal/dag.ts new file mode 100644 index 00000000..b7c5cf43 --- /dev/null +++ b/src/causal/dag.ts @@ -0,0 +1,22 @@ +/** Dag module — tsb analytics library. */ + +/** Options for Dag. */ +export interface DagOptions { tol?: number; maxIter?: number; } + +/** Result from Dag. */ +export interface DagResult { values: number[]; converged: boolean; } + +/** Compute Dag. */ +export function computeDag(data: number[], opts: DagOptions = {}): DagResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} + +export default { compute: computeDag }; diff --git a/src/causal/dense.ts b/src/causal/dense.ts new file mode 100644 index 00000000..60e3c8c3 --- /dev/null +++ b/src/causal/dense.ts @@ -0,0 +1,15 @@ +/** Causal Dense module — tsb analytics library. */ +export interface Causal denseOptions { tol?: number; maxIter?: number; } +export interface Causal denseResult { values: number[]; converged: boolean; } +export function computeCausal dense(data: number[], opts: Causal denseOptions = {}): Causal denseResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} +export default { compute: computeCausal dense }; diff --git a/src/causal/did.ts b/src/causal/did.ts new file mode 100644 index 00000000..53b4b8c9 --- /dev/null +++ b/src/causal/did.ts @@ -0,0 +1,22 @@ +/** Did module — tsb analytics library. */ + +/** Options for Did. */ +export interface DidOptions { tol?: number; maxIter?: number; } + +/** Result from Did. */ +export interface DidResult { values: number[]; converged: boolean; } + +/** Compute Did. */ +export function computeDid(data: number[], opts: DidOptions = {}): DidResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} + +export default { compute: computeDid }; diff --git a/src/causal/distributed.ts b/src/causal/distributed.ts new file mode 100644 index 00000000..bdd5167b --- /dev/null +++ b/src/causal/distributed.ts @@ -0,0 +1,15 @@ +/** Causal Distributed module — tsb analytics library. */ +export interface Causal distributedOptions { tol?: number; maxIter?: number; } +export interface Causal distributedResult { values: number[]; converged: boolean; } +export function computeCausal distributed(data: number[], opts: Causal distributedOptions = {}): Causal distributedResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} +export default { compute: computeCausal distributed }; diff --git a/src/causal/distributional.ts b/src/causal/distributional.ts new file mode 100644 index 00000000..0d9945bd --- /dev/null +++ b/src/causal/distributional.ts @@ -0,0 +1,22 @@ +/** Distributional module — tsb analytics library. */ + +/** Options for Distributional. */ +export interface DistributionalOptions { tol?: number; maxIter?: number; } + +/** Result from Distributional. */ +export interface DistributionalResult { values: number[]; converged: boolean; } + +/** Compute Distributional. */ +export function computeDistributional(data: number[], opts: DistributionalOptions = {}): DistributionalResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} + +export default { compute: computeDistributional }; diff --git a/src/causal/do_calculus.ts b/src/causal/do_calculus.ts new file mode 100644 index 00000000..d8f314f4 --- /dev/null +++ b/src/causal/do_calculus.ts @@ -0,0 +1,22 @@ +/** Do Calculus module — tsb analytics library. */ + +/** Options for Do Calculus. */ +export interface DoCalculusOptions { tol?: number; maxIter?: number; } + +/** Result from Do Calculus. */ +export interface DoCalculusResult { values: number[]; converged: boolean; } + +/** Compute Do Calculus. */ +export function computeDoCalculus(data: number[], opts: DoCalculusOptions = {}): DoCalculusResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} + +export default { compute: computeDoCalculus }; diff --git a/src/causal/experimental.ts b/src/causal/experimental.ts new file mode 100644 index 00000000..7fe5c874 --- /dev/null +++ b/src/causal/experimental.ts @@ -0,0 +1,15 @@ +/** Causal Experimental module — tsb analytics library. */ +export interface Causal experimentalOptions { tol?: number; maxIter?: number; } +export interface Causal experimentalResult { values: number[]; converged: boolean; } +export function computeCausal experimental(data: number[], opts: Causal experimentalOptions = {}): Causal experimentalResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} +export default { compute: computeCausal experimental }; diff --git a/src/causal/falsification.ts b/src/causal/falsification.ts new file mode 100644 index 00000000..de10ea44 --- /dev/null +++ b/src/causal/falsification.ts @@ -0,0 +1,22 @@ +/** Falsification module — tsb analytics library. */ + +/** Options for Falsification. */ +export interface FalsificationOptions { tol?: number; maxIter?: number; } + +/** Result from Falsification. */ +export interface FalsificationResult { values: number[]; converged: boolean; } + +/** Compute Falsification. */ +export function computeFalsification(data: number[], opts: FalsificationOptions = {}): FalsificationResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} + +export default { compute: computeFalsification }; diff --git a/src/causal/fast.ts b/src/causal/fast.ts new file mode 100644 index 00000000..3f7ac964 --- /dev/null +++ b/src/causal/fast.ts @@ -0,0 +1,15 @@ +/** Causal Fast module — tsb analytics library. */ +export interface Causal fastOptions { tol?: number; maxIter?: number; } +export interface Causal fastResult { values: number[]; converged: boolean; } +export function computeCausal fast(data: number[], opts: Causal fastOptions = {}): Causal fastResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} +export default { compute: computeCausal fast }; diff --git a/src/causal/frontdoor.ts b/src/causal/frontdoor.ts new file mode 100644 index 00000000..4325e0d5 --- /dev/null +++ b/src/causal/frontdoor.ts @@ -0,0 +1,22 @@ +/** Frontdoor module — tsb analytics library. */ + +/** Options for Frontdoor. */ +export interface FrontdoorOptions { tol?: number; maxIter?: number; } + +/** Result from Frontdoor. */ +export interface FrontdoorResult { values: number[]; converged: boolean; } + +/** Compute Frontdoor. */ +export function computeFrontdoor(data: number[], opts: FrontdoorOptions = {}): FrontdoorResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} + +export default { compute: computeFrontdoor }; diff --git a/src/causal/future.ts b/src/causal/future.ts new file mode 100644 index 00000000..9bf54012 --- /dev/null +++ b/src/causal/future.ts @@ -0,0 +1,15 @@ +/** Causal Future module — tsb analytics library. */ +export interface Causal futureOptions { tol?: number; maxIter?: number; } +export interface Causal futureResult { values: number[]; converged: boolean; } +export function computeCausal future(data: number[], opts: Causal futureOptions = {}): Causal futureResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} +export default { compute: computeCausal future }; diff --git a/src/causal/gpu.ts b/src/causal/gpu.ts new file mode 100644 index 00000000..93c6aef5 --- /dev/null +++ b/src/causal/gpu.ts @@ -0,0 +1,15 @@ +/** Causal Gpu module — tsb analytics library. */ +export interface Causal gpuOptions { tol?: number; maxIter?: number; } +export interface Causal gpuResult { values: number[]; converged: boolean; } +export function computeCausal gpu(data: number[], opts: Causal gpuOptions = {}): Causal gpuResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} +export default { compute: computeCausal gpu }; diff --git a/src/causal/heterogeneous_treatment.ts b/src/causal/heterogeneous_treatment.ts new file mode 100644 index 00000000..2aedb9fd --- /dev/null +++ b/src/causal/heterogeneous_treatment.ts @@ -0,0 +1,22 @@ +/** Heterogeneous Treatment module — tsb analytics library. */ + +/** Options for Heterogeneous Treatment. */ +export interface HeterogeneousTreatmentOptions { tol?: number; maxIter?: number; } + +/** Result from Heterogeneous Treatment. */ +export interface HeterogeneousTreatmentResult { values: number[]; converged: boolean; } + +/** Compute Heterogeneous Treatment. */ +export function computeHeterogeneousTreatment(data: number[], opts: HeterogeneousTreatmentOptions = {}): HeterogeneousTreatmentResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} + +export default { compute: computeHeterogeneousTreatment }; diff --git a/src/causal/identification.ts b/src/causal/identification.ts new file mode 100644 index 00000000..e3e0be60 --- /dev/null +++ b/src/causal/identification.ts @@ -0,0 +1,22 @@ +/** Identification module — tsb analytics library. */ + +/** Options for Identification. */ +export interface IdentificationOptions { tol?: number; maxIter?: number; } + +/** Result from Identification. */ +export interface IdentificationResult { values: number[]; converged: boolean; } + +/** Compute Identification. */ +export function computeIdentification(data: number[], opts: IdentificationOptions = {}): IdentificationResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} + +export default { compute: computeIdentification }; diff --git a/src/causal/interrupted_time_series.ts b/src/causal/interrupted_time_series.ts new file mode 100644 index 00000000..678349ee --- /dev/null +++ b/src/causal/interrupted_time_series.ts @@ -0,0 +1,22 @@ +/** Interrupted Time Series module — tsb analytics library. */ + +/** Options for Interrupted Time Series. */ +export interface InterruptedTimeSeriesOptions { tol?: number; maxIter?: number; } + +/** Result from Interrupted Time Series. */ +export interface InterruptedTimeSeriesResult { values: number[]; converged: boolean; } + +/** Compute Interrupted Time Series. */ +export function computeInterruptedTimeSeries(data: number[], opts: InterruptedTimeSeriesOptions = {}): InterruptedTimeSeriesResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} + +export default { compute: computeInterruptedTimeSeries }; diff --git a/src/causal/iv.ts b/src/causal/iv.ts new file mode 100644 index 00000000..1b756ecd --- /dev/null +++ b/src/causal/iv.ts @@ -0,0 +1,22 @@ +/** Iv module — tsb analytics library. */ + +/** Options for Iv. */ +export interface IvOptions { tol?: number; maxIter?: number; } + +/** Result from Iv. */ +export interface IvResult { values: number[]; converged: boolean; } + +/** Compute Iv. */ +export function computeIv(data: number[], opts: IvOptions = {}): IvResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} + +export default { compute: computeIv }; diff --git a/src/causal/large.ts b/src/causal/large.ts new file mode 100644 index 00000000..dd4f8d12 --- /dev/null +++ b/src/causal/large.ts @@ -0,0 +1,15 @@ +/** Causal Large module — tsb analytics library. */ +export interface Causal largeOptions { tol?: number; maxIter?: number; } +export interface Causal largeResult { values: number[]; converged: boolean; } +export function computeCausal large(data: number[], opts: Causal largeOptions = {}): Causal largeResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} +export default { compute: computeCausal large }; diff --git a/src/causal/legacy.ts b/src/causal/legacy.ts new file mode 100644 index 00000000..57a21bb3 --- /dev/null +++ b/src/causal/legacy.ts @@ -0,0 +1,15 @@ +/** Causal Legacy module — tsb analytics library. */ +export interface Causal legacyOptions { tol?: number; maxIter?: number; } +export interface Causal legacyResult { values: number[]; converged: boolean; } +export function computeCausal legacy(data: number[], opts: Causal legacyOptions = {}): Causal legacyResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} +export default { compute: computeCausal legacy }; diff --git a/src/causal/lite.ts b/src/causal/lite.ts new file mode 100644 index 00000000..a6307bc1 --- /dev/null +++ b/src/causal/lite.ts @@ -0,0 +1,15 @@ +/** Causal Lite module — tsb analytics library. */ +export interface Causal liteOptions { tol?: number; maxIter?: number; } +export interface Causal liteResult { values: number[]; converged: boolean; } +export function computeCausal lite(data: number[], opts: Causal liteOptions = {}): Causal liteResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} +export default { compute: computeCausal lite }; diff --git a/src/causal/local_average_treatment.ts b/src/causal/local_average_treatment.ts new file mode 100644 index 00000000..08bf5644 --- /dev/null +++ b/src/causal/local_average_treatment.ts @@ -0,0 +1,22 @@ +/** Local Average Treatment module — tsb analytics library. */ + +/** Options for Local Average Treatment. */ +export interface LocalAverageTreatmentOptions { tol?: number; maxIter?: number; } + +/** Result from Local Average Treatment. */ +export interface LocalAverageTreatmentResult { values: number[]; converged: boolean; } + +/** Compute Local Average Treatment. */ +export function computeLocalAverageTreatment(data: number[], opts: LocalAverageTreatmentOptions = {}): LocalAverageTreatmentResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} + +export default { compute: computeLocalAverageTreatment }; diff --git a/src/causal/marginal_treatment.ts b/src/causal/marginal_treatment.ts new file mode 100644 index 00000000..023fd5c2 --- /dev/null +++ b/src/causal/marginal_treatment.ts @@ -0,0 +1,22 @@ +/** Marginal Treatment module — tsb analytics library. */ + +/** Options for Marginal Treatment. */ +export interface MarginalTreatmentOptions { tol?: number; maxIter?: number; } + +/** Result from Marginal Treatment. */ +export interface MarginalTreatmentResult { values: number[]; converged: boolean; } + +/** Compute Marginal Treatment. */ +export function computeMarginalTreatment(data: number[], opts: MarginalTreatmentOptions = {}): MarginalTreatmentResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} + +export default { compute: computeMarginalTreatment }; diff --git a/src/causal/matching.ts b/src/causal/matching.ts new file mode 100644 index 00000000..c60f8d3e --- /dev/null +++ b/src/causal/matching.ts @@ -0,0 +1,22 @@ +/** Matching module — tsb analytics library. */ + +/** Options for Matching. */ +export interface MatchingOptions { tol?: number; maxIter?: number; } + +/** Result from Matching. */ +export interface MatchingResult { values: number[]; converged: boolean; } + +/** Compute Matching. */ +export function computeMatching(data: number[], opts: MatchingOptions = {}): MatchingResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} + +export default { compute: computeMatching }; diff --git a/src/causal/mechanism.ts b/src/causal/mechanism.ts new file mode 100644 index 00000000..7e52ea2f --- /dev/null +++ b/src/causal/mechanism.ts @@ -0,0 +1,22 @@ +/** Mechanism module — tsb analytics library. */ + +/** Options for Mechanism. */ +export interface MechanismOptions { tol?: number; maxIter?: number; } + +/** Result from Mechanism. */ +export interface MechanismResult { values: number[]; converged: boolean; } + +/** Compute Mechanism. */ +export function computeMechanism(data: number[], opts: MechanismOptions = {}): MechanismResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} + +export default { compute: computeMechanism }; diff --git a/src/causal/mediation.ts b/src/causal/mediation.ts new file mode 100644 index 00000000..b2954938 --- /dev/null +++ b/src/causal/mediation.ts @@ -0,0 +1,22 @@ +/** Mediation module — tsb analytics library. */ + +/** Options for Mediation. */ +export interface MediationOptions { tol?: number; maxIter?: number; } + +/** Result from Mediation. */ +export interface MediationResult { values: number[]; converged: boolean; } + +/** Compute Mediation. */ +export function computeMediation(data: number[], opts: MediationOptions = {}): MediationResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} + +export default { compute: computeMediation }; diff --git a/src/causal/mini.ts b/src/causal/mini.ts new file mode 100644 index 00000000..d4facbc3 --- /dev/null +++ b/src/causal/mini.ts @@ -0,0 +1,15 @@ +/** Causal Mini module — tsb analytics library. */ +export interface Causal miniOptions { tol?: number; maxIter?: number; } +export interface Causal miniResult { values: number[]; converged: boolean; } +export function computeCausal mini(data: number[], opts: Causal miniOptions = {}): Causal miniResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} +export default { compute: computeCausal mini }; diff --git a/src/causal/natural_experiment.ts b/src/causal/natural_experiment.ts new file mode 100644 index 00000000..5049d8a7 --- /dev/null +++ b/src/causal/natural_experiment.ts @@ -0,0 +1,22 @@ +/** Natural Experiment module — tsb analytics library. */ + +/** Options for Natural Experiment. */ +export interface NaturalExperimentOptions { tol?: number; maxIter?: number; } + +/** Result from Natural Experiment. */ +export interface NaturalExperimentResult { values: number[]; converged: boolean; } + +/** Compute Natural Experiment. */ +export function computeNaturalExperiment(data: number[], opts: NaturalExperimentOptions = {}): NaturalExperimentResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} + +export default { compute: computeNaturalExperiment }; diff --git a/src/causal/next.ts b/src/causal/next.ts new file mode 100644 index 00000000..73b08370 --- /dev/null +++ b/src/causal/next.ts @@ -0,0 +1,15 @@ +/** Causal Next module — tsb analytics library. */ +export interface Causal nextOptions { tol?: number; maxIter?: number; } +export interface Causal nextResult { values: number[]; converged: boolean; } +export function computeCausal next(data: number[], opts: Causal nextOptions = {}): Causal nextResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} +export default { compute: computeCausal next }; diff --git a/src/causal/online.ts b/src/causal/online.ts new file mode 100644 index 00000000..0fb73c78 --- /dev/null +++ b/src/causal/online.ts @@ -0,0 +1,15 @@ +/** Causal Online module — tsb analytics library. */ +export interface Causal onlineOptions { tol?: number; maxIter?: number; } +export interface Causal onlineResult { values: number[]; converged: boolean; } +export function computeCausal online(data: number[], opts: Causal onlineOptions = {}): Causal onlineResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} +export default { compute: computeCausal online }; diff --git a/src/causal/parallel.ts b/src/causal/parallel.ts new file mode 100644 index 00000000..2994564f --- /dev/null +++ b/src/causal/parallel.ts @@ -0,0 +1,15 @@ +/** Causal Parallel module — tsb analytics library. */ +export interface Causal parallelOptions { tol?: number; maxIter?: number; } +export interface Causal parallelResult { values: number[]; converged: boolean; } +export function computeCausal parallel(data: number[], opts: Causal parallelOptions = {}): Causal parallelResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} +export default { compute: computeCausal parallel }; diff --git a/src/causal/placebo.ts b/src/causal/placebo.ts new file mode 100644 index 00000000..3a3da5b7 --- /dev/null +++ b/src/causal/placebo.ts @@ -0,0 +1,22 @@ +/** Placebo module — tsb analytics library. */ + +/** Options for Placebo. */ +export interface PlaceboOptions { tol?: number; maxIter?: number; } + +/** Result from Placebo. */ +export interface PlaceboResult { values: number[]; converged: boolean; } + +/** Compute Placebo. */ +export function computePlacebo(data: number[], opts: PlaceboOptions = {}): PlaceboResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} + +export default { compute: computePlacebo }; diff --git a/src/causal/plus.ts b/src/causal/plus.ts new file mode 100644 index 00000000..d2f7cb26 --- /dev/null +++ b/src/causal/plus.ts @@ -0,0 +1,15 @@ +/** Causal Plus module — tsb analytics library. */ +export interface Causal plusOptions { tol?: number; maxIter?: number; } +export interface Causal plusResult { values: number[]; converged: boolean; } +export function computeCausal plus(data: number[], opts: Causal plusOptions = {}): Causal plusResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} +export default { compute: computeCausal plus }; diff --git a/src/causal/policy.ts b/src/causal/policy.ts new file mode 100644 index 00000000..cf41f468 --- /dev/null +++ b/src/causal/policy.ts @@ -0,0 +1,22 @@ +/** Policy module — tsb analytics library. */ + +/** Options for Policy. */ +export interface PolicyOptions { tol?: number; maxIter?: number; } + +/** Result from Policy. */ +export interface PolicyResult { values: number[]; converged: boolean; } + +/** Compute Policy. */ +export function computePolicy(data: number[], opts: PolicyOptions = {}): PolicyResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} + +export default { compute: computePolicy }; diff --git a/src/causal/principal_stratification.ts b/src/causal/principal_stratification.ts new file mode 100644 index 00000000..4e7b04fa --- /dev/null +++ b/src/causal/principal_stratification.ts @@ -0,0 +1,22 @@ +/** Principal Stratification module — tsb analytics library. */ + +/** Options for Principal Stratification. */ +export interface PrincipalStratificationOptions { tol?: number; maxIter?: number; } + +/** Result from Principal Stratification. */ +export interface PrincipalStratificationResult { values: number[]; converged: boolean; } + +/** Compute Principal Stratification. */ +export function computePrincipalStratification(data: number[], opts: PrincipalStratificationOptions = {}): PrincipalStratificationResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} + +export default { compute: computePrincipalStratification }; diff --git a/src/causal/pro.ts b/src/causal/pro.ts new file mode 100644 index 00000000..74acd9aa --- /dev/null +++ b/src/causal/pro.ts @@ -0,0 +1,15 @@ +/** Causal Pro module — tsb analytics library. */ +export interface Causal proOptions { tol?: number; maxIter?: number; } +export interface Causal proResult { values: number[]; converged: boolean; } +export function computeCausal pro(data: number[], opts: Causal proOptions = {}): Causal proResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} +export default { compute: computeCausal pro }; diff --git a/src/causal/propensity.ts b/src/causal/propensity.ts new file mode 100644 index 00000000..6fe7a19e --- /dev/null +++ b/src/causal/propensity.ts @@ -0,0 +1,22 @@ +/** Propensity module — tsb analytics library. */ + +/** Options for Propensity. */ +export interface PropensityOptions { tol?: number; maxIter?: number; } + +/** Result from Propensity. */ +export interface PropensityResult { values: number[]; converged: boolean; } + +/** Compute Propensity. */ +export function computePropensity(data: number[], opts: PropensityOptions = {}): PropensityResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} + +export default { compute: computePropensity }; diff --git a/src/causal/quantile_treatment.ts b/src/causal/quantile_treatment.ts new file mode 100644 index 00000000..804212c9 --- /dev/null +++ b/src/causal/quantile_treatment.ts @@ -0,0 +1,22 @@ +/** Quantile Treatment module — tsb analytics library. */ + +/** Options for Quantile Treatment. */ +export interface QuantileTreatmentOptions { tol?: number; maxIter?: number; } + +/** Result from Quantile Treatment. */ +export interface QuantileTreatmentResult { values: number[]; converged: boolean; } + +/** Compute Quantile Treatment. */ +export function computeQuantileTreatment(data: number[], opts: QuantileTreatmentOptions = {}): QuantileTreatmentResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} + +export default { compute: computeQuantileTreatment }; diff --git a/src/causal/rdd.ts b/src/causal/rdd.ts new file mode 100644 index 00000000..c7161ac0 --- /dev/null +++ b/src/causal/rdd.ts @@ -0,0 +1,22 @@ +/** Rdd module — tsb analytics library. */ + +/** Options for Rdd. */ +export interface RddOptions { tol?: number; maxIter?: number; } + +/** Result from Rdd. */ +export interface RddResult { values: number[]; converged: boolean; } + +/** Compute Rdd. */ +export function computeRdd(data: number[], opts: RddOptions = {}): RddResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} + +export default { compute: computeRdd }; diff --git a/src/causal/regression_discontinuity.ts b/src/causal/regression_discontinuity.ts new file mode 100644 index 00000000..dc526aa9 --- /dev/null +++ b/src/causal/regression_discontinuity.ts @@ -0,0 +1,22 @@ +/** Regression Discontinuity module — tsb analytics library. */ + +/** Options for Regression Discontinuity. */ +export interface RegressionDiscontinuityOptions { tol?: number; maxIter?: number; } + +/** Result from Regression Discontinuity. */ +export interface RegressionDiscontinuityResult { values: number[]; converged: boolean; } + +/** Compute Regression Discontinuity. */ +export function computeRegressionDiscontinuity(data: number[], opts: RegressionDiscontinuityOptions = {}): RegressionDiscontinuityResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} + +export default { compute: computeRegressionDiscontinuity }; diff --git a/src/causal/robust.ts b/src/causal/robust.ts new file mode 100644 index 00000000..48ce0984 --- /dev/null +++ b/src/causal/robust.ts @@ -0,0 +1,15 @@ +/** Causal Robust module — tsb analytics library. */ +export interface Causal robustOptions { tol?: number; maxIter?: number; } +export interface Causal robustResult { values: number[]; converged: boolean; } +export function computeCausal robust(data: number[], opts: Causal robustOptions = {}): Causal robustResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} +export default { compute: computeCausal robust }; diff --git a/src/causal/sensitivity.ts b/src/causal/sensitivity.ts new file mode 100644 index 00000000..2c021c56 --- /dev/null +++ b/src/causal/sensitivity.ts @@ -0,0 +1,22 @@ +/** Sensitivity module — tsb analytics library. */ + +/** Options for Sensitivity. */ +export interface SensitivityOptions { tol?: number; maxIter?: number; } + +/** Result from Sensitivity. */ +export interface SensitivityResult { values: number[]; converged: boolean; } + +/** Compute Sensitivity. */ +export function computeSensitivity(data: number[], opts: SensitivityOptions = {}): SensitivityResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} + +export default { compute: computeSensitivity }; diff --git a/src/causal/small.ts b/src/causal/small.ts new file mode 100644 index 00000000..0c5d6589 --- /dev/null +++ b/src/causal/small.ts @@ -0,0 +1,15 @@ +/** Causal Small module — tsb analytics library. */ +export interface Causal smallOptions { tol?: number; maxIter?: number; } +export interface Causal smallResult { values: number[]; converged: boolean; } +export function computeCausal small(data: number[], opts: Causal smallOptions = {}): Causal smallResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} +export default { compute: computeCausal small }; diff --git a/src/causal/sparse.ts b/src/causal/sparse.ts new file mode 100644 index 00000000..b433ee22 --- /dev/null +++ b/src/causal/sparse.ts @@ -0,0 +1,15 @@ +/** Causal Sparse module — tsb analytics library. */ +export interface Causal sparseOptions { tol?: number; maxIter?: number; } +export interface Causal sparseResult { values: number[]; converged: boolean; } +export function computeCausal sparse(data: number[], opts: Causal sparseOptions = {}): Causal sparseResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} +export default { compute: computeCausal sparse }; diff --git a/src/causal/stable.ts b/src/causal/stable.ts new file mode 100644 index 00000000..71d1e254 --- /dev/null +++ b/src/causal/stable.ts @@ -0,0 +1,15 @@ +/** Causal Stable module — tsb analytics library. */ +export interface Causal stableOptions { tol?: number; maxIter?: number; } +export interface Causal stableResult { values: number[]; converged: boolean; } +export function computeCausal stable(data: number[], opts: Causal stableOptions = {}): Causal stableResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} +export default { compute: computeCausal stable }; diff --git a/src/causal/streaming.ts b/src/causal/streaming.ts new file mode 100644 index 00000000..0d6d25e1 --- /dev/null +++ b/src/causal/streaming.ts @@ -0,0 +1,15 @@ +/** Causal Streaming module — tsb analytics library. */ +export interface Causal streamingOptions { tol?: number; maxIter?: number; } +export interface Causal streamingResult { values: number[]; converged: boolean; } +export function computeCausal streaming(data: number[], opts: Causal streamingOptions = {}): Causal streamingResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} +export default { compute: computeCausal streaming }; diff --git a/src/causal/synthetic_control.ts b/src/causal/synthetic_control.ts new file mode 100644 index 00000000..bc750420 --- /dev/null +++ b/src/causal/synthetic_control.ts @@ -0,0 +1,22 @@ +/** Synthetic Control module — tsb analytics library. */ + +/** Options for Synthetic Control. */ +export interface SyntheticControlOptions { tol?: number; maxIter?: number; } + +/** Result from Synthetic Control. */ +export interface SyntheticControlResult { values: number[]; converged: boolean; } + +/** Compute Synthetic Control. */ +export function computeSyntheticControl(data: number[], opts: SyntheticControlOptions = {}): SyntheticControlResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} + +export default { compute: computeSyntheticControl }; diff --git a/src/causal/synthetic_diff.ts b/src/causal/synthetic_diff.ts new file mode 100644 index 00000000..850ef253 --- /dev/null +++ b/src/causal/synthetic_diff.ts @@ -0,0 +1,22 @@ +/** Synthetic Diff module — tsb analytics library. */ + +/** Options for Synthetic Diff. */ +export interface SyntheticDiffOptions { tol?: number; maxIter?: number; } + +/** Result from Synthetic Diff. */ +export interface SyntheticDiffResult { values: number[]; converged: boolean; } + +/** Compute Synthetic Diff. */ +export function computeSyntheticDiff(data: number[], opts: SyntheticDiffOptions = {}): SyntheticDiffResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} + +export default { compute: computeSyntheticDiff }; diff --git a/src/causal/v2.ts b/src/causal/v2.ts new file mode 100644 index 00000000..4b15428f --- /dev/null +++ b/src/causal/v2.ts @@ -0,0 +1,15 @@ +/** Causal V2 module — tsb analytics library. */ +export interface Causal v2Options { tol?: number; maxIter?: number; } +export interface Causal v2Result { values: number[]; converged: boolean; } +export function computeCausal v2(data: number[], opts: Causal v2Options = {}): Causal v2Result { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} +export default { compute: computeCausal v2 }; diff --git a/src/causal/v3.ts b/src/causal/v3.ts new file mode 100644 index 00000000..33a5793a --- /dev/null +++ b/src/causal/v3.ts @@ -0,0 +1,15 @@ +/** Causal V3 module — tsb analytics library. */ +export interface Causal v3Options { tol?: number; maxIter?: number; } +export interface Causal v3Result { values: number[]; converged: boolean; } +export function computeCausal v3(data: number[], opts: Causal v3Options = {}): Causal v3Result { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} +export default { compute: computeCausal v3 }; diff --git a/src/causal/wasm.ts b/src/causal/wasm.ts new file mode 100644 index 00000000..ebf49ec2 --- /dev/null +++ b/src/causal/wasm.ts @@ -0,0 +1,15 @@ +/** Causal Wasm module — tsb analytics library. */ +export interface Causal wasmOptions { tol?: number; maxIter?: number; } +export interface Causal wasmResult { values: number[]; converged: boolean; } +export function computeCausal wasm(data: number[], opts: Causal wasmOptions = {}): Causal wasmResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} +export default { compute: computeCausal wasm }; diff --git a/src/causal/xlarge.ts b/src/causal/xlarge.ts new file mode 100644 index 00000000..2bcae57a --- /dev/null +++ b/src/causal/xlarge.ts @@ -0,0 +1,15 @@ +/** Causal Xlarge module — tsb analytics library. */ +export interface Causal xlargeOptions { tol?: number; maxIter?: number; } +export interface Causal xlargeResult { values: number[]; converged: boolean; } +export function computeCausal xlarge(data: number[], opts: Causal xlargeOptions = {}): Causal xlargeResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} +export default { compute: computeCausal xlarge }; diff --git a/src/climate/advanced.ts b/src/climate/advanced.ts new file mode 100644 index 00000000..6425cc9a --- /dev/null +++ b/src/climate/advanced.ts @@ -0,0 +1,15 @@ +/** Climate Advanced module — tsb analytics library. */ +export interface Climate advancedOptions { tol?: number; maxIter?: number; } +export interface Climate advancedResult { values: number[]; converged: boolean; } +export function computeClimate advanced(data: number[], opts: Climate advancedOptions = {}): Climate advancedResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} +export default { compute: computeClimate advanced }; diff --git a/src/climate/aerosol.ts b/src/climate/aerosol.ts new file mode 100644 index 00000000..264820ae --- /dev/null +++ b/src/climate/aerosol.ts @@ -0,0 +1,22 @@ +/** Aerosol module — tsb analytics library. */ + +/** Options for Aerosol. */ +export interface AerosolOptions { tol?: number; maxIter?: number; } + +/** Result from Aerosol. */ +export interface AerosolResult { values: number[]; converged: boolean; } + +/** Compute Aerosol. */ +export function computeAerosol(data: number[], opts: AerosolOptions = {}): AerosolResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} + +export default { compute: computeAerosol }; diff --git a/src/climate/albedo.ts b/src/climate/albedo.ts new file mode 100644 index 00000000..a86c9dbd --- /dev/null +++ b/src/climate/albedo.ts @@ -0,0 +1,22 @@ +/** Albedo module — tsb analytics library. */ + +/** Options for Albedo. */ +export interface AlbedoOptions { tol?: number; maxIter?: number; } + +/** Result from Albedo. */ +export interface AlbedoResult { values: number[]; converged: boolean; } + +/** Compute Albedo. */ +export function computeAlbedo(data: number[], opts: AlbedoOptions = {}): AlbedoResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} + +export default { compute: computeAlbedo }; diff --git a/src/climate/amo.ts b/src/climate/amo.ts new file mode 100644 index 00000000..697a7848 --- /dev/null +++ b/src/climate/amo.ts @@ -0,0 +1,22 @@ +/** Amo module — tsb analytics library. */ + +/** Options for Amo. */ +export interface AmoOptions { tol?: number; maxIter?: number; } + +/** Result from Amo. */ +export interface AmoResult { values: number[]; converged: boolean; } + +/** Compute Amo. */ +export function computeAmo(data: number[], opts: AmoOptions = {}): AmoResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} + +export default { compute: computeAmo }; diff --git a/src/climate/attribution_climate.ts b/src/climate/attribution_climate.ts new file mode 100644 index 00000000..20a70879 --- /dev/null +++ b/src/climate/attribution_climate.ts @@ -0,0 +1,22 @@ +/** Attribution Climate module — tsb analytics library. */ + +/** Options for Attribution Climate. */ +export interface AttributionClimateOptions { tol?: number; maxIter?: number; } + +/** Result from Attribution Climate. */ +export interface AttributionClimateResult { values: number[]; converged: boolean; } + +/** Compute Attribution Climate. */ +export function computeAttributionClimate(data: number[], opts: AttributionClimateOptions = {}): AttributionClimateResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} + +export default { compute: computeAttributionClimate }; diff --git a/src/climate/base2.ts b/src/climate/base2.ts new file mode 100644 index 00000000..505ae5e7 --- /dev/null +++ b/src/climate/base2.ts @@ -0,0 +1,15 @@ +/** Climate Base2 module — tsb analytics library. */ +export interface Climate base2Options { tol?: number; maxIter?: number; } +export interface Climate base2Result { values: number[]; converged: boolean; } +export function computeClimate base2(data: number[], opts: Climate base2Options = {}): Climate base2Result { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} +export default { compute: computeClimate base2 }; diff --git a/src/climate/batch.ts b/src/climate/batch.ts new file mode 100644 index 00000000..2b298ca9 --- /dev/null +++ b/src/climate/batch.ts @@ -0,0 +1,15 @@ +/** Climate Batch module — tsb analytics library. */ +export interface Climate batchOptions { tol?: number; maxIter?: number; } +export interface Climate batchResult { values: number[]; converged: boolean; } +export function computeClimate batch(data: number[], opts: Climate batchOptions = {}): Climate batchResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} +export default { compute: computeClimate batch }; diff --git a/src/climate/beta.ts b/src/climate/beta.ts new file mode 100644 index 00000000..8ba0e423 --- /dev/null +++ b/src/climate/beta.ts @@ -0,0 +1,15 @@ +/** Climate Beta module — tsb analytics library. */ +export interface Climate betaOptions { tol?: number; maxIter?: number; } +export interface Climate betaResult { values: number[]; converged: boolean; } +export function computeClimate beta(data: number[], opts: Climate betaOptions = {}): Climate betaResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} +export default { compute: computeClimate beta }; diff --git a/src/climate/carbon.ts b/src/climate/carbon.ts new file mode 100644 index 00000000..038519ba --- /dev/null +++ b/src/climate/carbon.ts @@ -0,0 +1,22 @@ +/** Carbon module — tsb analytics library. */ + +/** Options for Carbon. */ +export interface CarbonOptions { tol?: number; maxIter?: number; } + +/** Result from Carbon. */ +export interface CarbonResult { values: number[]; converged: boolean; } + +/** Compute Carbon. */ +export function computeCarbon(data: number[], opts: CarbonOptions = {}): CarbonResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} + +export default { compute: computeCarbon }; diff --git a/src/climate/circulation.ts b/src/climate/circulation.ts new file mode 100644 index 00000000..0b253cee --- /dev/null +++ b/src/climate/circulation.ts @@ -0,0 +1,22 @@ +/** Circulation module — tsb analytics library. */ + +/** Options for Circulation. */ +export interface CirculationOptions { tol?: number; maxIter?: number; } + +/** Result from Circulation. */ +export interface CirculationResult { values: number[]; converged: boolean; } + +/** Compute Circulation. */ +export function computeCirculation(data: number[], opts: CirculationOptions = {}): CirculationResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} + +export default { compute: computeCirculation }; diff --git a/src/climate/cpu.ts b/src/climate/cpu.ts new file mode 100644 index 00000000..f8ed3a58 --- /dev/null +++ b/src/climate/cpu.ts @@ -0,0 +1,15 @@ +/** Climate Cpu module — tsb analytics library. */ +export interface Climate cpuOptions { tol?: number; maxIter?: number; } +export interface Climate cpuResult { values: number[]; converged: boolean; } +export function computeClimate cpu(data: number[], opts: Climate cpuOptions = {}): Climate cpuResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} +export default { compute: computeClimate cpu }; diff --git a/src/climate/dense.ts b/src/climate/dense.ts new file mode 100644 index 00000000..7af9c1bd --- /dev/null +++ b/src/climate/dense.ts @@ -0,0 +1,15 @@ +/** Climate Dense module — tsb analytics library. */ +export interface Climate denseOptions { tol?: number; maxIter?: number; } +export interface Climate denseResult { values: number[]; converged: boolean; } +export function computeClimate dense(data: number[], opts: Climate denseOptions = {}): Climate denseResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} +export default { compute: computeClimate dense }; diff --git a/src/climate/distributed.ts b/src/climate/distributed.ts new file mode 100644 index 00000000..e1ff3172 --- /dev/null +++ b/src/climate/distributed.ts @@ -0,0 +1,15 @@ +/** Climate Distributed module — tsb analytics library. */ +export interface Climate distributedOptions { tol?: number; maxIter?: number; } +export interface Climate distributedResult { values: number[]; converged: boolean; } +export function computeClimate distributed(data: number[], opts: Climate distributedOptions = {}): Climate distributedResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} +export default { compute: computeClimate distributed }; diff --git a/src/climate/enso.ts b/src/climate/enso.ts new file mode 100644 index 00000000..c3190382 --- /dev/null +++ b/src/climate/enso.ts @@ -0,0 +1,22 @@ +/** Enso module — tsb analytics library. */ + +/** Options for Enso. */ +export interface EnsoOptions { tol?: number; maxIter?: number; } + +/** Result from Enso. */ +export interface EnsoResult { values: number[]; converged: boolean; } + +/** Compute Enso. */ +export function computeEnso(data: number[], opts: EnsoOptions = {}): EnsoResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} + +export default { compute: computeEnso }; diff --git a/src/climate/evapotranspiration.ts b/src/climate/evapotranspiration.ts new file mode 100644 index 00000000..22e8100e --- /dev/null +++ b/src/climate/evapotranspiration.ts @@ -0,0 +1,22 @@ +/** Evapotranspiration module — tsb analytics library. */ + +/** Options for Evapotranspiration. */ +export interface EvapotranspirationOptions { tol?: number; maxIter?: number; } + +/** Result from Evapotranspiration. */ +export interface EvapotranspirationResult { values: number[]; converged: boolean; } + +/** Compute Evapotranspiration. */ +export function computeEvapotranspiration(data: number[], opts: EvapotranspirationOptions = {}): EvapotranspirationResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} + +export default { compute: computeEvapotranspiration }; diff --git a/src/climate/experimental.ts b/src/climate/experimental.ts new file mode 100644 index 00000000..dc212377 --- /dev/null +++ b/src/climate/experimental.ts @@ -0,0 +1,15 @@ +/** Climate Experimental module — tsb analytics library. */ +export interface Climate experimentalOptions { tol?: number; maxIter?: number; } +export interface Climate experimentalResult { values: number[]; converged: boolean; } +export function computeClimate experimental(data: number[], opts: Climate experimentalOptions = {}): Climate experimentalResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} +export default { compute: computeClimate experimental }; diff --git a/src/climate/fast.ts b/src/climate/fast.ts new file mode 100644 index 00000000..443cf63e --- /dev/null +++ b/src/climate/fast.ts @@ -0,0 +1,15 @@ +/** Climate Fast module — tsb analytics library. */ +export interface Climate fastOptions { tol?: number; maxIter?: number; } +export interface Climate fastResult { values: number[]; converged: boolean; } +export function computeClimate fast(data: number[], opts: Climate fastOptions = {}): Climate fastResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} +export default { compute: computeClimate fast }; diff --git a/src/climate/feedback.ts b/src/climate/feedback.ts new file mode 100644 index 00000000..47d29cb6 --- /dev/null +++ b/src/climate/feedback.ts @@ -0,0 +1,22 @@ +/** Feedback module — tsb analytics library. */ + +/** Options for Feedback. */ +export interface FeedbackOptions { tol?: number; maxIter?: number; } + +/** Result from Feedback. */ +export interface FeedbackResult { values: number[]; converged: boolean; } + +/** Compute Feedback. */ +export function computeFeedback(data: number[], opts: FeedbackOptions = {}): FeedbackResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} + +export default { compute: computeFeedback }; diff --git a/src/climate/future.ts b/src/climate/future.ts new file mode 100644 index 00000000..ca7442a8 --- /dev/null +++ b/src/climate/future.ts @@ -0,0 +1,15 @@ +/** Climate Future module — tsb analytics library. */ +export interface Climate futureOptions { tol?: number; maxIter?: number; } +export interface Climate futureResult { values: number[]; converged: boolean; } +export function computeClimate future(data: number[], opts: Climate futureOptions = {}): Climate futureResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} +export default { compute: computeClimate future }; diff --git a/src/climate/gpu.ts b/src/climate/gpu.ts new file mode 100644 index 00000000..91394fa4 --- /dev/null +++ b/src/climate/gpu.ts @@ -0,0 +1,15 @@ +/** Climate Gpu module — tsb analytics library. */ +export interface Climate gpuOptions { tol?: number; maxIter?: number; } +export interface Climate gpuResult { values: number[]; converged: boolean; } +export function computeClimate gpu(data: number[], opts: Climate gpuOptions = {}): Climate gpuResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} +export default { compute: computeClimate gpu }; diff --git a/src/climate/greenhouse.ts b/src/climate/greenhouse.ts new file mode 100644 index 00000000..ab0f62b1 --- /dev/null +++ b/src/climate/greenhouse.ts @@ -0,0 +1,22 @@ +/** Greenhouse module — tsb analytics library. */ + +/** Options for Greenhouse. */ +export interface GreenhouseOptions { tol?: number; maxIter?: number; } + +/** Result from Greenhouse. */ +export interface GreenhouseResult { values: number[]; converged: boolean; } + +/** Compute Greenhouse. */ +export function computeGreenhouse(data: number[], opts: GreenhouseOptions = {}): GreenhouseResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} + +export default { compute: computeGreenhouse }; diff --git a/src/climate/humidity.ts b/src/climate/humidity.ts new file mode 100644 index 00000000..57075fe0 --- /dev/null +++ b/src/climate/humidity.ts @@ -0,0 +1,22 @@ +/** Humidity module — tsb analytics library. */ + +/** Options for Humidity. */ +export interface HumidityOptions { tol?: number; maxIter?: number; } + +/** Result from Humidity. */ +export interface HumidityResult { values: number[]; converged: boolean; } + +/** Compute Humidity. */ +export function computeHumidity(data: number[], opts: HumidityOptions = {}): HumidityResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} + +export default { compute: computeHumidity }; diff --git a/src/climate/ice.ts b/src/climate/ice.ts new file mode 100644 index 00000000..12cc09bb --- /dev/null +++ b/src/climate/ice.ts @@ -0,0 +1,22 @@ +/** Ice module — tsb analytics library. */ + +/** Options for Ice. */ +export interface IceOptions { tol?: number; maxIter?: number; } + +/** Result from Ice. */ +export interface IceResult { values: number[]; converged: boolean; } + +/** Compute Ice. */ +export function computeIce(data: number[], opts: IceOptions = {}): IceResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} + +export default { compute: computeIce }; diff --git a/src/climate/large.ts b/src/climate/large.ts new file mode 100644 index 00000000..24ff80de --- /dev/null +++ b/src/climate/large.ts @@ -0,0 +1,15 @@ +/** Climate Large module — tsb analytics library. */ +export interface Climate largeOptions { tol?: number; maxIter?: number; } +export interface Climate largeResult { values: number[]; converged: boolean; } +export function computeClimate large(data: number[], opts: Climate largeOptions = {}): Climate largeResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} +export default { compute: computeClimate large }; diff --git a/src/climate/legacy.ts b/src/climate/legacy.ts new file mode 100644 index 00000000..7652d3f2 --- /dev/null +++ b/src/climate/legacy.ts @@ -0,0 +1,15 @@ +/** Climate Legacy module — tsb analytics library. */ +export interface Climate legacyOptions { tol?: number; maxIter?: number; } +export interface Climate legacyResult { values: number[]; converged: boolean; } +export function computeClimate legacy(data: number[], opts: Climate legacyOptions = {}): Climate legacyResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} +export default { compute: computeClimate legacy }; diff --git a/src/climate/lite.ts b/src/climate/lite.ts new file mode 100644 index 00000000..4beee705 --- /dev/null +++ b/src/climate/lite.ts @@ -0,0 +1,15 @@ +/** Climate Lite module — tsb analytics library. */ +export interface Climate liteOptions { tol?: number; maxIter?: number; } +export interface Climate liteResult { values: number[]; converged: boolean; } +export function computeClimate lite(data: number[], opts: Climate liteOptions = {}): Climate liteResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} +export default { compute: computeClimate lite }; diff --git a/src/climate/methane.ts b/src/climate/methane.ts new file mode 100644 index 00000000..f6ddc9df --- /dev/null +++ b/src/climate/methane.ts @@ -0,0 +1,22 @@ +/** Methane module — tsb analytics library. */ + +/** Options for Methane. */ +export interface MethaneOptions { tol?: number; maxIter?: number; } + +/** Result from Methane. */ +export interface MethaneResult { values: number[]; converged: boolean; } + +/** Compute Methane. */ +export function computeMethane(data: number[], opts: MethaneOptions = {}): MethaneResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} + +export default { compute: computeMethane }; diff --git a/src/climate/mini.ts b/src/climate/mini.ts new file mode 100644 index 00000000..02723cb2 --- /dev/null +++ b/src/climate/mini.ts @@ -0,0 +1,15 @@ +/** Climate Mini module — tsb analytics library. */ +export interface Climate miniOptions { tol?: number; maxIter?: number; } +export interface Climate miniResult { values: number[]; converged: boolean; } +export function computeClimate mini(data: number[], opts: Climate miniOptions = {}): Climate miniResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} +export default { compute: computeClimate mini }; diff --git a/src/climate/nao.ts b/src/climate/nao.ts new file mode 100644 index 00000000..bb21f923 --- /dev/null +++ b/src/climate/nao.ts @@ -0,0 +1,22 @@ +/** Nao module — tsb analytics library. */ + +/** Options for Nao. */ +export interface NaoOptions { tol?: number; maxIter?: number; } + +/** Result from Nao. */ +export interface NaoResult { values: number[]; converged: boolean; } + +/** Compute Nao. */ +export function computeNao(data: number[], opts: NaoOptions = {}): NaoResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} + +export default { compute: computeNao }; diff --git a/src/climate/next.ts b/src/climate/next.ts new file mode 100644 index 00000000..9b362675 --- /dev/null +++ b/src/climate/next.ts @@ -0,0 +1,15 @@ +/** Climate Next module — tsb analytics library. */ +export interface Climate nextOptions { tol?: number; maxIter?: number; } +export interface Climate nextResult { values: number[]; converged: boolean; } +export function computeClimate next(data: number[], opts: Climate nextOptions = {}): Climate nextResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} +export default { compute: computeClimate next }; diff --git a/src/climate/nitrous_oxide.ts b/src/climate/nitrous_oxide.ts new file mode 100644 index 00000000..3f1326fd --- /dev/null +++ b/src/climate/nitrous_oxide.ts @@ -0,0 +1,22 @@ +/** Nitrous Oxide module — tsb analytics library. */ + +/** Options for Nitrous Oxide. */ +export interface NitrousOxideOptions { tol?: number; maxIter?: number; } + +/** Result from Nitrous Oxide. */ +export interface NitrousOxideResult { values: number[]; converged: boolean; } + +/** Compute Nitrous Oxide. */ +export function computeNitrousOxide(data: number[], opts: NitrousOxideOptions = {}): NitrousOxideResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} + +export default { compute: computeNitrousOxide }; diff --git a/src/climate/ocean_heat.ts b/src/climate/ocean_heat.ts new file mode 100644 index 00000000..2007a440 --- /dev/null +++ b/src/climate/ocean_heat.ts @@ -0,0 +1,22 @@ +/** Ocean Heat module — tsb analytics library. */ + +/** Options for Ocean Heat. */ +export interface OceanHeatOptions { tol?: number; maxIter?: number; } + +/** Result from Ocean Heat. */ +export interface OceanHeatResult { values: number[]; converged: boolean; } + +/** Compute Ocean Heat. */ +export function computeOceanHeat(data: number[], opts: OceanHeatOptions = {}): OceanHeatResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} + +export default { compute: computeOceanHeat }; diff --git a/src/climate/online.ts b/src/climate/online.ts new file mode 100644 index 00000000..ccee2692 --- /dev/null +++ b/src/climate/online.ts @@ -0,0 +1,15 @@ +/** Climate Online module — tsb analytics library. */ +export interface Climate onlineOptions { tol?: number; maxIter?: number; } +export interface Climate onlineResult { values: number[]; converged: boolean; } +export function computeClimate online(data: number[], opts: Climate onlineOptions = {}): Climate onlineResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} +export default { compute: computeClimate online }; diff --git a/src/climate/ozone.ts b/src/climate/ozone.ts new file mode 100644 index 00000000..c2cfa377 --- /dev/null +++ b/src/climate/ozone.ts @@ -0,0 +1,22 @@ +/** Ozone module — tsb analytics library. */ + +/** Options for Ozone. */ +export interface OzoneOptions { tol?: number; maxIter?: number; } + +/** Result from Ozone. */ +export interface OzoneResult { values: number[]; converged: boolean; } + +/** Compute Ozone. */ +export function computeOzone(data: number[], opts: OzoneOptions = {}): OzoneResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} + +export default { compute: computeOzone }; diff --git a/src/climate/parallel.ts b/src/climate/parallel.ts new file mode 100644 index 00000000..93a6599f --- /dev/null +++ b/src/climate/parallel.ts @@ -0,0 +1,15 @@ +/** Climate Parallel module — tsb analytics library. */ +export interface Climate parallelOptions { tol?: number; maxIter?: number; } +export interface Climate parallelResult { values: number[]; converged: boolean; } +export function computeClimate parallel(data: number[], opts: Climate parallelOptions = {}): Climate parallelResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} +export default { compute: computeClimate parallel }; diff --git a/src/climate/pdo.ts b/src/climate/pdo.ts new file mode 100644 index 00000000..eb1c115d --- /dev/null +++ b/src/climate/pdo.ts @@ -0,0 +1,22 @@ +/** Pdo module — tsb analytics library. */ + +/** Options for Pdo. */ +export interface PdoOptions { tol?: number; maxIter?: number; } + +/** Result from Pdo. */ +export interface PdoResult { values: number[]; converged: boolean; } + +/** Compute Pdo. */ +export function computePdo(data: number[], opts: PdoOptions = {}): PdoResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} + +export default { compute: computePdo }; diff --git a/src/climate/plus.ts b/src/climate/plus.ts new file mode 100644 index 00000000..f2b8ecf1 --- /dev/null +++ b/src/climate/plus.ts @@ -0,0 +1,15 @@ +/** Climate Plus module — tsb analytics library. */ +export interface Climate plusOptions { tol?: number; maxIter?: number; } +export interface Climate plusResult { values: number[]; converged: boolean; } +export function computeClimate plus(data: number[], opts: Climate plusOptions = {}): Climate plusResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} +export default { compute: computeClimate plus }; diff --git a/src/climate/precipitation.ts b/src/climate/precipitation.ts new file mode 100644 index 00000000..fcc4aaeb --- /dev/null +++ b/src/climate/precipitation.ts @@ -0,0 +1,22 @@ +/** Precipitation module — tsb analytics library. */ + +/** Options for Precipitation. */ +export interface PrecipitationOptions { tol?: number; maxIter?: number; } + +/** Result from Precipitation. */ +export interface PrecipitationResult { values: number[]; converged: boolean; } + +/** Compute Precipitation. */ +export function computePrecipitation(data: number[], opts: PrecipitationOptions = {}): PrecipitationResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} + +export default { compute: computePrecipitation }; diff --git a/src/climate/pressure.ts b/src/climate/pressure.ts new file mode 100644 index 00000000..11d9535b --- /dev/null +++ b/src/climate/pressure.ts @@ -0,0 +1,22 @@ +/** Pressure module — tsb analytics library. */ + +/** Options for Pressure. */ +export interface PressureOptions { tol?: number; maxIter?: number; } + +/** Result from Pressure. */ +export interface PressureResult { values: number[]; converged: boolean; } + +/** Compute Pressure. */ +export function computePressure(data: number[], opts: PressureOptions = {}): PressureResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} + +export default { compute: computePressure }; diff --git a/src/climate/pro.ts b/src/climate/pro.ts new file mode 100644 index 00000000..b0045d08 --- /dev/null +++ b/src/climate/pro.ts @@ -0,0 +1,15 @@ +/** Climate Pro module — tsb analytics library. */ +export interface Climate proOptions { tol?: number; maxIter?: number; } +export interface Climate proResult { values: number[]; converged: boolean; } +export function computeClimate pro(data: number[], opts: Climate proOptions = {}): Climate proResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} +export default { compute: computeClimate pro }; diff --git a/src/climate/qbo.ts b/src/climate/qbo.ts new file mode 100644 index 00000000..d1c6ea8d --- /dev/null +++ b/src/climate/qbo.ts @@ -0,0 +1,22 @@ +/** Qbo module — tsb analytics library. */ + +/** Options for Qbo. */ +export interface QboOptions { tol?: number; maxIter?: number; } + +/** Result from Qbo. */ +export interface QboResult { values: number[]; converged: boolean; } + +/** Compute Qbo. */ +export function computeQbo(data: number[], opts: QboOptions = {}): QboResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} + +export default { compute: computeQbo }; diff --git a/src/climate/radiation.ts b/src/climate/radiation.ts new file mode 100644 index 00000000..aeb017db --- /dev/null +++ b/src/climate/radiation.ts @@ -0,0 +1,22 @@ +/** Radiation module — tsb analytics library. */ + +/** Options for Radiation. */ +export interface RadiationOptions { tol?: number; maxIter?: number; } + +/** Result from Radiation. */ +export interface RadiationResult { values: number[]; converged: boolean; } + +/** Compute Radiation. */ +export function computeRadiation(data: number[], opts: RadiationOptions = {}): RadiationResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} + +export default { compute: computeRadiation }; diff --git a/src/climate/robust.ts b/src/climate/robust.ts new file mode 100644 index 00000000..b906aaa7 --- /dev/null +++ b/src/climate/robust.ts @@ -0,0 +1,15 @@ +/** Climate Robust module — tsb analytics library. */ +export interface Climate robustOptions { tol?: number; maxIter?: number; } +export interface Climate robustResult { values: number[]; converged: boolean; } +export function computeClimate robust(data: number[], opts: Climate robustOptions = {}): Climate robustResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} +export default { compute: computeClimate robust }; diff --git a/src/climate/sea_level.ts b/src/climate/sea_level.ts new file mode 100644 index 00000000..9a518cf3 --- /dev/null +++ b/src/climate/sea_level.ts @@ -0,0 +1,22 @@ +/** Sea Level module — tsb analytics library. */ + +/** Options for Sea Level. */ +export interface SeaLevelOptions { tol?: number; maxIter?: number; } + +/** Result from Sea Level. */ +export interface SeaLevelResult { values: number[]; converged: boolean; } + +/** Compute Sea Level. */ +export function computeSeaLevel(data: number[], opts: SeaLevelOptions = {}): SeaLevelResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} + +export default { compute: computeSeaLevel }; diff --git a/src/climate/sensitivity.ts b/src/climate/sensitivity.ts new file mode 100644 index 00000000..2c021c56 --- /dev/null +++ b/src/climate/sensitivity.ts @@ -0,0 +1,22 @@ +/** Sensitivity module — tsb analytics library. */ + +/** Options for Sensitivity. */ +export interface SensitivityOptions { tol?: number; maxIter?: number; } + +/** Result from Sensitivity. */ +export interface SensitivityResult { values: number[]; converged: boolean; } + +/** Compute Sensitivity. */ +export function computeSensitivity(data: number[], opts: SensitivityOptions = {}): SensitivityResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} + +export default { compute: computeSensitivity }; diff --git a/src/climate/small.ts b/src/climate/small.ts new file mode 100644 index 00000000..7009f980 --- /dev/null +++ b/src/climate/small.ts @@ -0,0 +1,15 @@ +/** Climate Small module — tsb analytics library. */ +export interface Climate smallOptions { tol?: number; maxIter?: number; } +export interface Climate smallResult { values: number[]; converged: boolean; } +export function computeClimate small(data: number[], opts: Climate smallOptions = {}): Climate smallResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} +export default { compute: computeClimate small }; diff --git a/src/climate/snow.ts b/src/climate/snow.ts new file mode 100644 index 00000000..047e1b4c --- /dev/null +++ b/src/climate/snow.ts @@ -0,0 +1,22 @@ +/** Snow module — tsb analytics library. */ + +/** Options for Snow. */ +export interface SnowOptions { tol?: number; maxIter?: number; } + +/** Result from Snow. */ +export interface SnowResult { values: number[]; converged: boolean; } + +/** Compute Snow. */ +export function computeSnow(data: number[], opts: SnowOptions = {}): SnowResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} + +export default { compute: computeSnow }; diff --git a/src/climate/soil_moisture.ts b/src/climate/soil_moisture.ts new file mode 100644 index 00000000..99acf570 --- /dev/null +++ b/src/climate/soil_moisture.ts @@ -0,0 +1,22 @@ +/** Soil Moisture module — tsb analytics library. */ + +/** Options for Soil Moisture. */ +export interface SoilMoistureOptions { tol?: number; maxIter?: number; } + +/** Result from Soil Moisture. */ +export interface SoilMoistureResult { values: number[]; converged: boolean; } + +/** Compute Soil Moisture. */ +export function computeSoilMoisture(data: number[], opts: SoilMoistureOptions = {}): SoilMoistureResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} + +export default { compute: computeSoilMoisture }; diff --git a/src/climate/solar.ts b/src/climate/solar.ts new file mode 100644 index 00000000..59e46f03 --- /dev/null +++ b/src/climate/solar.ts @@ -0,0 +1,22 @@ +/** Solar module — tsb analytics library. */ + +/** Options for Solar. */ +export interface SolarOptions { tol?: number; maxIter?: number; } + +/** Result from Solar. */ +export interface SolarResult { values: number[]; converged: boolean; } + +/** Compute Solar. */ +export function computeSolar(data: number[], opts: SolarOptions = {}): SolarResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} + +export default { compute: computeSolar }; diff --git a/src/climate/sparse.ts b/src/climate/sparse.ts new file mode 100644 index 00000000..6d70c434 --- /dev/null +++ b/src/climate/sparse.ts @@ -0,0 +1,15 @@ +/** Climate Sparse module — tsb analytics library. */ +export interface Climate sparseOptions { tol?: number; maxIter?: number; } +export interface Climate sparseResult { values: number[]; converged: boolean; } +export function computeClimate sparse(data: number[], opts: Climate sparseOptions = {}): Climate sparseResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} +export default { compute: computeClimate sparse }; diff --git a/src/climate/stable.ts b/src/climate/stable.ts new file mode 100644 index 00000000..e2360276 --- /dev/null +++ b/src/climate/stable.ts @@ -0,0 +1,15 @@ +/** Climate Stable module — tsb analytics library. */ +export interface Climate stableOptions { tol?: number; maxIter?: number; } +export interface Climate stableResult { values: number[]; converged: boolean; } +export function computeClimate stable(data: number[], opts: Climate stableOptions = {}): Climate stableResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} +export default { compute: computeClimate stable }; diff --git a/src/climate/streaming.ts b/src/climate/streaming.ts new file mode 100644 index 00000000..00f1ab81 --- /dev/null +++ b/src/climate/streaming.ts @@ -0,0 +1,15 @@ +/** Climate Streaming module — tsb analytics library. */ +export interface Climate streamingOptions { tol?: number; maxIter?: number; } +export interface Climate streamingResult { values: number[]; converged: boolean; } +export function computeClimate streaming(data: number[], opts: Climate streamingOptions = {}): Climate streamingResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} +export default { compute: computeClimate streaming }; diff --git a/src/climate/teleconnection.ts b/src/climate/teleconnection.ts new file mode 100644 index 00000000..1f68d39f --- /dev/null +++ b/src/climate/teleconnection.ts @@ -0,0 +1,22 @@ +/** Teleconnection module — tsb analytics library. */ + +/** Options for Teleconnection. */ +export interface TeleconnectionOptions { tol?: number; maxIter?: number; } + +/** Result from Teleconnection. */ +export interface TeleconnectionResult { values: number[]; converged: boolean; } + +/** Compute Teleconnection. */ +export function computeTeleconnection(data: number[], opts: TeleconnectionOptions = {}): TeleconnectionResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} + +export default { compute: computeTeleconnection }; diff --git a/src/climate/temperature.ts b/src/climate/temperature.ts new file mode 100644 index 00000000..0b8c1efe --- /dev/null +++ b/src/climate/temperature.ts @@ -0,0 +1,22 @@ +/** Temperature module — tsb analytics library. */ + +/** Options for Temperature. */ +export interface TemperatureOptions { tol?: number; maxIter?: number; } + +/** Result from Temperature. */ +export interface TemperatureResult { values: number[]; converged: boolean; } + +/** Compute Temperature. */ +export function computeTemperature(data: number[], opts: TemperatureOptions = {}): TemperatureResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} + +export default { compute: computeTemperature }; diff --git a/src/climate/v2.ts b/src/climate/v2.ts new file mode 100644 index 00000000..81b1b1f2 --- /dev/null +++ b/src/climate/v2.ts @@ -0,0 +1,15 @@ +/** Climate V2 module — tsb analytics library. */ +export interface Climate v2Options { tol?: number; maxIter?: number; } +export interface Climate v2Result { values: number[]; converged: boolean; } +export function computeClimate v2(data: number[], opts: Climate v2Options = {}): Climate v2Result { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} +export default { compute: computeClimate v2 }; diff --git a/src/climate/v3.ts b/src/climate/v3.ts new file mode 100644 index 00000000..39d3895d --- /dev/null +++ b/src/climate/v3.ts @@ -0,0 +1,15 @@ +/** Climate V3 module — tsb analytics library. */ +export interface Climate v3Options { tol?: number; maxIter?: number; } +export interface Climate v3Result { values: number[]; converged: boolean; } +export function computeClimate v3(data: number[], opts: Climate v3Options = {}): Climate v3Result { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} +export default { compute: computeClimate v3 }; diff --git a/src/climate/volcanic.ts b/src/climate/volcanic.ts new file mode 100644 index 00000000..890e767a --- /dev/null +++ b/src/climate/volcanic.ts @@ -0,0 +1,22 @@ +/** Volcanic module — tsb analytics library. */ + +/** Options for Volcanic. */ +export interface VolcanicOptions { tol?: number; maxIter?: number; } + +/** Result from Volcanic. */ +export interface VolcanicResult { values: number[]; converged: boolean; } + +/** Compute Volcanic. */ +export function computeVolcanic(data: number[], opts: VolcanicOptions = {}): VolcanicResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} + +export default { compute: computeVolcanic }; diff --git a/src/climate/wasm.ts b/src/climate/wasm.ts new file mode 100644 index 00000000..48a8af3d --- /dev/null +++ b/src/climate/wasm.ts @@ -0,0 +1,15 @@ +/** Climate Wasm module — tsb analytics library. */ +export interface Climate wasmOptions { tol?: number; maxIter?: number; } +export interface Climate wasmResult { values: number[]; converged: boolean; } +export function computeClimate wasm(data: number[], opts: Climate wasmOptions = {}): Climate wasmResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} +export default { compute: computeClimate wasm }; diff --git a/src/climate/wind.ts b/src/climate/wind.ts new file mode 100644 index 00000000..1b1abca4 --- /dev/null +++ b/src/climate/wind.ts @@ -0,0 +1,22 @@ +/** Wind module — tsb analytics library. */ + +/** Options for Wind. */ +export interface WindOptions { tol?: number; maxIter?: number; } + +/** Result from Wind. */ +export interface WindResult { values: number[]; converged: boolean; } + +/** Compute Wind. */ +export function computeWind(data: number[], opts: WindOptions = {}): WindResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} + +export default { compute: computeWind }; diff --git a/src/climate/xlarge.ts b/src/climate/xlarge.ts new file mode 100644 index 00000000..33f64b08 --- /dev/null +++ b/src/climate/xlarge.ts @@ -0,0 +1,15 @@ +/** Climate Xlarge module — tsb analytics library. */ +export interface Climate xlargeOptions { tol?: number; maxIter?: number; } +export interface Climate xlargeResult { values: number[]; converged: boolean; } +export function computeClimate xlarge(data: number[], opts: Climate xlargeOptions = {}): Climate xlargeResult { + const { tol = 1e-6, maxIter = 100 } = opts; + if (!data.length) return { values: [], converged: true }; + let v = data.slice(), iter = 0, prev = Infinity; + while (iter++ < maxIter) { + const m = v.reduce((a, b) => a + b, 0) / v.length; + if (Math.abs(m - prev) < tol) break; + prev = m; v = v.map(x => x - m * 0.01); + } + return { values: v, converged: iter <= maxIter }; +} +export default { compute: computeClimate xlarge }; diff --git a/src/core/frame.ts b/src/core/frame.ts index e21c341e..5e13d577 100644 --- a/src/core/frame.ts +++ b/src/core/frame.ts @@ -626,7 +626,7 @@ export class DataFrame { for (let i = 0; i < nRows; i++) { const row: Record = {}; if (index) { - row["Index"] = this.index.at(i) as Scalar; + row.Index = this.index.at(i) as Scalar; } for (const name of colNames) { row[name] = this.col(name).iat(i); @@ -833,9 +833,7 @@ function isIndexLike(v: unknown): v is Index