1.0.1 • Published 1 year ago

qubo-embedder v1.0.1

Weekly downloads
-
License
ISC
Repository
github
Last release
1 year ago

An unofficial library to embed and send optimization (QUBO, Ising) problems to DWave System quantum annealing solvers. A native Dart equivalent to the Ocean SDK.


Usage

Solving QUBO problems is handled by the Solver class which has different modes. Assuming you have your data prepared, it's relatively easy to get your solutions:

Send to remote DWave annealer solver

COMING SOON!

Sample using local simulator

import { Solver, Qubo } from 'qubo-embedder';

const qubo = new Qubo(2);
qubo.addEntry(0, 0, 2.0);
qubo.addEntry(1, 1, 2.0);
qubo.addEntry(0, 1, -2.0);

Solver.simulator().sampleQubo(qubo, 5).then(solutionRecord => {
    console.log(solutionRecord.toString());
});

Data structures

You can format your problems using built-in data types. These use mathjs internally to provide fast and efficient handling of linear algebra types and operations, especially in the Solver.simulator() solver.

Qubo

Add the coefficients of your QUBO-problems using the indices of the affected variables (beginning at 0).

import { Qubo } from 'qubo-embedder';

const qubo = new Qubo(2);

qubo.addEntry(0, 0, 2.0);
qubo.addEntry(1, 1, 2.0);
qubo.addEntry(0, 1, -2.0);
// qubo.addEntry(1, 0, 2.0) throws an InvalidOperationException

console.log(qubo.getEntry(0, 1)); // -2.0
console.log(qubo.toString()); // [qubits: 2] {(0, 0): 2.0, (0, 1): -2.0, (1, 1): 2.0}

Hamiltonian

If you're done, you can transform Qubo objects to Hamiltonian which the samplers take as an input.

import { Qubo, Hamiltonian } from 'qubo-embedder';

const qubo = new Qubo(2);
qubo.addEntry(0, 0, 2.0);
qubo.addEntry(1, 1, 2.0);
qubo.addEntry(0, 1, -2.0);

const hamiltonian = Hamiltonian.fromQubo(qubo);

console.log(hamiltonian.matrix); // [[2.0, -2.0], [0.0, 2.0]]

SolutionVector

This type you seldom have to create for yourself, but is used by the solvers to return the solutions to a QUBO problem. A solution vector is immutable, but can be transformed into a regular list.

import { SolutionVector } from 'qubo-embedder';

const solutionVector = SolutionVector.fromList([0, 1]);

console.log(solutionVector.vector); // [0, 1]
console.log(solutionVector.toString()); // [q0: 0, q1: 1]

SolutionRecord

Sampler store their solutions as entries in this record, which you can get by entries() and iterate over for solution details. When returned by a sampler, the entries are sorted by energy in ascending order.

import { Qubo, Solver, SolutionRecord } from 'qubo-embedder';

const qubo = new Qubo(2);
qubo.addEntry(0, 0, 2.0);
qubo.addEntry(1, 1, 2.0);
qubo.addEntry(0, 1, -2.0);

Solver.simulator().sampleQubo(qubo).then(solutionRecord => {
    for (const entry of solutionRecord.entries()) {
        console.log(`E=${entry.energy}\t${entry.solutionVector}\tx${entry.numOccurrences}`);
    } 
    //E=0     [q0: 0, q1: 0, ]        x1
    //E=2     [q0: 0, q1: 1, ]        x1

    console.log(solutionRecord.toString());
    //   energy       sample  occurrences
    //(1) 0   [q0: 0, q1: 0, ]        x1
    //(2) 2   [q0: 0, q1: 1, ]        x1
});
1.0.1

1 year ago

1.0.0

1 year ago