wsiegenthaler / lobos

A Sobol sequence generator for Scala and Javascript

GitHub

lobos

Build Status npm version License

A Sobol sequence generator for Scala and Javascript

lobos provides Sobol low-discrepancy quasirandom sequences which are useful for integration and other tasks. The sequence can cover a domain evenly with as little as a few points and will continue to progressively fill the space as more points are added.

For efficiency, lobos employs the recursive variant of the gray code optimization proposed by Antonov-Saleev. Initialization values supporting up to 21,201 dimensions are provided courtesy of Stephen Joe and Frances Kuo (found here).

Below are examples of 2-dimensional points drawn from Sobol and Uniform generators respectively. See the full animated visualization here.

Sobol Uniform

Usage

Each n-dimensional point in the sequence contains values between [0,1). The sequence constructor optionally allows for user-provided initialization parameters as well as a way to cap sequence resolution to improve performance when the number of points needed is known in advance (see params and resolution options).

Scala

Add lobos to your sbt dependencies:

libraryDependencies += "com.github.wsiegenthaler" % "lobos_2.13" % "0.10.0"

resolvers += "releases" at "https://oss.sonatype.org/content/repositories/releases"

To obtain the first 10 points from a 3-dimensional sequence:

import lobos.Sobol
import lobos.params.NewJoeKuo21k // initialization params

val sequence = new Sobol(dims=3)
val points = sequence.take(10)

Javascript

lobos is available via npm and should work with webpack/browserify:

npm install --save lobos

For legacy web projects, a standalone version of lobos can be built by following the Javascript build procedure and using js/dist/lobos-standalone.js. This version is also included with the npm module (see node_modules/lobos/js/dist).

To draw from the sequence:

var lobos = require('lobos') // unecessary for standalone version

var dims = 3
var options = { params: 'new-joe-kuo-6.21201', resolution: 32 } // *optional*
var sequence = new lobos.Sobol(dims, options)
var points = sequence.take(10)

To conserve resources in browser environments, the javascript version of lobos defaults to the new-joe-kuo-6.1000 initialization params which only support up to 1000 dimensions. Specify new-joe-kuo-6.21201 for more.

Building

Scala

sbt +lobosJVM/package 

Javascript

npm run build

See js/dist/ for build output:

  • lobos.js - main module
  • lobos-params.js - parameter module
  • lobos-standalone.js - self-contained web-ready with 'lobos' exported as global

Note: Don't forget to npm install javascript dependencies before initial build.

References

License

Everything in this repo is BSD License unless otherwise specified

lobos (c) 2015 Weston Siegenthaler