npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

@wlearn/liblinear

v0.1.0

Published

LIBLINEAR v2.50 compiled to WebAssembly -- linear classification and regression in browsers and Node.js

Readme

@wlearn/liblinear

LIBLINEAR v2.50 compiled to WebAssembly. Linear classification and regression in browsers and Node.js.

Based on LIBLINEAR v2.50 (BSD-3-Clause). Zero dependencies. ESM.

Install

npm install @wlearn/liblinear

Quick start

import { LinearModel } from '@wlearn/liblinear'

const model = await LinearModel.create({
  solver: 'L2R_LR',
  C: 1.0
})

// Train -- accepts number[][] or { data: Float64Array, rows, cols }
model.fit(
  [[1, 2], [3, 4], [5, 6], [7, 8]],
  [0, 0, 1, 1]
)

// Predict
const preds = model.predict([[2, 3], [6, 7]])  // Float64Array

// Probabilities (logistic regression solvers only)
const probs = model.predictProba([[2, 3], [6, 7]])  // Float64Array (nrow * nclass)

// Score
const accuracy = model.score([[2, 3], [6, 7]], [0, 1])

// Save / load
const buf = model.save()  // Uint8Array
const model2 = await LinearModel.load(buf)

// Clean up -- required, WASM memory is not garbage collected
model.dispose()
model2.dispose()

Typed matrix input (fast path)

For performance-critical code and AutoML integration, pass typed matrices directly:

const X = {
  data: new Float64Array([1, 2, 3, 4, 5, 6, 7, 8]),
  rows: 4,
  cols: 2
}
const y = new Float64Array([0, 0, 1, 1])

model.fit(X, y)

This avoids the conversion cost of nested arrays.

Input coercion policy

Control how non-typed inputs are handled:

// Default: convert silently
const model = await LinearModel.create({ coerce: 'auto' })

// Warn once per instance when conversion happens
const model = await LinearModel.create({ coerce: 'warn' })

// Throw if input is not already a typed matrix
const model = await LinearModel.create({ coerce: 'error' })

API

LinearModel.create(params?)

Async factory. Loads WASM module, returns a ready-to-use model.

Parameters:

  • solver -- solver type string or number (default: 'L2R_LR')
  • C -- regularization parameter (default: 1.0)
  • eps -- stopping tolerance (default: 0.01)
  • bias -- bias term, < 0 disables (default: -1)
  • p -- epsilon in SVR loss (default: 0.1)
  • coerce -- input coercion: 'auto' | 'warn' | 'error' (default: 'auto')

model.fit(X, y)

Train on data. Returns this for chaining.

  • X -- number[][] or { data: Float64Array, rows, cols }
  • y -- number[] or Float64Array

model.predict(X)

Returns Float64Array of predicted labels.

model.predictProba(X)

Returns Float64Array of shape nrow * nclass (row-major probabilities). Only available for logistic regression solvers (L2R_LR, L1R_LR, L2R_LR_DUAL).

model.decisionFunction(X)

Returns Float64Array of decision values.

model.score(X, y)

Returns accuracy (classification) or R-squared (regression).

model.save()

Returns Uint8Array (native LIBLINEAR model format).

LinearModel.load(buffer)

Loads from Uint8Array. Returns Promise<LinearModel>.

model.dispose()

Free WASM memory. Required. Idempotent.

model.getParams() / model.setParams(p)

Get/set hyperparameters. Enables AutoML grid search and cloning.

LinearModel.defaultSearchSpace()

Returns default hyperparameter search space for AutoML.

Solver types

| Name | Code | Task | |------|------|------| | L2R_LR | 0 | L2-regularized logistic regression | | L2R_L2LOSS_SVC_DUAL | 1 | L2-loss SVM (dual) | | L2R_L2LOSS_SVC | 2 | L2-loss SVM (primal) | | L2R_L1LOSS_SVC_DUAL | 3 | L1-loss SVM (dual) | | MCSVM_CS | 4 | Multi-class SVM (Crammer-Singer) | | L1R_L2LOSS_SVC | 5 | L1-regularized L2-loss SVM | | L1R_LR | 6 | L1-regularized logistic regression | | L2R_LR_DUAL | 7 | L2-regularized logistic regression (dual) | | L2R_L2LOSS_SVR | 11 | L2-loss SVR (primal) | | L2R_L2LOSS_SVR_DUAL | 12 | L2-loss SVR (dual) | | L2R_L1LOSS_SVR_DUAL | 13 | L1-loss SVR (dual) |

Resource management

WASM heap memory is not garbage collected. Call .dispose() on every model when done. A FinalizationRegistry safety net warns if you forget, but do not rely on it.

Build from source

Requires Emscripten (emsdk) activated.

git clone --recurse-submodules https://github.com/wlearn-org/liblinear-wasm
cd liblinear-wasm
npm run build
npm test

If you already cloned without --recurse-submodules:

git submodule update --init

License

BSD-3-Clause (same as upstream LIBLINEAR)