qubo-embedder v1.0.1
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
});