Dart CI Coverage Status

Bandart (combination of "Bandits" and "Dart") is a library for bandit algorithms in Dart. It provides Bayesian Models for statistical analysis for the data.

Features

  • Bandit algorithms:
    • Fixed Schedule
    • Thompson Sampling
  • Bayesian Models:
    • Beta Model: Approximating success probability using Beta Distributions
    • Gaussian Model: Approximating mean and variance using conjugate priors

Getting started

Install the package using dart pub add bandart. Now you can use

import 'package:bandart/bandart.dart';

Usage

Create A Fixed Schedule

import 'package:bandart/bandart.dart';

int numberOfInterventions = 3;
var policy = FixedPolicy(numberofInterventions);
for (int i = 0; i < 10; i++) {
    print(policy.choseAction({"decisionPoint": i}))
}
// Prints 0, 1, 2, 0, 1, 2, 0, 1, 2, 0

Analyze data using Normal Model

import 'package:bandart/bandart.dart';

var history = DataFrame(
      {'intervention': [0, 0, 1, 1], 'outcome': [1.0, 1.0, 2.0, 2.0]})

// Mean and L are priors for the normal model
var gaussianModel = GaussianModel(
    numberOfInterventions: 2, mean: 1.0, l: 1.0, random: Random(0))

gaussianModel.history = history

// Update the samples
gaussianModel.sample()

print(gaussianModel.maxProbabilities())
// Prints around [0.2, 0.8]

Create an adaptive schedule using Thompson Sampling

import 'package:bandart/bandart.dart';

var history = DataFrame(
      {'intervention': [0, 0, 1, 1], 'outcome': [1.0, 1.0, 2.0, 2.0]})

// Mean and L are priors for the normal model
var gaussianModel = GaussianModel(
    numberOfInterventions: 2, mean: 1.0, l: 1.0, random: Random(0))

var policy = ThompsonSampling(numberOfInterventions: 2);

print(policy.choseAction({}, history));
// Prints either 0 or 1 (randomized), but will more often pick 1 as this is the intervention with the better history

Additional information

Development

Setup

Test can be run with dart test. Some tests need mock code generated by mockito. To update the mock code, run dart run build_runner build.

Goals

  • Performance: Since Dart is most often used for mobile development, the goal of the library is to support calculations fast enough to run on smartphones.
  • Seedability: When seeded with the same seed, the library should always return the same result.
  • Well tested

Libraries

bandart
Library for Bandit Algorithms with underlying Bayesian Models
helpers
Collections of helpful functions to write easier code.